无法使用RVest抓取页面项目

时间:2019-12-22 21:14:10

标签: web-scraping rvest xml2

我正在使用R进行网页抓取,最近正在做一些练习。 我目前在当地的eBay列表中玩耍,在那里我可以抓取有关单个列表的文本信息。但是,我尝试了不同的选择来也刮取列表的视图数。但是没有任何东西可以给我显示在页面上的数字。

页面链接是这个

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")

任何帮助我们都非常感谢-我认为views节点没有什么不同。我尝试了xpath和完整的xpath,但没有结果。

1 个答案:

答案 0 :(得分:1)

问题是您要抓取的元素中的文本在您解析的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>

发生的情况是,当您使用Web浏览器时,您请求的页面包含JavaScript,浏览器将自动运行该JavaScript。在这种情况下,它会向服务器发送进一步的请求,以下载更多信息,并将其插入页面中。

但是,当您使用rvest或类似工具时,会下载原始的html页面,但不会运行javascript。因此,不会发出后续请求,并且空白字段也无法被刮取。

在这种情况下,找到下载页面浏览量的链接非常容易,因为该链接实际上在您下载的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)

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