“百行代码”实现简单的Python分布式爬虫
优采云 发布时间: 2020-06-02 08:00本篇文章属于进阶知识,可能会用到曾经出现在专栏文章中的知识,如果你是第一次关注本专栏,建议你先阅读下其他文章:查询--爬虫(计算机网路)
现在搞爬虫的人,可能被问的最多的问题就是“你会不会分布式爬虫?”。给人的觉得就是你不会分布式爬虫,都不好意思说自己是搞爬虫的。但虽然分布式爬虫的原理比较简单,大多数的业务用不到分布式模式。
所谓的分布式爬虫,就是多台机器合作进行爬虫工作,提高工作效率。
分布式爬虫须要考虑的问题有:
(1)如何从一个统一的插口获取待抓取的URL?
(2)如何保证多台机器之间的排重操作?即保证不会出现多台机器同时抓取同一个URL。
(3)当多台机器中的一台或则几台死掉,如何保证任务继续,且数据不会遗失?
这里首先借助Redis数据库解决前两个问题。
Redis数据库是一种key-value数据库,它本身包含了一些比较好的特点,比较适宜解决分布式爬虫的问题。关于Redis的一些基本概念、操作等,建议读者自行百度。我们这儿使用到Redis中自带的“消息队列”,来解决分布式爬虫问题。具体实现步骤如下:
在Redis中初始化两条key-value数据,对应的key分别为spider.wait和spider.all。spider.wait的value是一个list队列,存放我们待抓取的URL。该数据类型便捷我们实现消息队列。我们使用lpush操作添加URL数据,同时使用brpop*敏*感*词*并获取取URL数据。spider.all的value是一个set集合,存放我们所有待抓取和已抓取的URL。该数据类型便捷我们实现排重操作。我们使用sadd操作添加数据。
在我的代码中,我是在原先爬虫框架的基础上,添加了分布式爬虫模式(一个文件)分布式爬虫 python,该文件的代码行数大约在100行左右,所以文章标题为“百行代码”。但实际上,在每台客户端机器上,我都使用了多线程爬虫框架。即:
(1)每台机器从Redis获取待抓取的URL,执行“抓取--解析--保存”的过程
(2)每台机器本身使用多线程爬虫模式,即有多个线程同时从Redis获取URL并抓取
(3)每台机器解析数据得到的新的URL,会传回Redis数据库,同时保证数据一致性
(4)每台机器单独启动自己的爬虫,之后单独关掉爬虫任务,没有手动功能
具体可查看代码:distributed_threads.py
这里的代码还不够建立,主要还要如下的问题:
有兴趣解决问题的,可以fork代码然后,自行更改分布式爬虫 python,并递交pull-requests。
=============================================================
作者主页:笑虎(Python爱好者,关注爬虫、数据剖析、数据挖掘、数据可视化等)
作者专栏主页:撸代码,学知识 - 知乎专栏
作者GitHub主页:撸代码,学知识 - GitHub
欢迎你们指正、提意见。相互交流,共同进步!
==============================================================