Использование Scrapy для сканирования всех страниц, которые связаны с веб-сайтом, с любой необходимой глубиной - PullRequest
0 голосов
/ 13 января 2019

Мне интересно знать, возможно ли сканировать все страницы и ссылки на веб-сайте с любой глубиной, даже если после нескольких ссылок изменяется верхний URL-адрес? Вот пример:

Главный URL: www.topURL.com
имеет 3 ссылки: www.topURL.com/link1, www.topURL.com/link2 и www.topURL.com/link3

Затем, если мы нажмем на www.topURL.com/link1, мы перейдем на страницу, которая сама имеет
2 ссылки на него: www.topURL.com/link4 и www.topURL.com/link5

но если мы нажмем на www.topURL.com/link4, мы перейдем на страницу со следующими двумя ссылками: www.anotherURL.com/link1 и www.thirdURL.com/link1

.

Может ли scrapy или любой гусеничный / паук питона начинаться с www.topURL.com, а затем переходить по ссылкам и заканчиваться на www.thirdURL.com/link1?

Есть ли предел того, насколько глубоко он может зайти? Есть ли пример кода, чтобы показать мне, как это сделать?

Спасибо за помощь.

1 Ответ

0 голосов
/ 13 января 2019

Взгляните на скрапы CrawlSpider класс пауков

CrawlSpider - это наиболее часто используемый паук для сканирования обычных веб-сайтов, поскольку он предоставляет удобный механизм для перехода по ссылкам путем определения набора правил.

Для достижения вашей цели вам просто нужно установить очень простые правила:

class MySpider(CrawlSpider):
    name = 'example.com'
    allowed_domains = ['example.com']
    start_urls = ['http://www.example.com']

    rules = (
        # Extract and follow all links!
        Rule(LinkExtractor(callback='parse_item', follow=True),
    )

    def parse_item(self, response):
        self.log('crawling'.format(response.url))

Приведенный выше сканер будет сканировать каждый URL-адрес, соответствующий разрешенному_домену на веб-сайте, и обратный вызов на parse_item.
Следует отметить, что по умолчанию LinkeExtractor игнорирует медиа-страницы (например, pdf, mp4 и т. Д.)

Чтобы углубиться в глубинные предметы, в scrapy действительно есть настройки ограничения DEPTH, но по умолчанию установлено значение 0 (то есть бесконечная глубина)
https://doc.scrapy.org/en/0.9/topics/settings.html#depth-limit

# settings.py
DEPTH_LIMIT = 0

Кроме того, scrapy по умолчанию сначала сканирует глубину, но если вы хотите быстрее, широта охвата сначала может улучшить это: https://doc.scrapy.org/en/0.9/topics/settings.html#depth-limit

# settings.py
SCHEDULER_ORDER = 'BFO'
...