我应该能够同时打开多少Java HttpURLConnections?

我应该能够同时打开多少Java HttpURLConnections?,java,web-crawler,screen-scraping,Java,Web Crawler,Screen Scraping,我正在编写一个多线程Java web爬虫。根据我对web的理解,当用户加载网页时,浏览器会请求第一个文档(例如index.html),当收到html时,它会找到需要包含的其他资源(图像、CSS、JS),并同时请求这些资源 我的爬虫程序只请求原始文档。出于某种原因,我不能让它每5秒刮取超过2到5页。我正在为我正在进行的每个httpurl连接创建一个新线程。看起来我应该能够每秒至少抓取20-40页。如果我尝试启动100个线程,我会疯狂地遇到I/O异常。你知道发生了什么吗?看看你的代码是个好主意,因为

我正在编写一个多线程Java web爬虫。根据我对web的理解,当用户加载网页时,浏览器会请求第一个文档(例如index.html),当收到html时,它会找到需要包含的其他资源(图像、CSS、JS),并同时请求这些资源


我的爬虫程序只请求原始文档。出于某种原因,我不能让它每5秒刮取超过2到5页。我正在为我正在进行的每个httpurl连接创建一个新线程。看起来我应该能够每秒至少抓取20-40页。如果我尝试启动100个线程,我会疯狂地遇到I/O异常。你知道发生了什么吗?

看看你的代码是个好主意,因为你可能做了一些轻微的错误,这会破坏你的爬虫程序,但是作为一般的经验法则,异步IO远远优于HttpURLConnection提供的阻塞IO。异步IO允许您在单个线程中处理所有处理,所有实际IO由操作系统在自己的时间内完成


要在异步IO上实现HTTP协议,请参阅。查看这样一个客户机的示例。

关于您收到的IOException类型的详细信息可能很方便。有一些可能性可以考虑。

  • 超出打开的文件描述符限制(套接字太多)
  • 由于打开到给定服务器的太多连接而拒绝连接
  • 在能够处理任何数据之前获取太多数据(假设它阻止IO-如果您向100个不同的服务器发出100个请求,您会突然收到大量数据-HTTP get请求很小-响应可能不是。您可以自己有效地进行DDoS攻击)
  • 您在代码中犯了一个愚蠢的错误:)

    • 线程或httpurl连接的最佳计数取决于许多因素

      • 如果你对一个你不是所有者的外部网站进行爬网,你应该只使用一个线程并延迟。在另一种情况下,网站可以检测到DOS攻击。在这段时间里抓取不同的网站是有意义的
      • 如果它是你自己的网站,没有DOS检测,那么它取决于网络延迟。如果您的局域网中有web服务器,那么使用双倍的CPU内核会很有帮助。如果web服务器位于Internet上,那么使用更多线程可能会有所帮助。但我认为100条线太大了。这可能会破坏您的web服务器。web服务器有多少工作人员

      哦,我希望您正在关闭从连接中获得的输入流。无论如何,它们都会在连接的终结器中关闭,但这可能需要几秒钟的时间。我自己也遇到过这个问题,所以这可能会对您有所帮助。

      考虑到许多服务器对同一IP的访问设置了限制。这是爬虫程序的标准做法,在请求之间至少等待半秒或一秒。还要检查Heritrix,archive.org的爬虫程序。它是开源的,用Java编写。很好。