web-scraping - 抓取区分大小写的 URL,但使用 Scrapy 抓取不区分大小写的 URL
问题描述
我正在使用 Scrapy 抓取和抓取众多网站。Scrapy 需要以区分大小写的模式抓取 URL,因为这是请求网页时的重要信息。许多网站使用相同 URL 的不同大小写链接到某些网页,这会欺骗 Scrapy 创建重复的抓取。
例如,页面https://www.example.com/index.html链接到https://www.example.com/User1.php和https://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。
解决方案
您可能希望创建一个扩展DupeFilter
的自定义,然后在您的BaseDupeFilter
DUPEFILTER_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")
,以便其他人可以从更改中受益
推荐阅读
- java - Guice 将一个对象注入到类构造函数中
- android - Android Studio Vector 资产总是无法生成预览
- java - 如何使用 Hibernate 作为 Vert.x 的非阻塞 ORM
- ocaml - 在 utop 中使用完全限定名称
- wordpress - 如何在网站上隐藏标题产品?
- javascript - WebAssembly/emscripten:从浏览器中将文件写入磁盘
- javascript - 限制while循环的次数
- bash - 如何根据子目录的文件名长度对文件进行排序?
- matlab - 如何更新矩阵行中的值
- python - 如何将字符串列表转换为 Python 中的变量?