无法使用 rvest 抓取页面项目

Page item not scrape-able with rvest

我正在使用 R 进行网络抓取,最近一直在做一些练习。 我目前正在浏览本地的 ebay 列表,在那里我能够抓取有关单个列表的文本信息。但是,我尝试了不同的选项来收集列表的查看次数。但是没有给我页面上显示的数字。

页面Link是这样的:

https://www.ebay-kleinanzeigen.de/s-anzeige/zahnpflege-fuer-hunde-und-katzen-extra-stark-gegen-mundgeruch/1281544930-313-3170

虽然页面浏览量在图片的右下方(当前浏览量为00044)

我能够使用此代码检索文本:

pageURL <- read_html("https://www.ebay-kleinanzeigen.de/s-anzeige/zahnpflege-fuer-hunde-und-katzen-extra-stark-gegen-mundgeruch/1281544930-313-3170")
input <- pageURL %>%
  html_nodes(xpath="/html/body/div[1]/div[2]/div/section[1]/section/section/article/section[1]/section/dl") %>%
  html_text() 
write.csv2(input, "example_listing.csv")

我没有看到视图节点有什么不同。我尝试了 xpath 和完整的 xpath 没有结果。

问题是您尝试抓取的元素中的文本在您正在解析的 html 中不存在。您可以通过执行以下操作进行检查:

library(magrittr)
library(httr)

url <- paste("https://www.ebay-kleinanzeigen.de/s-anzeige/",
             "zahnpflege-fuer-hunde-und-katzen-extra-stark",
             "-gegen-mundgeruch/1281544930-313-3170", collapse = "")

page <- url %>% GET %>% content("text")
substr(page, 72144, 72177)
#>[1] "<span id=\"viewad-cntr-num\"></span>"

然而,如果你在 Chrome 或 Firefox 的开发者工具中查看此项,你会发现这里应该有一个数字:

<span id="viewad-cntr-num">00047</span>

发生的情况是,当您使用网络浏览器时,您请求的页面包含 javascript,浏览器会自动将其 运行s。在这种情况下,它会向服务器发送进一步的请求以下载额外的信息并将其插入到页面上。

但是,当您使用 rvest 或类似工具时,下载了原始 html 页面,但 javascript 不是 运行。因此,后续的请求都没有进行,空字段也无法被抓取。

在这种情况下,很容易找到下载页面浏览量的 link,因为 link 实际上在您下载的 html 页面上:

url2 <- strsplit(strsplit(page, "viewAdCounterUrl: '")[[1]][2], "'")[[1]][1]
url2
#> [1] "https://www.ebay-kleinanzeigen.de/s-vac-inc-get.json?adId=1281544930&userId=50592093"
page_views <- url2 %>% GET %>% content("text")
page_views
#> [1] "{\"numVisits\":52,\"numVisitsStr\":\"00052\"}"

您可以看到服务器返回了一个简短的JSON,其中包含您要查找的内容。您可以手动执行 javascript 所做的并将信息重新插入页面,如下所示:

page_views <- strsplit(strsplit(page_views, "\":\"")[[1]][2], "\"")[[1]][1]
tag <- "<span id=\"viewad-cntr-num\">"
page <- sub(tag, paste0(tag, page_views), page)

现在你可以这样做了:

input <- page %>% 
  read_html %>%
  html_nodes(xpath="//section[@class=\"l-container\"]") %>%
  html_text() %>% extract(1)

您将获得您要查找的文本,包括页面浏览量。