2

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

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

谢谢!

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

在此处输入图像描述

4

2 回答 2

2

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

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

由于您也用“屏幕抓取”标记了这个问题,scrapy是一个专用的抓取框架,可以并行工作。

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

于 2013-09-12T20:31:13.333 回答
0

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

于 2013-09-12T22:09:00.893 回答