Как рекурсивно очистить каждую ссылку с сайта с помощью Scrapy? - PullRequest
0 голосов
/ 10 сентября 2018

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

Мне также нужно ввести имя пользователя и пароль, чтобы попасть на каждую страницу сайта, поэтому я включил базовый компонент аутентификации в мои start_requests.

Пока у меня есть паук, который дает мне ссылки только на главной странице, однако я не могу понять, почему он не переходит по ссылкам и не просматривает другие страницы.

Вот мой паук:

    from examplesite.items import ExamplesiteItem
    import scrapy
    from scrapy.linkextractor import LinkExtractor
    from scrapy.spiders import Rule, CrawlSpider
    from scrapy import Request
    from w3lib.http import basic_auth_header
    from scrapy.crawler import CrawlerProcess

    class ExampleSpider(CrawlSpider):
#name of crawler
name = "examplesite"

#only scrape on pages within the example.co.uk domain
allowed_domains = ["example.co.uk"]

#start scraping on the site homepage once credentials have been authenticated
def start_requests(self):
    url = str("https://example.co.uk")
    username = "*********"
    password = "*********"
    auth = basic_auth_header(username, password)
    yield scrapy.Request(url=url,headers={'Authorization': auth})

#rules for recursively scraping the URLS found
rules = [
    Rule(
        LinkExtractor(
            canonicalize=True,
            unique=True
        ),
        follow=True,
        callback="parse"
    )
]

#method to identify hyperlinks by xpath and extract hyperlinks as scrapy items
def parse(self, response):
    for element in response.xpath('//a'):
        item = ExamplesiteItem()
        oglink = element.xpath('@href').extract()
        #need to add on prefix as some hrefs are not full https URLs and thus cannot be followed for scraping
        if "http" not in str(oglink):
            item['link'] = "https://example.co.uk" + oglink[0]
        else:
            item['link'] = oglink

        yield item

Вот мой класс предметов:

    from scrapy import Field, Item

    class ExamplesiteItem(Item):
        link = Field()

Я думаю, что я ошибаюсь, это "Правила", которые, как я понимаю, вам нужно перейти по ссылкам, но я не до конца понимаю, как это работает (попытался прочитать несколько объяснений в Интернете, но все еще нет уверен).

Любая помощь будет высоко ценится!

1 Ответ

0 голосов
/ 10 сентября 2018

С вашими правилами все в порядке, проблема заключается в переопределении метода parse.

Из документов Scrapy на https://doc.scrapy.org/en/latest/topics/spiders.html#crawling-rules

При написании правил для пауков сканирования избегайте использования parse в качестве обратного вызова, поскольку CrawlSpider использует сам метод parse для реализации его логика. Так что если вы переопределите метод parse, паук сканирования больше не будет работать.

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