Сканирование чувствительных к регистру URL, но очистка без учета регистра с помощью Scrapy - PullRequest
0 голосов
/ 19 сентября 2019

Я использую 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 во время сканирования, поскольку сервер может выдать ошибку 404, когда страница https://www.example.com/user1.php недоступна.

Итак, я ищу решение дляпопросите Scrapy сканировать URL-адреса в режиме с учетом регистра, но фильтровать дубликаты страниц после их сбора в режиме без учета регистра перед их очисткой, чтобы исключить риск дублирования.

Кто-нибудь знает, как использовать Scrapy в обоих режимах одновременно.

1 Ответ

1 голос
/ 22 сентября 2019

Вы, вероятно, захотите создать пользовательский 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"), чтобы другие могли извлечь выгоду из этого изменения

...