假设我正在使用来自Python的Urllib2库从服务器中检索Urls列表。我注意到一页花了大约5秒钟,完成我要收集的所有页面也花费了很长时间。

我正在考虑那5秒。大多数时间都用在服务器端,我想知道我是否可以开始使用线程库。在这种情况下说5个线程,则平均时间可能会大大增加。每页可能需要1或2秒。 (可能会使服务器有点忙)。我如何优化线程数,这样才能获得合法的速度,而又不会太用力地推服务器。

谢谢!

更新:
我一一增加了线程数,并监视了抓取100个URL所花费的总时间(单位:分钟)。结果表明,将线程数更改为2时,总时间显着减少,并且随着线程数的增加,总时间不断减少,但是由线程引起的“改进”变得越来越不明显了。 (当您建立过多线程时,总时间甚至显示反弹)
我知道这只是我收获的Web服务器的一种特殊情况,但我决定分享只是为了展示线程的功能,希望有一天对某人有所帮助。

最佳答案

您可以做几件事。如果URL在不同的域中,则可以将工作散布到线程中,每个线程都从不同的域下载页面。

如果您所有的URL都指向同一台服务器,并且您不希望对服务器施加压力,则只需按顺序检索这些URL即可。如果服务器对几个并行请求感到满意,则可以查看pools of workers。例如,您可以启动一个由四个工作人员组成的池,然后将您的所有URL添加到队列中,这些工作人员将从队列中提取新的URL。

由于您也用“屏幕抓取”标记了问题,因此scrapy是专用的抓取框架,可以使用in parallel

Python 3在concurrent.futures下附带了一组新的内置并发原语。

关于python - Python Urllib UrlOpen读取,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18773691/

10-09 08:48
查看更多