如何让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
原理解释:
- 继承
RedisSpider类,保持从Redis队列获取URL的能力。 - 重写
start_requests方法,手动从Redis列表(redis_key)中读取URL。 - 创建Request时明确指定
dont_filter=True,这个参数会告诉调度器不要对此请求进行去重检查。 - 后续由爬虫生成的URL(如下一级页面链接)仍会正常经过调度器去重,除非你也为它们设置
dont_filter=True。
注意点:
- 确保Redis中的起始URL列表类型是List(使用
lpush命令添加URL)。 - 这种方法只跳过了起始URL的去重,后续链接的去重行为保持不变。
- 如果希望所有URL都不去重,可以在Request生成时统一设置
dont_filter=True,但这通常不是推荐做法。
一句话总结:重写start_requests,手动创建带dont_filter=True的Request即可。
您好,我把我的问题给你详细描述一下,请您帮我解决一下。
用的是 crawlspider 爬取乐融商城全部的网站源代码
但是爬取到 这一页面时,

