正在寻找用python编写一个小的网络爬虫。我开始研究将其编写为多线程脚本,一个线程池下载和一个池处理结果。由于 GIL,它实际上会同时下载吗?GIL 如何影响网络爬虫?每个线程会从套接字中提取一些数据,然后转到下一个线程,让它从套接字中提取一些数据,等等……?
基本上我要问的是,在 python 中做一个多线程爬虫真的会给我带来比单线程更多的性能吗?
谢谢!
正在寻找用python编写一个小的网络爬虫。我开始研究将其编写为多线程脚本,一个线程池下载和一个池处理结果。由于 GIL,它实际上会同时下载吗?GIL 如何影响网络爬虫?每个线程会从套接字中提取一些数据,然后转到下一个线程,让它从套接字中提取一些数据,等等……?
基本上我要问的是,在 python 中做一个多线程爬虫真的会给我带来比单线程更多的性能吗?
谢谢!
在进行网络操作时,Python 解释器不会持有 GIL。如果您正在从事网络绑定的工作(如爬虫),您可以放心地忽略 GIL 的影响。
另一方面,如果您创建大量线程进行处理(下载后),您可能想要衡量您的性能。限制那里的线程数将减少 GIL 对性能的影响。
看看scrapy是如何工作的。它可以帮助你很多。它不使用线程,但可以在同一个线程中进行多个“同时”下载。
如果你仔细想想,你只有一个网卡,所以从定义上讲并行处理并不能真正提供帮助。
scrapy 所做的只是在发送另一个请求之前不等待一个请求的响应。全部在一个线程中。
另一个考虑因素:如果您正在抓取单个网站并且服务器对您可以从您的 IP 地址发送的请求的频率进行了限制,那么添加多个线程可能没有任何区别。
是的,多线程抓取显着提高了处理速度。这不是 GIL 成为问题的情况。您正在失去大量空闲 CPU 和未使用的带宽以等待请求完成。如果您正在抓取的网页在您的本地网络中(一种罕见的抓取情况),那么多线程和单线程抓取之间的差异可能会更小。
您可以使用一到“n”个线程自己尝试基准测试。我写了一个关于发现 Web 资源的简单多线程爬虫,我写了一篇关于自动发现博客订阅源和 Twitter、Facebook、LinkedIn 帐户连接到商业网站的相关文章。您可以选择使用多少线程来更改 FocusedWebCrawler 中的 NWORKERS 类变量。