scrapy-redis分布式爬虫如何在start_urls中添加参数

本文探讨了在scrapy-redis分布式爬虫中如何处理start_urls参数的问题,特别是在url可能发生重定向的情况下,如何确保与指定的商品数参数对应。作者通过源码分析,提出在requests生成阶段加入参数的解决方案,并强调了改动源码的风险和注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

scrapy-redis分布式爬虫如何在start_urls中添加参数

1.背景介绍

  • 有这样一个需求,需要爬取A,B,C,D四个链接下的数据,但是每个链接下要爬取的数据量不同:
url链接: 指定爬取的商品数
A:       10
B:       20
C:       5
D:       32
  • 首先通过下面的文章了解一下scrapy-redis分布式爬虫的基本框架。
  • 在非分布式的scrapy爬虫中,这个参数非常好带入进去,只需要重写spider中的start_requests方法即可。
  • 但是在scrapy-redis分布式爬虫中,爬虫是依赖spider中设置的redis_key启动的,比如我们在spider中指定:
redis_key = 'amazonCategory:start_urls'
  • 然后,只要往 amazonCategory:start_urls 中填入一些url,爬虫就会启动,并取出这些链接进行爬取。
    这里写图片描述
  • 但是,scrapy-redis分布式爬虫,在start_urls的部分,只接受url,所以没有办法和 指定爬取的商品数 这个参数对应起来。
  • 当然,可以在默认处理start_urls的方法parse中,用url找到对应的 指定爬取的商品数 参数。但是,这里又存在一个很大的问题:那就是scrapy-redis框架,在start_urls的处理,全都是默认参数,也是默认支持重定向的,这里面的A,B,C,D四个链接,在爬取过程中,随时都可能发生网页重定向,跳转到其他页面,这时候parse函数中取出来的response.url就不是原来的A,B,C,D这几个链接了,而是跳转后的链接,也就无法和原来的 指定爬取的商品数 这个参数对应起来了。

2. 环境

  • 系统:win7
  • scrapy 1.4.0
  • scrapy-redis 0.6.8
  • redis 3.0.5
  • python 3.6.1

3. 分析scrapy-redis分布式爬虫的起步过程

这里写图片描述

  • 上面是scrapy最新的架构图。而scrapy-redis分布式爬虫是将scrapy和redis简单的粘在一起。所以只需要分析这个框架。
  • 整个其实过程可以总结为:

    • 第一:爬虫指定好redis_key,启动,等待起始url。
    • 第二:运行脚本,往redis_key中填充start_urls
    • 第三:爬虫发现redis_key中有了start_urls,开始取出这些url
    • 第四:爬虫按照默认参数,将这些url打包生成requests
    • 第五:将这些requests送往scheduler调度模块,进入等待队列,等待调度。
    • 第六:scheduler模块开始调度这些requests,出队,发往爬虫引擎。
    • 第七:爬虫引擎将这些requests送到下载中间件(多个,例如加header,代理,自定义等等)进行处理。
    • 第八:处理完之后,送往Downloader模块进行下载。
    • …………后面和本次主题无关,暂时就不考虑了。
  • 从上面整个过程来看,只能从一个地方入手,就是 “ 第四:爬虫按照默认参数,将这些url打包生成requests ”,我们需要在将url生成requests这个过程中,增加一些参数。

4. 爬虫起步过程的源码分析

  • 第一步:我们的爬虫是继承自类RedisSpider:
# 文件mySpider.py
class MySpider(RedisSpider):

# 文件 E:\Miniconda\Lib\site-packages\scrapy_redis\spiders.py
# RedisSpider 继承自 RedisMixin 和 Spider
class RedisSpider(RedisMixin, Spider):
  • 第二步 :分析类 RedisMixin
# 文件 E:\Miniconda\Lib\site-packages\scrapy_redis\spiders.py

class RedisMixin(object):
    """Mixin class to implement reading urls from a redis queue."""
    redis_key = None
    redis_batch_size = None
    redis_encoding = None

    # Redis client placeholder.
    server = None

    # 注解: scrapy-redis爬虫启动的第一步
    def start_requests(self):
        """Returns a batch of start requests from redis."""
        print(f"######1 spiders.py RedisMixin: start_requests")
        return self.next_requests()

    def setup_redis(self, crawler=None):
        """Setup redis connection and idle signal.

        This should be called after the spider has set its crawler object.
        """
        if self.server is not None:
            return

        if crawler is None:
            # We allow optional crawler argument to keep backwards
            # compatibility.
            # XXX: Raise a deprecation warning.
            crawler = getattr(self, 'crawler', 
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值