我正在尝试使用一些web scraper(总共5个)。所有这些web scraper访问不同的网站,其中一些使用硒和其他不需要硒。有的跑30秒,有的跑45分钟。
我想做的是尽量减少运行这些刮刀所花费的时间。多线程是解决这个问题的方法吗?我一直在做一些关于这个主题的阅读,似乎我可以只是创建一个线程池,并将每个scraper传递到这个池进行处理。
或者多处理是在最快的时间内运行所有这些抓取器的更好方法吗?
我敢打赌多处理是多线程的方式,你将在所有这些进程之间共享内存和处理能力,而多处理你将在不同的核心之间分配负载,使它在处理数据负载时更快。
看看这个视频,它是非常翔实和说明性的,也有助于理解很多:https://www.youtube.com/watch?v=AZnGRKFUU0c
这取决于你的用例。
对于在本地机器上运行的普通用例,多线程就足够了。请注意,在大多数情况下,太多的请求不会加快你的抓取速度,因为现在大多数网络都受到CloudFlare的保护。分隔需要selenium的web抓取器和不需要的web抓取器也有很大帮助,因为selenium非常慢。
对于密集的网页抓取,特别是在大规模的情况下,每个scraper应该在一个微容器(例如AWS EC2)上单独运行,你可以控制你想要运行的特定scraper的实例数量。这样做还可以让您控制scraper的IP地址,以避免黑名单和请求速率限制。
对于Python,我建议使用https://scrapy.org/我可能会看看asyncio这个任务,因为大部分的工作都在等待网站的响应,再加上我建议看看漂亮的汤与网页的工作,只是抓取网站本身与请求模块。
它可以使你的代码更快。
如果你以更复杂的方式使用数据,我不建议使用多处理,因为内存不是在python中跨不同的解释器共享的,也不是全局变量,理论上你必须将数据写入文件或数据库以使其可用,另一种方法是使用多处理队列。它本质上是一个I/O繁重的任务,而不是计算繁重,多处理是一个明确的NO。
Multiprocessing需要启动一个全新的进程,并使用不同的python解释器分配不同的内存。这需要更长的时间,并且对于这个用例没有任何意义。再加上你能启动多少进程在你的CPU开始疯狂之前?
观看这个疯狂的更快的抓取方式:https://www.youtube.com/watch?v=nFn4_nA_yk8
使用此方法获取所有数据并将其存储在列表或元组中,然后使用多处理池处理数据,应该比将所有数据一起处理快一点。