【问题标题】:Scrape a page with JavaScript from R使用 R 中的 JavaScript 抓取页面
【发布时间】:2014-12-06 01:28:04
【问题描述】:

我是 R 中网络抓取的新手,最近在引用 javascript 的网站上遇到了问题。我试图从下面的网页中抓取数据,但没有成功。我相信 javascript 链接阻止我访问该表。结果,带有函数“readHTMLTable”的 R 包“XML”为空。

library(XML)
library(RCurl)
url <- "http://votingrights.news21.com/interactive/movement-voter-id/index.html"
tabs <- getURL(url)
tabs <- htmlParse(url)
tabs <- readHTMLTable(tabs, stringsAsFactors = FALSE)

如何访问 javascript 链接以获取数据?或者这甚至可能吗?当使用数据的直接链接(如下)和 R 包“rjson”时,我仍然无法读取数据。

library("rjson")
json_file <- "http://votingrights.news21.com/static/interactives/movement/data/fulldata.js"
lines <- readLines(json_file)
json_data <- fromJSON(lines, collapse="")

【问题讨论】:

    标签: javascript html r web-scraping


    【解决方案1】:

    您引用的文件是包含 JSON 而不是 JSON 的 javascript 文件。在这种情况下,您可以手动清理内容以获取数据:

    library("rjson")
    json_file <- "http://votingrights.news21.com/static/interactives/movement/data/fulldata.js"
    lines <- readLines(json_file)
    lines[1] <- sub(".* = (.*)", "\\1", lines[1])
    lines[length(lines)] <- sub(";", "", lines[length(lines)])
    json_data <- fromJSON(paste(lines, collapse="\n"))
    > head(json_data[[1]][[1]])
    $state
    [1] "Alabama"
    
    $bill
    [1] "HB 19"
    
    $category
    [1] "Strict photo ID"
    
    $introduced
    [1] "Mar 1, 2011"
    
    $house
    [1] "Yes"
    
    $senate
    [1] "Yes"
    

    如果你想与网页上的 javascript 数据进行交互,你可以使用 Selenium:

    library(RSelenium)
    appURL <- "http://votingrights.news21.com/static/interactives/movement/index.html"
    pJS <- phantom()
    remDr <- remoteDriver(browserName = "phantom")
    remDr$open()
    remDr$navigate(appURL)
    fullData <- remDr$executeScript("return fullData;")
    pJS$stop()
    > head(fullData[[1]][[1]])
    $state
    [1] "Alabama"
    
    $bill
    [1] "HB 19"
    
    $category
    [1] "Strict photo ID"
    
    $introduced
    [1] "Mar 1, 2011"
    
    $house
    [1] "Yes"
    
    $senate
    [1] "Yes"
    

    【讨论】:

    • 谢谢!我以前试过这个,但我错过了你将“;”替换掉的步骤出来,所以无法让它工作。这个解决方案效果很好。但是,我想知道是否有一个包可以读取这种类型的脚本,而不必每次都手动清理内容......
    • 您可以使用 Selenium 并直接访问 javascript 数据。在cran.r-project.org/web/packages/RSelenium/index.html 上查看各种小插曲
    • 几天前我遇到了类似的问题。我选择了 RSelenium 并很好地解决了它。 stackoverflow.com/questions/27305824/… 你可能会感兴趣
    • 谢谢。我会检查 RSelenium。
    猜你喜欢
    • 1970-01-01
    • 2022-11-17
    • 2011-12-24
    相关资源
    最近更新 更多