【问题标题】:Crawling case-sensitive URLs but Scraping case-insensitive with Scrapy抓取区分大小写的 URL,但使用 Scrapy 抓取不区分大小写的 URL
【发布时间】:2019-09-19 16:34:55
【问题描述】:

我正在使用 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-scraping scrapy web-crawler case-sensitive


    【解决方案1】:

    您可能希望创建一个自定义 DupeFilterextends BaseDupeFilter,然后在您的 settings.py 中设置 DUPEFILTER_CLASS = "my_package.MyDupeFilter"

    您可能很幸运,只需将现有的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)
    

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

    【讨论】:

      猜你喜欢
      • 2011-10-14
      • 1970-01-01
      • 2016-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-25
      • 1970-01-01
      相关资源
      最近更新 更多