10

正在寻找用python编写一个小的网络爬虫。我开始研究将其编写为多线程脚本,一个线程池下载和一个池处理结果。由于 GIL,它实际上会同时下载吗?GIL 如何影响网络爬虫?每个线程会从套接字中提取一些数据,然后转到下一个线程,让它从套接字中提取一些数据,等等……?

基本上我要问的是,在 python 中做一个多线程爬虫真的会给我带来比单线程更多的性能吗?

谢谢!

4

5 回答 5

8

在进行网络操作时,Python 解释器不会持有 GIL。如果您正在从事网络绑定的工作(如爬虫),您可以放心地忽略 GIL 的影响。

另一方面,如果您创建大量线程进行处理(下载后),您可能想要衡量您的性能。限制那里的线程数将减少 GIL 对性能的影响。

于 2010-05-13T23:08:53.850 回答
6

看看scrapy是如何工作的。它可以帮助你很多。它不使用线程,但可以在同一个线程中进行多个“同时”下载。

如果你仔细想想,你只有一个网卡,所以从定义上讲并行处理并不能真正提供帮助。

scrapy 所做的只是在发送另一个请求之前不等待一个请求的响应。全部在一个线程中。

于 2010-05-13T23:16:30.133 回答
1

另一个考虑因素:如果您正在抓取单个网站并且服务器对您可以从您的 IP 地址发送的请求的频率进行了限制,那么添加多个线程可能没有任何区别。

于 2010-05-13T23:18:46.870 回答
1

当涉及到爬网时,最好使用基于事件的东西,例如Twisted,它使用非阻塞异步套接字操作来获取和返回数据,而不是阻塞每个操作。

异步网络操作很容易并且通常是单线程的。网络 I/O 几乎总是比 CPU 具有更高的延迟,因为您真的不知道返回页面需要多长时间,而这正是异步大放异彩的地方,因为异步操作比线程轻得多。

编辑:这是一个简单的例子,说明如何使用 Twisted 的 getPage 创建一个简单的网络爬虫。

于 2010-05-13T23:19:51.737 回答
0

是的,多线程抓取显着提高了处理速度。这不是 GIL 成为问题的情况。您正在失去大量空闲 CPU 和未使用的带宽以等待请求完成。如果您正在抓取的网页在您的本地网络中(一种罕见的抓取情况),那么多线程和单线程抓取之间的差异可能会更小。

您可以使用一到“n”个线程自己尝试基准测试。我写了一个关于发现 Web 资源的简单多线程爬虫,我写了一篇关于自动发现博客订阅源和 Twitter、Facebook、LinkedIn 帐户连接到商业网站的相关文章。您可以选择使用多少线程来更改 FocusedWebCrawler 中的 NWORKERS 类变量。

于 2012-10-25T17:54:08.563 回答