Python Urllib UrlOpen 读取

标签 python multithreading screen-scraping urllib

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

这 5 秒钟我正在思考。大部分时间都消耗在服务器端,我想知道我是否可以开始使用线程库。在本例中假设有 5 个线程,那么平均时间可能会显着增加。每页可能有 1 或 2 秒。 (可能会让服务器有点忙)。我如何优化线程数量,以便获得合法的速度而不会对服务器造成太大压力。

谢谢!

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

enter image description here

最佳答案

您可以做一些事情。如果 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/

相关文章:

Python:语句中使用的循环变量未更新

multithreading - 如何在线程之间可变地共享 i32?

python - 如何使用python转换csv文件中文件夹中的多个xml文件?

python - 将httpie post请求转换为python requests库

node.js - Expressjs多线程

python - 使用python从Instagram收集用户信息

Node.js:代理站点如何处理相对 URL?

java - 如何使用 Java 从网站中提取受登录保护的数据?

python - pytorch.empty 函数中未初始化的数据是什么

python asyncio REST api 调用给出错误