Scrapy-redis
分布式爬虫
1.Scrapy-redis
实现增量爬虫
增量爬虫的含义
就是前面所说的的暂停、恢复爬取
安装
# 使用scrapy-redis之前最好将scrapy版本保持在2.8.0版本, 因为2.11.0版本有兼容性问题
pip install scrapy==2.8.0
pip install scrapy-redis -i https://pypi.tuna.tsinghua.edu.cn/simple
配置 - 在
setting.py
中加入以下内容( 根据注释可选 )
"""
scrapy-redis配置
"""
# 调度器类 基于redis
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
# 指纹去重类
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
# 可以替换成布隆过滤器
# 下载 - pip install scrapy-redis-bloomfilter
# from scrapy_redis_bloomfilter.dupefilter import RFPDupeFilter
# DUPEFILTER_CLASS = 'scrapy_redis_bloomfilter.dupefilter.RFPDupeFilter'
# 是否在关闭时候保留原来的调度器和去重记录, True=保留, False=清空
SCHEDULER_PERSIST = True
# Redis 服务器地址
REDIS_URL = "redis://127.0.0.1:6379/0" # Redis默认有16库,/1的意思是使用序号为2的库,默认是0号库(这个可以任意)
SCHEDULER_QUEUE_KEY = "scrapy_redis:queue.PriorityQueue" # 使用有序集合来存储
# SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.FifoQueue" # 先进先出
# SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.LifoQueue" # 先进后出, 后进先出
# 配置Redis管道
# from scrapy_redis.pipelines import RedisPipeline
# ITEM_PIPELINES = {
# "scrapy_redis.pipelines.RedisPipeline": 301,
# "douban.pipelines.DoubanPipeline": 300,
# }
# 重爬:一般不配置,在分布式中使用重爬机制会导致数据混乱,默认是False
# SCHEDULER_FLUSH_ON_START = True
运行指令以及运行效果
scrapy crawl 爬虫名称
在爬取过程中,使用ctrl+c
让爬虫暂停抓取。停止后使用redis
客户端查看对应的数据信息
scrapy-redis
的工作流程
spiders -> request请求对象 -> 经过中间件 -> 提交给引擎 -> 会把Request对象提交给调度器(下载器)
-> 返回response -> 给pipeline
-> 返回request -> 给引擎 交给调度器
基于redis的调度器
增量爬虫 - 案例1 - 网易招聘
# zhaopin.py
import scrapy
from scrapy.http import JsonRequest
from scrapy import cmdline
class ZhaopinSpider(scrapy.Spider):
name = "zhaopin"
allowed_domains = ["hr.163.com"]
# start_urls = ["https://hr.163.com/api/hr163/position/queryPage"]
def start_requests(self):
api_url = "https://hr.163.com/api/hr163/position/queryPage"
for page in range(1, 229):
json_data = {
"currentPage": page,
"pageSize": 10,
}
yield JsonRequest(api_url, data=json_data)
def parse(self, response, **kwargs):
print(response.json()["data"][