Python 爬行不区分大小写的URL而不重复
我正在使用不区分大小写的scrapy对一组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只访问一个变体或另一个
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。