爬虫【Scrapy-redis分布式爬虫】

发布于:2025-04-03 ⋅ 阅读:(18) ⋅ 点赞:(0)

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"][

网站公告

今日签到

点亮在社区的每一天
去签到