引言
在使用Scrapy-Redis进行分布式爬虫开发的过程中,我遇到了一个与make_requests_from_url
方法相关的错误。这篇博客旨在分享我是如何解决这个问题的。
问题描述
在运行Scrapy-Redis爬虫时,我遇到了以下错误:
2022-04-19 14:21:28 [scrapy.utils.signal] ERROR: Error caught on signal handler: <bound method RedisMixin.spider_idle of <TySpider 'ty' at 0x24493b06e50>>
Traceback (most recent call last):
File "g:\python38\lib\site-packages\scrapy\utils\signal.py", line 30, in send_catch_log
response = robustApply(receiver, signal=signal, sender=sender, *arguments, **named)
File "g:\python38\lib\site-packages\pydispatch\robustapply.py", line 55, in robustApply
return receiver(*arguments, **named)
File "g:\python38\lib\site-packages\scrapy_redis\spiders.py", line 157, in spider_idle
self.schedule_next_requests()
File "g:\python38\lib\site-packages\scrapy_redis\spiders.py", line 145, in schedule_next_requests
for req in self.next_requests():
File "g:\python38\lib\site-packages\scrapy_redis\spiders.py", line 111, in next_requests
reqs = self.make_request_from_data(data)
File "g:\python38\lib\site-packages\scrapy_redis\spiders.py", line 140, in make_request_from_data
return self.make_requests_from_url(url)
AttributeError: 'TySpider' object has no attribute 'make_requests_from_url'
这个错误是由于新版本的Scrapy框架已经弃用了make_requests_from_url
方法,但是Scrapy-Redis还在某些地方用到了这个方法,导致了冲突。
解决方案
为了解决这个问题,我在爬虫类中重写了make_requests_from_url
方法。以下是修改后的代码:
import scrapy
from scrapy_redis.spiders import RedisSpider
from tianya2.items import Tianya2Item
class TySpider(RedisSpider):
name = 'ty'
allowed_domains = ['tianya.cn']
redis_key = "ty_start_url"
def make_requests_from_url(self, url):
return scrapy.Request(url, dont_filter=True)
# 其余代码...
实现步骤
- 创建新的方法:在
TySpider
类中定义了一个新的make_requests_from_url
方法。 - 请求构建:确保该方法返回一个
scrapy.Request
对象,并设置dont_filter=True
。 - 保持原有逻辑:这一更改保持了爬虫的原有逻辑和行为。
测试和验证
经过更改后,我重新运行了爬虫,并且没有再遇到之前的错误。爬虫能够正常工作,成功获取并处理了数据。
结论
通过在Scrapy-Redis爬虫中重新实现make_requests_from_url
方法,我成功解决了因框架更新导致的兼容性问题。这个解决方法对于遇到同样问题的其他开发者可能也是有用的。
附加信息
更多关于Scrapy-Redis的信息,可以参考Scrapy-Redis官方文档。