Python中scrapy_redis框架常见问题与解决方案

from scrapy_redis import spiders
import scrapy

class TestSpider(spiders.RedisSpider):
name = ‘test’
redis_key = ‘a’

def parse(self, response):
for i in range(10):
yield scrapy.Request(url=‘https://www.baidu.com’, dont_filter=True, callback=self.login)

def login(self, response):
print(1)


请问为什么这样写运行的时候只会产生了一个请求?是因为 redis 的 requests 队列去重了吗,这么取消去重?
Python中scrapy_redis框架常见问题与解决方案


1 回复

Scrapy-Redis常见问题与解决方案

Scrapy-Redis是Scrapy的分布式扩展,用Redis做调度队列和去重。下面总结几个常见坑和解决办法。

1. 连接Redis失败

# settings.py 正确配置示例
REDIS_URL = 'redis://:password@localhost:6379/0'  # 带密码
# 或分开配置
REDIS_HOST = 'localhost'
REDIS_PORT = 6379
REDIS_PARAMS = {
    'password': 'your_password',
    'db': 0
}

检查Redis服务是否启动、防火墙设置、密码是否正确。用redis-cli ping测试连接。

2. 去重不生效 确保在爬虫中正确继承RedisSpiderRedisCrawlSpider,并设置redis_key

from scrapy_redis.spiders import RedisSpider

class MySpider(RedisSpider):
    name = 'myspider'
    redis_key = 'myspider:start_urls'  # Redis列表键名
    
    def parse(self, response):
        # 解析逻辑
        pass

去重依赖DUPEFILTER_CLASS,默认是scrapy_redis.dupefilter.RFPDupeFilter,确保它在settings里启用。

3. 任务堆积不消费 检查爬虫是否正常启动,以及redis_key对应的列表是否有数据。手动推个任务测试:

redis-cli lpush myspider:start_urls "http://example.com"

如果还是不消费,看爬虫日志是否有异常,或者检查SCHEDULER配置:

SCHEDULER = "scrapy_redis.scheduler.Scheduler"
SCHEDULER_PERSIST = True  # 是否持久化任务队列

4. 多个爬虫任务混在一起 给不同爬虫设置不同的redis_key前缀,比如spider1:start_urlsspider2:start_urls。也可以为每个爬虫单独配置Redis的db编号。

5. 内存占用高 设置CONCURRENT_REQUESTS控制并发数,避免太高把Redis或网络打满。另外可以启用SCHEDULER_FLUSH_ON_START来清空旧队列,避免历史数据堆积。

6. 数据重复爬取 如果发现重复爬,检查去重指纹的生成方式。可以自定义DUPEFILTER_CLASS,或者调整REQUEST_FINGERPRINTER_CLASS来改变指纹算法。

7. 分布式协同问题 确保所有爬虫节点使用相同的Redis实例和配置,特别是密码和db编号。SCHEDULER_PERSIST设为True可以让爬虫暂停后恢复任务。

一句话建议:配好Redis连接,理清去重逻辑,分布式爬虫就能跑稳。

回到顶部