【问题标题】:Scraping ajax page with Scrapy?用 Scrapy 抓取 ajax 页面?
【发布时间】:2016-09-14 08:50:20
【问题描述】:

我正在使用 Scrapy 从该页面抓取数据

https://www.bricoetloisirs.ch/magasins/gardena

产品列表动态显示。 查找网址获取产品

https://www.bricoetloisirs.ch/coop/ajax/nextPage/(cpgnum=1&layout=7.01-14_180_69_164_182&uiarea=2&carea=%24ROOT&fwrd=frwd0&cpgsize=12)/.do?page=2&_=1473841539272

但是当我用 Scrapy 抓取它时,它给了我空白页

<span class="pageSizeInformation" id="page0" data-page="0" data-pagesize="12">Page: 0 / Size: 12</span>

这是我的代码

# -*- coding: utf-8 -*-
import scrapy

from v4.items import Product


class GardenaCoopBricoLoisirsSpider(scrapy.Spider):
    name = "Gardena_Coop_Brico_Loisirs_py"

    start_urls = [
            'https://www.bricoetloisirs.ch/coop/ajax/nextPage/(cpgnum=1&layout=7.01-14_180_69_164_182&uiarea=2&carea=%24ROOT&fwrd=frwd0&cpgsize=12)/.do?page=2&_=1473841539272'
        ]

    def parse(self, response):
        print response.body

【问题讨论】:

  • 因为这就是您点击 start_urls 中所述的网址时得到的结果
  • 您的问题似乎在于 cookie。您是否尝试过在启动 url 中只使用 https://www.bricoetloisirs.ch/magasins/gardena 然后产生 ajax 请求? Scrapy 会自动管理 cookie,因此您需要做的就是复制请求链和一些标头,您应该会收到相同的响应。
  • @Granitosaurus 是对的。

标签: python ajax scrapy


【解决方案1】:

我解决了。

# -*- coding: utf-8 -*-
import scrapy

from v4.items import Product


class GardenaCoopBricoLoisirsSpider(scrapy.Spider):
    name = "Gardena_Coop_Brico_Loisirs_py"

    start_urls = [
            'https://www.bricoetloisirs.ch/magasins/gardena'
        ]

    def parse(self, response):
        for page in xrange(1, 50):
            url = response.url + '/.do?page=%s&_=1473841539272' % page
            yield scrapy.Request(url, callback=self.parse_page)

    def parse_page(self, response):
        print response.body

【讨论】:

  • 请编辑您的答案并详细说明问题所在以及您是如何解决的。
  • @kchomski 如果您仔细阅读说明,他想加载 /.do?page=%s&_=1473841539272 并且无法导致他需要 cookie。他首先加载 bricoetloisirs.ch/magasins/gardena 以从服务器生成一个 cookie,然后继续执行并得到他想要的。
【解决方案2】:

据我所知,网站使用 JavaScript 进行 Ajax 调用。
当您使用scrapy 时,页面的 JS 不会加载。

您需要查看 Selenium 以获取此类页面。

或者找出正在进行的 ajax 调用并自己发送。
检查这个Can scrapy be used to scrape dynamic content from websites that are using AJAX? 也可以帮助你

【讨论】:

  • 这不是真的。 Ajax 只是一个异步请求,可以很容易地用 scrapy 或其他任何东西复制。但是,如果您正在寻找懒惰的、全能的方法,您可以使用 selenium 之类的东西来呈现包含所有 ajax 请求和花里胡哨的页面。
  • @Granitosaurus 你是对的,这就是为什么我链接了另一个答案,他们谈论分析网络调用和模拟 ajax 请求
【解决方案3】:

我相信您需要像浏览器一样发送额外的请求。尝试如下修改您的代码:

# -*- coding: utf-8 -*-
import scrapy

from scrapy.http import Request
from v4.items import Product


class GardenaCoopBricoLoisirsSpider(scrapy.Spider):
    name = "Gardena_Coop_Brico_Loisirs_py"

    start_urls = [
        'https://www.bricoetloisirs.ch/coop/ajax/nextPage/'
    ]

    def parse(self, response):
        request_body = '(cpgnum=1&layout=7.01-14_180_69_164_182&uiarea=2&carea=%24ROOT&fwrd=frwd0&cpgsize=12)/.do?page=2&_=1473841539272'
        yield Request(url=response.url, body=request_body, callback=self.parse_page)

    def parse_page(self, response):
        print response.body

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多