xpath - 如何使用 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()
解决方案
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.q0
0 以确保获取所有数据。获得 JSON 后,您将在以下位置找到所有信息:Batched Results>q0>Results>0,1,2,3,...,78
输出 :
推荐阅读
- typescript - 如何使用字符串映射到打字稿中的对象键?
- python - 在 python 中写入二进制数据(标头失败)
- swift - 使用 TextField 的 ForEach onDelete 错误
- python - AttributeError:模块“tensorflow”没有属性“string_join”
- r - R 等价于 `table ,contents( )` 用于汇总统计的 Stata 命令
- javascript - 如何处理地图项中多个选择元素的 onchange 事件
- google-cloud-platform - 无法关闭统一存储桶级别
- apache-spark - pyspark中的windowPartitionBy和重新分区
- python - plt.contourf() 的内存存储问题?
- c++ - C++ 线程错误:“static_assert 由于要求而失败”