Scrapy-Splash重复过滤器警告:去重功能是否正常工作?
你的爬虫代码
import scrapy from scrapy_splash import SplashRequest class BeerSpider(scrapy.Spider): name = 'beer' def start_requests(self): url = 'https://www.beerwulf.com/en-gb/c/mixedbeercases' yield SplashRequest(url=url, callback=self.parse) def parse(self, response): products = response.css('a.product.search-product.product-info-container.draught-product.notranslate.pack-product') for item in products: yield{ 'name': item.css('h4::text').get(), 'price': item.css('span.price::text').get(), }
警告信息(中文翻译)
2023-04-03 10:58:53 [py.warnings] 警告: C:\Users\chris\anaconda3\lib\site-packages\scrapy_splash\dupefilter.py:20: ScrapyDeprecationWarning: 调用了已废弃的函数scrapy.utils.request.request_fingerprint()。
如果你在Scrapy组件中使用此函数,且允许组件用户通过设置修改指纹算法,请在组件中改用
crawler.request_fingerprinter.fingerprint()(可通过from_crawler类方法获取crawler对象)。否则,可以考虑改用
scrapy.utils.request.fingerprint()函数。无论哪种方式,生成的指纹都会以字节形式返回,而非字符串,且与
request_fingerprint()生成的指纹不同。切换前,请确保你了解其影响(如缓存失效)并接受这些后果;否则,可以考虑实现自定义函数,返回与已废弃的request_fingerprint()相同的指纹。
fp = request_fingerprint(request, include_headers=include_headers)
问题解答
重复过滤器当前仍正常工作
这个警告仅代表request_fingerprint()函数已被Scrapy标记为废弃(未来版本会移除),但当前版本中该函数仍能正常生成请求指纹,scrapy_splash的重复过滤器依然会基于这些指纹识别重复请求,你的爬虫不会出现重复请求未被过滤的问题。警告产生的原因
Scrapy更新了请求指纹生成的API规范,推荐使用新的API替代旧函数,但scrapy_splash库尚未跟进适配这个更新,因此触发了弃用警告。长期处理建议
- 等待scrapy_splash官方发布更新,适配Scrapy的新API,从根源消除警告。
- 若想手动临时修复,可修改scrapy_splash库的
dupefilter.py文件(路径见警告信息),将旧的request_fingerprint调用替换为新API:
注意:修改第三方库文件会在库更新后被覆盖,仅作为临时方案。# 导入新的指纹生成函数 from scrapy.utils.request import fingerprint as request_fingerprint
内容的提问来源于stack exchange,提问作者Chris Abell

