【问题标题】:How to crawl all pages with Scrapy如何使用 Scrapy 抓取所有页面
【发布时间】:2020-10-22 15:56:09
【问题描述】:

我正在尝试抓取所有链接到这个网站的形成:https://www.formatic-centre.fr/formation/

所以首先,我启动这个脚本只是为了测试,看看我是否可以抓取第一页的链接:

import scrapy


class LinkSpider(scrapy.Spider):
    name = "link"
    #allow_domains = ['https://www.formatic-centre.fr/']
    start_urls = ['https://www.formatic-centre.fr/formation/']

    #rules = (Rule(LinkExtractor(allow=r'formation'), callback="parse", follow= True),)

    def parse(self, response):
        card = response.xpath('//a[@class="title"]')
        for a in card:
            yield {'links': a.xpath('@href').get()}

成功了,我得到了这个:

[
{"links": "https://www.formatic-centre.fr/formation/les-regles-juridiques-du-teletravail/"},
{"links": "https://www.formatic-centre.fr/formation/mieux-gerer-son-stress-en-periode-du-covid-19/"},
{"links": "https://www.formatic-centre.fr/formation/dynamiser-vos-equipes-special-post-confinement/"},
{"links": "https://www.formatic-centre.fr/formation/conduire-ses-entretiens-specifique-post-confinement/"},
{"links": "https://www.formatic-centre.fr/formation/cours-excel/"},
{"links": "https://www.formatic-centre.fr/formation/autocad-3d-2/"},
{"links": "https://www.formatic-centre.fr/formation/concevoir-et-developper-une-strategie-marketing/"},
{"links": "https://www.formatic-centre.fr/formation/preparer-soutenance/"},
{"links": "https://www.formatic-centre.fr/formation/mettre-en-place-une-campagne-adwords/"},
{"links": "https://www.formatic-centre.fr/formation/utiliser-google-analytics/"}
]

但是当我想爬取所有页面时,事情变得很脏......我迷路了,我的脚本不再工作,我猜我的循环不太正确,因为我有 doublon 等等。

这是我的最终脚本:

import scrapy
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
from lxml import html

class LinkSpider(scrapy.Spider):
    name = "link"
    #allow_domains = ['https://www.formatic-centre.fr/']
    start_urls = ['https://www.formatic-centre.fr/formation/']

    rules = (Rule(LinkExtractor(allow=r'formation'), callback="parse", follow= True),)

    def parse(self, response):
        card = response.xpath('//a[@class="title"]')
        for a in card:
            yield {'links': a.xpath('@href').get()}



        next_page = response.xpath('.//a[@class="pagination__next btn-squae"]/@href').extract_first()
        if next_page:
            yield scrapy.Request(
                response.urljoin(next_page),
                callback=self.parse
            )

  

也许这是我的路?我检查并仔细检查以查看“下一个按钮”在哪里放置好的 href,然后我放了:.//a[@class="pagination__next btn-squae"]/@href

但奇怪的是,html 源代码中的链接没有链接到第二页,所以我很困惑。

这里 -> link

有什么想法吗?

编辑:显然我需要一些FormRequest,我需要使用这种代码吗? ajax

【问题讨论】:

  • 你想收集所有内部链接还是特定的东西?
  • 一些具体的东西。不是所有的链接,链接者指的是形成。就像上面的例子一样。 (第一张图片)
  • 对不起?每个页面的链接?
  • 不不,每个格式的链接都像这样:formatic-centre.fr/formation/… 用于所有页面的所有 kinf

标签: python python-3.x web-scraping scrapy


【解决方案1】:

接下来的页面是使用 AJAX 动态加载的。您必须使用来自 scrapy 的 FormRequest 模拟这些请求。

我建议你阅读this。

总而言之,您必须使用浏览器的开发者工具来观察请求是如何(以及在​​何处)发出的,复制表单(有时还需要标头)并生成一个FormRequest。

编辑:

  • 打开页面
  • 打开浏览器开发者工具(或检查某些元素)
  • 单击网络选项卡。按“XHR”过滤。
  • 然后点击页面上的下一步按钮
  • 您应该会看到如下图所示的新请求:

选择请求。边数据是此请求的详细信息。

矩形显示浏览器发出的请求的目的地。 下方有一个字段“响应标头”(可见),在其下方(您在图像中看不到)将有一个请求标头,这些是您的浏览器用作请求标头的参数。 有一个名为“请求”的选项卡,您可以在其中找到浏览器用于 POST 请求的表单数据。

您必须使用 FormRequest 并模拟浏览器发出的请求。首先复制表单中的参数,如果不起作用,请在请求中包含标头。

这是火狐。对于我提到的选项,其他浏览器可能有不同的位置。

这里的想法是 Scrapy 应该模拟浏览器的行为。大多数情况下,这是一个无痛的过程(一旦您了解自己在做什么),但有时可能会非常痛苦并且需要很长时间,所以放轻松。

【讨论】:

  • 好的,我去看看。
  • 我迷路了,我不知道请求是从哪里发出的,我找到了一些东西,但我什至不确定就是这样。
  • @LaurieFalcon 我编辑了我的答案,请看一下。
  • 感谢您的详细回答,但我无法弄清楚为什么我要使用 formdata,它只是参数。也许我没来对地方。
  • 当您单击下一步按钮时,它会向服务器发出 POST 请求。 POST 请求在其正文中携带由表单组成的消息。您看到的那些字段是在您的请求中发送的消息,因此您必须在您的 Scrapy 请求中包含该数据。为此,您需要使用FormRequest,这是一种 Scrapy 方法。 Details here。您似乎在这里遗漏了一些关键概念,因此您将不得不花一些时间阅读我发布的链接并搜索您不理解的内容。
猜你喜欢
  • 1970-01-01
  • 2021-02-05
  • 2012-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多