我应该能够同时打开多少Java HttpURLConnections?
我正在编写一个多线程Java web爬虫。根据我对web的理解,当用户加载网页时,浏览器会请求第一个文档(例如index.html),当收到html时,它会找到需要包含的其他资源(图像、CSS、JS),并同时请求这些资源我应该能够同时打开多少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异常。你知道发生了什么吗?看看你的代码是个好主意,因为
我的爬虫程序只请求原始文档。出于某种原因,我不能让它每5秒刮取超过2到5页。我正在为我正在进行的每个httpurl连接创建一个新线程。看起来我应该能够每秒至少抓取20-40页。如果我尝试启动100个线程,我会疯狂地遇到I/O异常。你知道发生了什么吗?看看你的代码是个好主意,因为你可能做了一些轻微的错误,这会破坏你的爬虫程序,但是作为一般的经验法则,异步IO远远优于HttpURLConnection提供的阻塞IO。异步IO允许您在单个线程中处理所有处理,所有实际IO由操作系统在自己的时间内完成
要在异步IO上实现HTTP协议,请参阅。查看这样一个客户机的示例。关于您收到的IOException类型的详细信息可能很方便。有一些可能性可以考虑。
- 超出打开的文件描述符限制(套接字太多)
- 由于打开到给定服务器的太多连接而拒绝连接
- 在能够处理任何数据之前获取太多数据(假设它阻止IO-如果您向100个不同的服务器发出100个请求,您会突然收到大量数据-HTTP get请求很小-响应可能不是。您可以自己有效地进行DDoS攻击)
- 您在代码中犯了一个愚蠢的错误:)
- 如果你对一个你不是所有者的外部网站进行爬网,你应该只使用一个线程并延迟。在另一种情况下,网站可以检测到DOS攻击。在这段时间里抓取不同的网站是有意义的
- 如果它是你自己的网站,没有DOS检测,那么它取决于网络延迟。如果您的局域网中有web服务器,那么使用双倍的CPU内核会很有帮助。如果web服务器位于Internet上,那么使用更多线程可能会有所帮助。但我认为100条线太大了。这可能会破坏您的web服务器。web服务器有多少工作人员
- 线程或httpurl连接的最佳计数取决于许多因素