Python Urllib UrlOpen Read

Python Urllib UrlOpen Read,python,multithreading,screen-scraping,urllib,Python,Multithreading,Screen Scraping,Urllib,假设我正在使用Python中的Urllib2库从服务器检索URL列表。我注意到,获取一页大约需要5秒钟,完成所有我想收集的页面需要很长时间 我在想那5秒钟。大部分时间是在服务器端消耗的,我想知道我是否可以开始使用线程库。假设在这种情况下有5个线程,那么平均时间可能会显著增加。每一页大概有1到2秒钟。(可能会使服务器有点忙)。我如何优化线程的数量,这样我就可以获得合法的速度,而不必太用力地推服务器 谢谢 更新: 我一个接一个地增加线程的数量,并监控刮取100个URL所花费的总时间(单位:分钟)。结

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

我在想那5秒钟。大部分时间是在服务器端消耗的,我想知道我是否可以开始使用线程库。假设在这种情况下有5个线程,那么平均时间可能会显著增加。每一页大概有1到2秒钟。(可能会使服务器有点忙)。我如何优化线程的数量,这样我就可以获得合法的速度,而不必太用力地推服务器

谢谢

更新: 我一个接一个地增加线程的数量,并监控刮取100个URL所花费的总时间(单位:分钟)。结果表明,当线程数更改为2时,总时间显著减少,并随着线程数的增加而不断减少,但线程带来的“改善”越来越不明显。(当您构建太多线程时,总时间甚至会显示反弹) 我知道这只是我收获的web服务器的一个特定案例,但我决定与大家分享,只是为了展示线程的威力,并希望有一天会对某些人有所帮助


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

如果您的URL都指向同一个服务器,并且您不想对服务器施加压力,那么您可以按顺序检索URL。如果服务器对两个并行请求感到满意,则可以查看。您可以开始,比如说一个由四个工作人员组成的池,然后将您的所有URL添加到一个队列中,工作人员将从该队列中提取新的URL

因为您也用“屏幕抓取”标记了问题,所以有一个专用的抓取框架可以工作


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

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

实际上,它都指向同一台服务器,我不太确定在这种情况下,线程包和多处理包之间的真正区别是什么。“多处理包提供本地和远程并发,通过使用子进程而不是线程,有效地避开了全局解释器锁。因此,多处理模块允许程序员充分利用给定机器上的多个处理器”。这是否意味着python实际上只使用一个处理器,或者……在IO绑定的情况下,您可以同时使用这两个处理器。对于CPU受限的任务,多处理将利用所有可用的内核,而线程将在单个内核上运行,这是由于内存不足。我做了一个小实验,记录了使用不同线程数刮取100个URL的总时间。结果非常有趣,我会尝试一下多处理库,然后更新我的帖子。非常感谢你的解释。