Как получить все страницы со всего сайта, используя Python? - PullRequest
1 голос
/ 19 июня 2019

Я пытаюсь создать инструмент, который должен получать каждую ссылку с сайта. Например, мне нужно получить все страницы с вопросами из stackoverflow. Я пытался использовать скрап.

class MySpider(CrawlSpider):
    name = 'myspider'
    start_urls = ['https://stackoverflow.com/questions/']

    def parse(self, response):
        le = LinkExtractor()
        for link in le.extract_links(response):
            url_lnk = link.url
            print (url_lnk)

Здесь я получил только вопросы со стартовой страницы. Что мне нужно сделать, чтобы получить все «вопросные» ссылки. Время не имеет значения, мне просто нужно понять, что делать.

UPD

Сайт, который я хочу наблюдать, это https://sevastopol.su/ - это местный городской новостной сайт.

Список всех новостей должен содержаться здесь: https://sevastopol.su/all-news

В нижней части этой страницы вы можете видеть номера страниц, но если мы перейдем на последнюю страницу новостей, мы увидим, что он имеет номер 765 (прямо сейчас, 19.06.2019), но он показывает последний новый с датой от 19 июня 2018 года. Итак, на последней странице показаны только годичные новости. Но есть также много ссылок на новости, которые все еще живы (вероятно, с 2010 года) и могут даже быть найдены на странице поиска этого сайта. Вот почему я хотел знать, может ли быть доступ к какому-либо глобальному хранилищу ссылок этого сайта.

Ответы [ 3 ]

2 голосов
/ 19 июня 2019

Это то, что вы можете сделать, чтобы получить все ссылки на различные задаваемые вопросы. Тем не менее, я думаю, что ваш скрипт может получить ошибку 404 где-то внутри выполнения, так как есть миллионы ссылок для разбора.

Запустите скрипт так, как он есть:

import scrapy

class StackOverflowSpider(scrapy.Spider):
    name = 'stackoverflow'
    start_urls = ["https://stackoverflow.com/questions/"]

    def parse(self, response):
        for link in response.css('.summary .question-hyperlink::attr(href)').getall():
            post_link = response.urljoin(link)
            yield {"link":post_link}

        next_page = response.css("a[rel='next']::attr(href)").get()
        if next_page:
            next_page_url = response.urljoin(next_page)
            yield scrapy.Request(next_page_url,callback=self.parse)
0 голосов
/ 19 июня 2019

ваш паук, который теперь выдает запросы на сканирование последующих страниц

from scrapy.spiders import CrawlSpider
from scrapy import Request
from urllib.parse import urljoin

class MySpider(CrawlSpider):
    name = 'myspider'
    start_urls = ['https://sevastopol.su/all-news']

    def parse(self, response):
        # This method is called for every successfully crawled page

        # get all pagination links using xpath
        for link in response.xpath("//li[contains(@class, 'pager-item')]/a/@href").getall():
            # build the absolute url 
            url = urljoin('https://sevastopol.su/', link)
            print(url)
            yield Request(url=url, callback=self.parse)  # <-- This makes your spider recursiv crawl subsequent pages

обратите внимание, что вам не нужно беспокоиться о запросе одного и того же URL несколько раз.Дубликаты удаляются с помощью scrapy (настройки по умолчанию).

Следующие шаги:

0 голосов
/ 19 июня 2019

Вы должны написать регулярное выражение (или аналогичную функцию поиска), которое ищет теги <a> с определенным классом (в случае так: class="question-hyperlink") и взять атрибут href из этих элементов.При этом будут получены все ссылки с текущей страницы.

Затем вы также можете выполнить поиск ссылок на страницу (внизу).Здесь вы видите, что эти ссылки /questions?sort=active&page=<pagenumber>, где вы можете изменить <pagenumber> со страницей, которую вы хотите очистить.(например, создайте цикл, который начинается с 1 и продолжается до тех пор, пока не получите ошибку 404.

...