【问题标题】:rvest web scraping is returning an empty data frame when attempting to collect product price informationrvest 网络抓取在尝试收集产品价格信息时返回一个空数据框
【发布时间】:2020-06-18 16:50:31
【问题描述】:

我正在尝试使用“rvest”从以下位置获取产品价格:https://www.lowes.com/pl/Lawn-garden-hand-tools-Outdoor-tools-equipment-Outdoors/4294612737?goToProdList=true&int_cmp=LawnGardenHandTools:C:Outdoors:Merch:shop_all_copy。我正在使用以下代码:

library(rvest)
library(tidyverse)

url <- "https://www.lowes.com/pl/Lawn-garden-hand-tools-Outdoor-tools-equipment-Outdoors/4294612737?goToProdList=true&int_cmp=LawnGardenHandTools:C:Outdoors:Merch:shop_all_copy"

html <- read_html(url)

price <- html %>%
  html_node('body') %>%
  xml_find_all("//span[contains(@class, 'h5 js-price v-spacing-mini art-pl-price')]") %>% 
  html_text() %>%
  data.frame()

但是 - 这将返回一个空数据框。

任何建议将不胜感激。

【问题讨论】:

  • 你在什么时候read_html(或类似的)?
  • 道歉 - 在写出上面的例子时,我忘了包括那个阶段。我现在已经编辑了示例代码。
  • 谢谢,这是 SO 中的一个常见错误:没有发布实际在控制台上运行的真实代码。这是一个简单且容易犯的错误,但它使故障排除变得更加困难:我们是否认为这是一个错字并忽略它,或者这是一个导致整个问题的问题?当我提出问题(SO 或其他 SE 站点)时,我尝试养成将代码粘贴到新的空 R 会话中并查看是否忘记了什么的习惯;不可避免地,每当我缩短该步骤时,我都会打错代码。

标签: html r xml web-scraping rvest


【解决方案1】:

rvest 只能抓取静态 HTML 内容。

大多数现代商业网站都使用由 JavaScript 动态生成的动态网页内容。

要抓取此类网站,您首先需要让网站生成您要查找的 HTML 内容,然后您才能使用rvest 抓取它。

为此,您需要使用网络浏览器模拟器,例如 RSeleniumSplash,以允许您在站点中移动并以编程方式查询数据。

RSelenium 需要安装 Docker Selenium server。这也推荐用于 Splash。

在这个漫长而有趣的旅程结束时,您必须发挥创造力,以免网站认为它正在被机器人查询:

【讨论】:

  • 非常感谢您的建议!我对网络抓取仍然很陌生 - 只是想知道为什么这意味着我仍然能够成功地抓取一些东西?因为我能够使用 rvest 抓取产品名称?
  • 旁注,虽然,我已经被提醒了好几次:虽然页面本身可能有rvest 可能看不到的动态内容,但通常你会发现 js 加载的链接可以直接获取原始数据。例如,在网络浏览器(不是 R)中,打开开发控制台并查看网络流量;通常您会看到辅助内容加载,这可能允许您直接使用rvest(或者甚至只是GET)来获得您需要的内容。 (我什至找到了直接的 JSON 源,不幸的是不在这个特定的 Lowes 链接中。)
猜你喜欢
  • 2023-03-16
  • 2014-05-04
  • 1970-01-01
  • 2019-02-13
  • 1970-01-01
  • 1970-01-01
  • 2020-10-07
  • 2021-05-15
  • 1970-01-01
相关资源
最近更新 更多