首页 > 解决方案 > 如何使用 scrapy 抓取网站上的弹出窗口

问题描述

我想在 boots.com 上抓取评论的姓名、年龄和性别。对于年龄和性别,只有将鼠标悬停在每个评论中的姓名上,您才能看到此数据。首先,我制作了用于抓取名称的代码,但它不起作用。其次,我不知道如何从弹出窗口中抓取年龄和性别。请问你能帮帮我吗。提前致谢。

链接:https ://www.boots.com/clearasil-ultra-rapid-action-treatment-cream-25ml-10084703

弹窗截图

import scrapy
from ..items import BootsItem
from scrapy.loader import ItemLoader



class bootsSpider(scrapy.Spider):
    name = 'boots'
    start_urls = ['https://www.boots.com/clearasil-ultra-rapid-action-treatment-cream-25ml-10084703']
    allowed_domains = ["boots.com"]


    def parse(self, response):
    reviews = response.xpath("//div[@class='bv-content-item-avatar-offset bv-content-item-avatar-offset-off']")
    for review in reviews:
        loader = ItemLoader(item=BootsItem(), selector=review, response=response)
        loader.add_xpath("name", ".//div[@class='bv-content-reference-data bv-content-author-name']/span/text()")
        yield loader.load_item()

标签: xpathscrapy

解决方案


Javascript用于显示数据(78您的案例中的评论)。你应该用它Selenium来刮这个。要显示所有评论,您必须多次单击以下按钮:

//button[contains(@class,"load-more")]

然后,要抓取所有消费者的名称,您可以使用以下 XPath(然后使用.text方法提取数据):

//li//div[@class="bv-content-header-meta"][./span[@class="bv-content-rating bv-rating-ratio"]]//span[@class="bv-author"]/*/span

输出:78节点

如果您想抓取文本评论,您可以使用:

//li//div[@class="bv-content-header-meta"][./span[@class="bv-content-rating bv-rating-ratio"]]/following::p[1]

输出:78节点

要获取每个消费者的年龄和性别,您必须将鼠标悬停在他们的姓名上(参见前面的 XPath),然后使用以下 XPath 获取值:

//span[@class="bv-author-userinfo-value"][preceding-sibling::span[@class="bv-author-userinfo-data"][.="Age"]]
//span[@class="bv-author-userinfo-value"][preceding-sibling::span[@class="bv-author-userinfo-data"][.="Gender"]]

或者,如果您不想/不能使用Selenium,您可以下载JSON(请参阅XHR浏览器中的请求),其中包含您需要的所有内容。

https://api.bazaarvoice.com/data/batch.json?passkey=324y3dv5t1xqv8kal1wzrvxig&apiversion=5.5&displaycode=2111-en_gb&resource.q0=reviews&filter.q0=isratingsonly:eq:false&filter.q0=productid:eq:868029&filter.q0=contentlocale:eq:en_EU,en_GB,en_IE,en_US,en_CA&sort.q0=submissiontime:desc&stats.q0=reviews&filteredstats.q0=reviews&include.q0=authors,products,comments&filter_reviews.q0=contentlocale:eq:en_EU,en_GB,en_IE,en_US,en_CA&filter_reviewcomments.q0=contentlocale:eq:en_EU,en_GB,en_IE,en_US,en_CA&filter_comments.q0=contentlocale:eq:en_EU,en_GB,en_IE,en_US,en_CA&limit.q0=100&offset.q0=0&limit_comments.q0=3&callback=bv_1111_50671

对于这种情况,我将其设置&limit.q0=为 100 和offset.q00 以确保获取所有数据。获得 JSON 后,您将在以下位置找到所有信息:Batched Results>q0>Results>0,1,2,3,...,78

输出 :

性别年龄 下载JSON使用并使用模块request提取数据。json


推荐阅读