我使用不区分大小写的scrapy抓取一组网址,以使http://www.example.com/ABC/1
与http://www.example.com/abc/1
页面相同。在我的CrawlSpider中,我有一个看起来像的运行:
Rule(LinkExtractor(allow=('(?i)http://www.example.com/abc/\d+', ))
选择了这两种变体,但我最终会对页面进行双重抓取,因为复制过滤器会将它们视为不同的页面。
是否有一种简单的方法可以强制scrapy只访问一个变体或另一个变体(但不能同时访问两个变体),而无需继承RFPDupeFilter
并更改DUPEFILTER_CLASS
设置?或者这是最好的解决方案?
答案 0 :(得分:3)
Scrapy的规则类有一个属性process_links
,可用于将所有链接规范化为小写。在一个要点:
def links_as_lower(links):
for link in links:
link.url = link.url.lower()
yield link
Rule(LinkExtractor(allow=('(?i)http://www.example/abc/\d+', ), process_links=links_as_lower)
有关scrapy规则的完整文档为here