首页 > 解决方案 > 抓取区分大小写的 URL,但使用 Scrapy 抓取不区分大小写的 URL

问题描述

我正在使用 Scrapy 抓取和抓取众多网站。Scrapy 需要以区分大小写的模式抓取 URL,因为这是请求网页时的重要信息。许多网站使用相同 URL 的不同大小写链接到某些网页,这会欺骗 Scrapy 创建重复的抓取。

例如,页面https://www.example.com/index.html链接到https://www.example.com/User1.phphttps://www.example.com/user1.php

我们需要 Scrapy 来收集这两个页面,因为当我们看到页面 User1.php 时,我们还不知道我们稍后会通过 user1.php 收集它的克隆。我们也不能在抓取过程中将https://www.example.com/User1.php小写,因为当页面https://www.example.com/user1.php不可用时,服务器可能会返回 404 错误。

因此,我正在寻找一种解决方案,告诉 Scrapy 以区分大小写的模式抓取 URL,但在抓取页面之前以不区分大小写的模式重复过滤页面,以消除重复的风险。

有谁知道如何同时在两种模式下操作 Scrapy。

标签: web-scrapingscrapyweb-crawlercase-sensitive

解决方案


您可能希望创建一个扩展DupeFilter的自定义,然后在您的BaseDupeFilterDUPEFILTER_CLASS = "my_package.MyDupeFilter"settings.py

您可能会很幸运,只需将现有的子类化RFPDupeFilter并在该案例中插入一行def request_seen(self, request)- 在对其进行指纹识别之前折叠 URL:

class MyDupeFilter(RFPDupeFilter):
    def request_seen(self, request):
        lc_req = request.replace(url=request.url.lower())
        return super(MyDupeFilter, self).request_seen(lc_req)

事实上,这听起来像是一个很常见的功能,如果你发现更改对你有用,然后提交 PR 到 Scrapy 进行添加case_fold = settings.getbool("DUPEFILTER_CASE_INSENSITIVE"),以便其他人可以从更改中受益


推荐阅读