Scrapy: следуйте только внешним ссылкам - PullRequest
0 голосов
/ 29 ноября 2018

С помощью OffsiteMiddleware вы можете контролировать, как переходить по внешним ссылкам в Scrapy.

Я хочу, чтобы паук игнорировал все внутренние ссылки на сайте и следовалвнешние ссылки только .

Динамические правила Добавление домена URL ответа в deny_domains не работает.

Можно ли переопределить get_host_regex в OffsiteMiddleware чтобы отфильтровать все ссылки на месте?Любой другой способ?

Уточнение : я хочу, чтобы паук игнорировал домены, определенные в allowed_domains, и все внутренние ссылки в каждом домене сканировались.Таким образом, домен каждого URL, за которым следует паук, должен игнорироваться, когда паук находится на этом URL. Другими словами: когда сканер попадает на сайт, например example.com, я хочу, чтобы он игнорировал любые ссылки на example.com и следовал только по внешним ссылкам на сайты, которые не на example.com.

Ответы [ 2 ]

0 голосов
/ 25 апреля 2019

Мой ответ не использует Scrapy.Не стесняйтесь помечать этот ответ, если считаете, что он слишком далек от темы.

Но то, что я предоставляю, - это решение, которое поможет решить вашу более общую проблему.

Я столкнулся с подобной проблемой, когда анализировал результаты из Google.Я не хотел, чтобы какие-либо стандартные URL-адреса, отображаемые на странице результатов, были включены в мой окончательный список URL-адресов.Я также не хотел, чтобы отображались какие-либо строки запроса Google.Используя BeautifulSoup, модуль re и модуль запросов, я смог это сделать.

Для вашей проблемы я бы сказал, что вам нужен только BeautifulSoup и re.Вам понадобится функция, которая будет фильтровать домены.Функция должна принимать два параметра: ссылку и тестируемый URL.Используя модуль re, вы можете проверить, совпадает ли базовая строка тестового URL со строкой ссылки;если да, то разумно сделать вывод, что это внутренний URL.

Вы бы использовали BeautifulSoup для анализа html для <a> тегов, которые содержат href.

0 голосов
/ 30 ноября 2018

Вы можете создать обратное внешнее промежуточное ПО, просто поменяв метод should_follow():

#mycrawler.middlewares.py

from scrapy.spidermiddlewares.offsite import OffsiteMiddleware
from scrapy.utils.httpobj import urlparse_cached

class ReverseOffsiteMiddleware(OffsiteMiddleware):

    seen = set()

    def should_follow(self, request, spider):
        allowed_domains = not super().should_follow(request, spider)
        # if failed to pass reverse allowed_domains don't follow
        if not allowed_domains:  
            return False

        # if visited domain before do not schedule request
        domain = urlparse_cached(request).hostname
        if domain in self.seen:
            return False
        # otherwise add to seen domain set and schedule request
        self.seen.add(domain)
        return True

Затем активируйте его в своем settings.py:

# settings.py
SPIDER_MIDDLEWARES = {
    'scrapy.spidermiddlewares.offsite.OffsiteMiddleware': None,
    'mycrawler.middlewares.ReverseOffsiteMiddleware': 500,
}

Теперь все домены в spider.allowed_domains будет проигнорировано:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...