【问题标题】:Page item not scrape-able with rvest页面项目不能用 rvest 刮掉
【发布时间】:2020-04-14 07:33:00
【问题描述】:

我正在使用 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")

非常感谢任何帮助 - 因为我看不到视图节点的差异。我尝试了 xpath 和完整的 xpath,但没有结果。

【问题讨论】:

    标签: web-scraping rvest xml2


    【解决方案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>
    

    发生的情况是,当您使用网络浏览器时,您请求的页面包含浏览器自动运行的 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)
    

    你会得到你正在寻找的文字,包括页面浏览量。

    【讨论】:

    • 这正是我的问题:我的抓取尝试产生了空的 csv 文件。非常感谢 - 特别是对于详细信息。
    猜你喜欢
    • 2016-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-31
    • 2015-04-02
    • 2019-11-18
    • 1970-01-01
    • 2017-08-15
    相关资源
    最近更新 更多