Python 爬行不区分大小写的URL而不重复

Python 爬行不区分大小写的URL而不重复,python,scrapy,Python,Scrapy,我正在使用不区分大小写的scrapy对一组URL进行爬网,例如http://www.example.com/ABC/1与http://www.example.com/abc/1。在我的爬行蜘蛛中,我有一个类似于: Rule(LinkExtractor(allow=('(?i)http://www.example.com/abc/\d+', )) 这会同时获取两个变体,但我最终会对页面进行双重爬网,因为复制过滤器认为它们是不同的页面 有没有一种简单的方法可以强制scrapy只访问一个变体或另一个

我正在使用不区分大小写的scrapy对一组URL进行爬网,例如
http://www.example.com/ABC/1
http://www.example.com/abc/1
。在我的爬行蜘蛛中,我有一个类似于:

Rule(LinkExtractor(allow=('(?i)http://www.example.com/abc/\d+', ))
这会同时获取两个变体,但我最终会对页面进行双重爬网,因为复制过滤器认为它们是不同的页面


有没有一种简单的方法可以强制scrapy只访问一个变体或另一个变体(但不能同时访问两个变体),而无需子类化
RFPDupeFilter
和更改
dupfilter\u类设置?或者这是最好的解决方案?

Scrapy的规则类有一个属性
process\u 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规则的完整文档是

我将接受这一答案,但是对于搜索此答案的任何人来说,
process\u links
所使用的函数会获取一个链接列表并返回一个修改过的链接列表,因此此答案中的代码与最初发布的一样失败。谢谢。我忘记了这个特性-是的,规则很可能在一次处理中提取多个链接,因此
process\u links
方法必须反映这一点。相应地调整了代码。
links\u as\u lower
仍然错误。您需要为
links
中的每个
link
设置
l.url=l.url.lower()
,因为
l
是一个
link
对象,而不是原始url.Yikes!对不起,谢谢你。将代码a(希望)与从我的某个旧项目中提取的
process\u link
方法进行比较后,最后一次调整了代码a。