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框架常见问题与解决方案
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. 去重不生效
确保在爬虫中正确继承RedisSpider或RedisCrawlSpider,并设置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_urls和spider2: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连接,理清去重逻辑,分布式爬虫就能跑稳。

