如何让Python的scrapy_redis对起始URL不去重

多个起始 url 的时候,跑着突然 ip 被 ban 了,然后重新尝试该 url,因为爬取过会被记录,所以要设置dont_filter=true让起始 url 默认不去重。
但是 scrapy_redis 起始就是我推到 redis 队列里面的 url,怎么对这些 url 设置不去重呢?


如何让Python的scrapy_redis对起始URL不去重
5 回复

你再 start_requests 方法里面推送不就好了么。


要让Scrapy-Redis对起始URL不去重,关键在于修改start_urls的处理逻辑。默认情况下,Scrapy-Redis会通过调度器对所有URL(包括起始URL)进行去重。以下是具体实现方法:

核心方案: 自定义一个爬虫类,重写start_requests方法,直接生成Request对象并设置dont_filter=True参数,从而绕过调度器的去重机制。

代码示例:

import scrapy
from scrapy_redis.spiders import RedisSpider

class MyNoDupStartUrlSpider(RedisSpider):
    name = 'my_spider'
    redis_key = 'my_spider:start_urls'  # 依然从Redis读取起始URL列表

    def start_requests(self):
        # 从Redis中获取起始URL列表
        for url in self.server.lrange(self.redis_key, 0, -1):
            # 为每个URL创建Request,并设置dont_filter=True跳过去重
            yield scrapy.Request(url=url.decode('utf-8'), 
                                 callback=self.parse, 
                                 dont_filter=True)

    def parse(self, response):
        # 你的解析逻辑
        pass

原理解释:

  1. 继承RedisSpider类,保持从Redis队列获取URL的能力。
  2. 重写start_requests方法,手动从Redis列表(redis_key)中读取URL。
  3. 创建Request时明确指定dont_filter=True,这个参数会告诉调度器不要对此请求进行去重检查。
  4. 后续由爬虫生成的URL(如下一级页面链接)仍会正常经过调度器去重,除非你也为它们设置dont_filter=True

注意点:

  • 确保Redis中的起始URL列表类型是List(使用lpush命令添加URL)。
  • 这种方法只跳过了起始URL的去重,后续链接的去重行为保持不变。
  • 如果希望所有URL都不去重,可以在Request生成时统一设置dont_filter=True,但这通常不是推荐做法。

一句话总结:重写start_requests,手动创建带dont_filter=True的Request即可。

您好,我把我的问题给你详细描述一下,请您帮我解决一下。

用的是 crawlspider 爬取乐融商城全部的网站源代码

但是爬取到 这一页面时,

回到顶部