假设我正在使用 Python 中的 Urllib2 库从服务器检索 URL 列表。我注意到获取一页大约需要 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 Urllib UrlOpen 读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18773691/