首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

资深技术咖详述 Python 爬虫的多线程实现思路

Python因为有GIL锁,多线程一直被诟病。在CPU密集型的任务场景中Python的多线程并不是很理想,而对于像网络爬虫这样的IO密集型任务场景,Python的多线程可以在一定程度上提高任务的并行度。下面我们详细说一下:

一、原理

主线程负责任务调度,在初始化时,加载待抓取的URL,可以从文件或者数据库中读取。把待抓取的URL放入任务队列,然后检查响应队列的返回结果。如果有返回结果,会保存已抓取的URL。为了防止重复抓取,这里会对比待抓取的URL与已抓取URL,只把未抓取过的URL放入到任务队列中。

子线程负责执行抓取任务,并返回当前执行任务的URL,还有通过该URL,获取的信息,也就是下一步要抓取的URL列表。解释一下,如果当前任务是需要抓取公告列表页A,执行抓取结果中,抓取到了两个公告页B和C的URL,那么返回的抓取结果,不仅包含A的URL,同时包含B和C的URL。

二、代码实现

解释一下:

master线程的run方法中,第一眼看它是个死循环,实际上它的意思是:我们从response_queue中,拿不到任务响应的时候,会抛出异常,退出循环体。拿到响应以后,调用filter方法,filter的参数是ResponseItem对象,ResponseItem中包含已抓取URL,这个方法有两个作用:第一个是保存已抓取链接,第二个是去掉待抓取链接中重复的链接。

三、总结一下

简单的说,主线程负责任务调度,从响应队列获取任务执行结果, 往任务队列加入新的任务,子线程负责抓取任务。从任务队列获取任务,执行完成后返回结果,存放到响应队列。

干货分享

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180707B1HG6F00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券