使用 R 在 HTML 中下载隐藏的 json 数组



我正在尝试主要使用XML + httr包从transfermrkt中抓取数据。

page.doc <- content(GET("http://www.transfermarkt.es/george-corral/marktwertverlauf/spieler/103889"))

下载后,有一个名为"series"的隐藏数组:

'series':[{'type':'line','name':'Valor de mercado','data':[{'y':600000,'verein':'CF América','age':21,'mw':'600 miles €','datum_mw':'02/12/2011','x':1322780400000,'marker':{'symbol':'url(http://akacdn.transfermarkt.de/images/wappen/verysmall/3631.png?lm=1403472558)'}},{'y':850000,'verein':'Jaguares de Chiapas','age':21,'mw':'850 miles €','datum_mw':'02/06/2012','x':1338588000000,'marker':{'symbol':'url(http://akacdn.transfermarkt.de/images/wappen/verysmall/4774_1441956822.png?lm=1441956822)'}},{'y':1000000,'verein':'Jaguares de Chiapas','age':22,'mw':'1,00 mill. €','datum_mw':'03/12/2012','x':1354489200000,'marker':{'symbol':'url(http://akacdn.transfermarkt.de/images/wappen/verysmall/4774_1441956822.png?lm=1441956822)'}},{'y':1000000,'verein':'Jaguares de Chiapas','age':22,'mw':'1,00 mill. €','datum_mw':'29/05/2013','x':1369778400000,'marker':{'symbol':'url(http://akacdn.transfermarkt.de/images/wappen/verysmall/4774_1441956822.png?lm=1441956822)'}},{'y':1250000,'verein':'Querétaro FC','age':23,'mw':'1,25 mill. €','datum_mw':'27/12/2013','x':1388098800000,'marker':{'symbol':'url(http://akacdn.transfermarkt.de/images/wappen/verysmall/4961.png?lm=1409989898)'}},{'y':1500000,'verein':'Querétaro FC','age':24,'mw':'1,50 mill. €','datum_mw':'01/09/2014','x':1409522400000,'marker':{'symbol':'url(http://akacdn.transfermarkt.de/images/wappen/verysmall/4961.png?lm=1409989898)'}},{'y':1800000,'verein':'Querétaro FC','age':25,'mw':'1,80 mill. €','datum_mw':'01/10/2015','x':1443650400000,'marker':{'symbol':'url(http://akacdn.transfermarkt.de/images/wappen/verysmall/4961.png?lm=1409989898)'}}]}]

有没有办法直接下载?我想抓取 600+ 页。

到目前为止,我已经尝试过

page.doc.2 <- xpathSApply(page.doc, "//*/div[@class='eight columns']")
page.doc.2 <- xpathSApply(page.doc, "//*/div[@class='eight columns']", xmlAttrs)

不,无法只下载 JSON 数据:您感兴趣的 JSON 数组作为脚本的一部分嵌入在页面的源代码中。

然后,您可以使用传统的 XPath 或 CSS 选择器来查找脚本元素。但是,如果没有评估 JavaScript 代码的库,仅查找和提取 JSON 部分会更困难。更好的选择肯定是使用官方API(如果存在的话)。

library(rvest) # Better suited for web scraping than httr & xml.
library(rjson)
doc = read_html('http://www.transfermarkt.es/george-corral/marktwertverlauf/spieler/103889')
script = doc %>%
    html_nodes('script') %>%
    html_text() %>%
    grep(pattern = "'series':", value = TRUE)
# Replace JavaScript quotes with JSON quotes
json_content = gsub("'", '"', gsub("^.*'series':", '', script))
# Truncate characters from the end until the result is parseable as valid JSON …
while (nchar(json_content) > 0) {
    json = try(fromJSON(json_content), silent = TRUE)
    if (! inherits(json, 'try-error'))
        break
    json_content = substr(json_content, 1, nchar(json_content) - 1)
}

但是,不能保证上述内容始终有效:毕竟它是JavaScript,而不是JSON;两者相似,但并非每个有效的JavaScript数组都是有效的JSON。

可以

评估JavaScript片段,但这会变得更加复杂。首先,看看 R 的 V8 接口。

相关内容

  • 没有找到相关文章

最新更新