# 源码解读

# Spider

分布式爬虫

Spider 继承 BaseParser, Scheduler

# 运行流程

  1. 初始化 Spider (传入 rediskey), 此时会初始化 Spider 中的参数,以及 Scheduler 中的参数,调用多线程中的 start 方法
  2. 在 start 方法中,将当前 Spider 对象存入 self._parsers 中,然后调用 Scheduler 中的_start 方法
  3. 在_start 方法中,调用初始化后的 request_buffer,item_buffer,collector 的 start 方法
  4. 接着根据线程数及进程数,开启多个 parser_control (主要是处理 collector)

# Spider 内置方法

# 方法
  • start_monitor_task 开始监控 常驻:主要涉及 redis 数量任务监控以及下发任务
  • distribute_task 分发任务,由于继承了 Scheduler, 所以会初始化 parser 列表
  • run 运行线程 然后调用 Scheduler 中的_start () 方法 启动 request_buffer,item_buffer,collector (均继承多线程,用 start () 常驻)
  • parser_control

# 组件介绍

# Scheduler

调度器

决定爬虫的执行顺序,以及批次爬虫的调度逻辑

# init
  • self._request_buffer 根据 redis_key 初始化的 request_buffer
  • self._item_buffer 根据 redis_key 初始化的 item_buffer
  • self._collector 根据 redis_key 初始化的 collector
  • self._parsers 数组,用于存放 Spider 对象本身
  • self._parser_controls 数组
  • self._parser_control_obj PaserControl 组件 (从 collector 中获取任务 处理 request)
# request_buffer
  • init 初始化 requests 队列,del_requests 队列
  • run: 只要未结束,就不断的往 redis 中添加任务
  • __add_request_to_db: 将内存队列的中的任务添加至 redis 中
# item_buffer
# collector
# Request

封装了 request
缓存配置 (用于 debug 爬虫)

# PaserControl
# run

从内存队列中取 request, 对其数量进行判断,然后处理中间件,获取返回后的结果

Edited on

Give me a cup of [coffee]~( ̄▽ ̄)~*

Mr2 WeChat Pay

WeChat Pay