Python Urllib UrlOpen阅读

时间:2013-09-12 20:23:50

标签: python multithreading screen-scraping urllib

假设我正在使用Python中的Urllib2库从服务器中检索Url列表。我注意到需要大约5秒才能获得一页,这需要很长时间才能完成我想要收集的所有页面。

我正在考虑那5秒钟。大部分时间都是在服务器端消耗的,我想知道我是否可以开始使用线程库。在这种情况下说5个线程,然后平均时间可以大大增加。每页可能需要1或2秒。 (可能会使服务器有点繁忙)。我怎么能优化线程的数量,这样我才能获得合法的速度,而不是太过努力推动服务器。

谢谢!

更新: 我逐个增加了线程数,并监控了用于刮取100个URL的总时间(单位:分钟)。事实证明,当您将线程数更改为2时,总时间会急剧减少,并且随着线程数量的增加而不断减少,但线程引起的“改进”变得越来越不明显。 (当你构建太多线程时,总时间甚至会显示反弹) 我知道这只是我收获的网络服务器的一个特例,但我决定分享只是为了展示线程的力量,希望有一天会对某人有所帮助。

enter image description here

2 个答案:

答案 0 :(得分:2)

您可以做一些事情。如果URL位于不同的域上,那么您可能只是将工作分散到线程,每个线程都从不同的域下载页面。

如果您的网址都指向同一台服务器并且您不希望给服务器带来压力,那么您可以按顺序检索网址。如果服务器对几个并行请求感到满意,您可以查看pools of workers。你可以开始说一个由四个工作人员组成的池,并将你所有的URL添加到队列中,工作人员将从中抽取新的URL。

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

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

答案 1 :(得分:0)

这是一个警告。我遇到过一些服务器,这些服务器由IIS的“老版”版本提供支持。如果请求之间没有一秒钟的延迟,它们通常不会为请求提供服务。