【问题标题】:Scrapy Load More Issue - CSS SelectorScrapy 加载更多问题 - CSS 选择器
【发布时间】:2020-08-16 05:02:13
【问题描述】:

我正在尝试抓取一个网站,该网站在页面底部有一个“显示更多”链接,该链接会导致更多数据被抓取。这是网站页面的链接:https://untappd.com/v/total-wine-more/47792。这是我的完整代码:

class Untap(scrapy.Spider):
name = "Untappd"
allowed_domains = ["untappd.com"]
start_urls = [
    'https://untappd.com/v/total-wine-more/47792' #URL: Major liquor store chain with Towson location.
]

def parse(self, response):
    for beer_details in response.css('div.beer-details'):
        yield {
            'name': beer_details.css('h5 a::text').getall(), #Name of Beer
            'type': beer_details.css('h5 em::text').getall(), #Style of Beer
            'ABVIBUs': beer_details.css('h6 span::text').getall(), #ABV and IBU of Beer
            'Brewery': beer_details.css('h6 span a::text').getall() #Brewery that produced Beer  
        }
    load_more = response.css('a.yellow button more show-more-section track-click::attr(href)').get()
    if load_more is not None:
        load_more = response.urljoin(load_more)
        yield scrapy.Request(load_more, callback=self.parse)

我已尝试使用底部的“load_more”块继续加载更多数据以进行抓取,但来自网站的 HTML 输入没有工作。

这是来自网站的 HTML。

<a href="javascript:void(0);" class="yellow button more show-more-section track-click" data-track="venue" data-href=":moremenu" data-section-id="140216931" data-venue-id="47792" data-menu-id="38988361">Show More Beers</a>

我想让蜘蛛抓取网站上显示的内容,然后单击链接并继续抓取页面。任何帮助将不胜感激。

【问题讨论】:

    标签: python html css scrapy


    【解决方案1】:

    简答:

    curl 'https://untappd.com/venue/more_menu/47792/15?section_id=140248357' -H 'x-requested-with: XMLHttpRequest'
    

    单击该按钮会执行 javascript,因此您需要使用 selenium 来自动执行该操作,但幸运的是,您不会:)。

    您可以看到,使用开发人员工具,当您单击该按钮时,它会按照所示模式请求数据,每次增加 15(在/47792/ 之后),所以第一次: https://untappd.com/venue/more_menu/47792/15?section_id=140248357 第二次: https://untappd.com/venue/more_menu/47792/30?section_id=140248357 然后: https://untappd.com/venue/more_menu/47792/45?section_id=140248357' 等等。

    但是,如果您尝试直接从浏览器获取它,它不会获得任何内容,因为他们期待 'x-requested-with: XMLHttpRequest' 标头,表明它是一个 AJAX 请求。

    因此,您拥有了编码刮板所需的 URL 模式和所需的标头。

    剩下的就是解析每个响应。 :)

    PD:可能 section_id 参数可能会改变(我的和你的不同),但你已经在按钮的 HTML 中有 data-section-id="140248357" 属性。

    【讨论】:

    • 您能否阐明如何使用您提供的 URL 模式解析每个响应?
    • 抱歉,根据您提供的代码,我假设您已经知道如何操作了……我现在累了,需要休息一下。稍后我会抽出时间来更新我的答案。
    猜你喜欢
    • 1970-01-01
    • 2016-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    相关资源
    最近更新 更多