如何使用python从整个网站获取所有页面?

时间:2019-06-19 08:57:29

标签: python web-scraping scrapy web-crawler

我正在尝试制作一种工具,该工具应该从网站获取每个链接。 例如,我需要从stackoverflow获取所有问题页面。 我尝试过使用scrapy。

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

我要观察的站点是f-strings-这是一个本地城市新闻网站。

所有新闻的列表应包含在此处:https://sevastopol.su/

在此页面的底部,您可以看到页码,但是如果转到新闻的最后一页,我们将看到它的编号为765(现在是2019年6月19日),但显示的是最新的日期时间为2018年6月19日。因此最后一页仅显示了一年的新闻。但是,还有很多新闻链接仍然存在(可能从2010年开始),甚至可以在该网站的搜索页面中找到。 因此,这就是为什么我想知道是否可以访问该站点的某些全局链接存储。

3 个答案:

答案 0 :(得分:2)

这可能是您要获取所有指向不同问题的链接的方法。但是,我想您的脚本可能在执行过程中某处出现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)

答案 1 :(得分:0)

您应该编写一个正则表达式(或类似的搜索功能),以查找具有特定类的<a>标签(在这种情况下:class="question-hyperlink")并使用href这些元素的属性。这将从当前页面获取所有链接。

然后,您还可以搜索页面链接(在底部)。在这里,您看到这些链接是/questions?sort=active&page=<pagenumber>,您可以在其中更改要抓取页面的<pagenumber>。 (例如,使循环从1开始,一直持续到出现404错误为止。

答案 2 :(得分:0)

您的蜘蛛现在会发出抓取后续页面的请求

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。重复删除(默认设置)。

下一步: