基于redis的分布式爬虫实现方案

栏目: 数据库 · 发布时间: 5年前

内容简介:简单的说,因为它的两个特性,再借助 redis 的以 BOSS 直聘为例,我们爬取数据基本是带着目的性的,比如爬取 哪个城市的招聘信息,爬取哪些岗位的招聘信息,爬取指定范围的信息( 分页 ),这些都可以当做一个粒度来建成任务,这样我们创建的任务将会尽可能地减少交集。
基于 <a href='https://www.codercto.com/topics/18994.html'>redis</a> 的分布式爬虫实现方案

实现概念

  • 基于 redis 良好的特性
  • 爬虫脚本的 模板化
  • 爬虫脚本监听 redis ,实现爬虫自动化

该方案的优点

  • 爬虫脚本模板化,复用性高
  • 按自定义任务进行爬取,且可以控制任务粒度
  • 爬虫脚本自动监听 redis,爬虫自动加入任务执行,不需要人为修改
  • 如果有 redis 可视化页面,添加任务信息会很便利

了解相关概念

为什么选择 redis

简单的说,因为它的两个特性, 单线程 ,由于 redis 的数据保存在内存中,获取数据所需的时间会很少,基本上是 个位数的毫秒级别 ,正因为它很快,所以它有资本使用 单线程 ,简单地说,就是多台服务器同时去 redis 里面拿数据,他们是需要排队的,如下如,命令1 没有执行完成,redis 是不会执行命令2的

基于redis的分布式爬虫实现方案

再借助 redis 的 列表 数据结构(可以当做 队列 使用),就可以实现服务器之间不会出现竞争任务的情况,每一个服务器只会领走一个任务,我们还可以通过 对列表的不同操作,改变任务执行策略,是先执行新添加的任务,还是耽搁最久的任务,以下就是列表,使用 push 从列表添加数据(任务),使用 pop 从列表中取出数据

基于redis的分布式爬虫实现方案

实现爬虫脚本的模板化

以 BOSS 直聘为例,我们爬取数据基本是带着目的性的,比如爬取 哪个城市的招聘信息,爬取哪些岗位的招聘信息,爬取指定范围的信息( 分页 ),这些都可以当做一个粒度来建成任务,这样我们创建的任务将会尽可能地减少交集。

基于redis的分布式爬虫实现方案
基于redis的分布式爬虫实现方案

一般的网站为了用户体验,基本都会有筛选功能,而筛选功能就是我们完成任务分类的手段,比如下面不同城市,职位的查询,页码的变化都是一个参数的改变。那么,对于我们来说,我们可以把城市,职位,公司以及页码这些抽象化,制造一个模板,通过几个关键字的改变完成不同类别的数据的爬取。

基于redis的分布式爬虫实现方案
基于redis的分布式爬虫实现方案
基于redis的分布式爬虫实现方案
基于redis的分布式爬虫实现方案
基于redis的分布式爬虫实现方案
基于redis的分布式爬虫实现方案

我们可以使用这些分类来创建任务,保证每个任务之间的交集较小,而且还可以控制任务的粒度,也就是爬取的数据量

def get_boss_recruit_data(city, query, begin_page_number, end_page_number):
 #爬虫实现细节
 
复制代码

通过监听 redis 队列中是否有任务,来执行爬虫任务

# 一直不断地监听
while True:
     # lpop 获取队列最左边的数据,并且从队列删除这个数据,所以,这个任务可以避免被多台服务器都去执行
	 task_info = redis.lpop('boss_recruit_task')
	 # 如果 队列中没有任务数据,此时在  python  中返回的是 None
     if task_info is not None:
        # eval 将字符串转换成字典,也就是解析任务
        task = eval(task_info)
        get_boss_recruit_data(task['city'],task['query'],task['begin_page_number',task['end_page_number']])
     else:
         print('waiting the task')
     # 如果没有任务,或者任务执行完了,休眠30秒,避免不断地去查询 redis,造成 redis阻塞
     time.sleep(30)
复制代码

此时我们向 redis 添加任务,如果开发一个 可视化的界面,那个添加一个任务就只是填写任务信息和点击按钮的操作了

# 添加三个任务,分别爬取 广州,深圳,杭州的  JAVA  岗位的前十页
# 广州
command = '{"city":"101280100","query":"JAVA",begin_page_number":1,"end_page_number":10}'
redis.lpush('boss_task',command)
# 深圳
command = '{"city":"101280600","query":"JAVA",begin_page_number":1,"end_page_number":10}'
redis.lpush('boss_task',command)
# 杭州
command = '{"city":"101210100","query":"JAVA",begin_page_number":1,"end_page_number":10}'
redis.lpush('boss_task',command)
复制代码

开启的三个进程会获取到任务,执行爬取操作

基于redis的分布式爬虫实现方案

以上所述就是小编给大家介绍的《基于redis的分布式爬虫实现方案》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

同伦方法纵横谈

同伦方法纵横谈

王则柯 / 大连理工大学 / 2011-5 / 25.00元

《走向数学丛书07-同伦方法纵横谈》,在本书里读者会看到许多人物故事,作为一本普及读物,我们有时候甚至觉得,对于不少读者来说,书中所写的科学研究中的人物故事,可能比书中介绍的具体的研究成果更有价值,这些人物故事,许多都出自我们个人之间的交往,这是从一个侧面了解科学研究的规律,了解科学家之成为科学家的珍贵记录。一起来看看 《同伦方法纵横谈》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

SHA 加密
SHA 加密

SHA 加密工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换