我正在努力寻找网络废料'表格中的数据跨越多个页面。页面通过javascript链接。
我感兴趣的数据基于网站的搜索功能:
url <- "http://aims.niassembly.gov.uk/plenary/searchresults.aspx?tb=0&tbv=0&tbt=All%20Members&pt=7&ptv=7&ptt=Petition%20of%20Concern&mc=0&mcv=0&mct=All%20Categories&mt=0&mtv=0&mtt=All%20Types&sp=1&spv=0&spt=Tabled%20Between&ss=jc7icOHu4kg=&tm=2&per=1&fd=01/01/2011&td=17/04/2018&tit=0&txt=0&pm=0&it=0&pid=1&ba=0"
我可以使用rvest
包下载第一页:
library(rvest)
library(tidyverse)
NI <- read_html(url)
NI.res <- NI %>%
html_nodes("table") %>%
html_table(fill=TRUE)
NI.res <- NI.res[[1]][c(1:10),c(1:5)]
到目前为止一切顺利。
据我了解,RSelenium
软件包是使用javascript /在网站上导航的方式,当通过更改网址进行html报废时是不可能的。我安装了软件包并与Docker Quicktool Box一起运行(一切正常),
library (RSelenium)
shell('docker run -d -p 4445:4444 selenium/standalone-chrome')
remDr <- remoteDriver(remoteServerAddr = "192.168.99.100",
port = 4445L,
browserName = "chrome")
remDr$open()
我希望通过触发javascript我可以导航到下一页并重复rvest
命令并获取包含在例如{1}}上的数据。第2页,第3页等页面(最终应该是循环或purrr::map
函数的一部分)。
导航到包含搜索结果的表格(第1页):
remDr$navigate("http://aims.niassembly.gov.uk/plenary/searchresults.aspx?tb=0&tbv=0&tbt=All%20Members&pt=7&ptv=7&ptt=Petition%20of%20Concern&mc=0&mcv=0&mct=All%20Categories&mt=0&mtv=0&mtt=All%20Types&sp=1&spv=0&spt=Tabled%20Between&ss=jc7icOHu4kg=&tm=2&per=1&fd=01/01/1989&td=01/04/2018&tit=0&txt=0&pm=0&it=0&pid=1&ba=0")
触发javascript。 javascript的内容取自将鼠标悬停在网站上的页面索引(表格下方)上。在下面的情况下,触发了导致第2页的javascript:
remDr$executeScript("__doPostBack('ctl00$MainContentPlaceHolder$SearchResultsGridView','Page$2');", args=list("dummy"))
使用rvest
url <- "http://aims.niassembly.gov.uk/plenary/searchresults.aspx?tb=0&tbv=0&tbt=All%20Members&pt=7&ptv=7&ptt=Petition%20of%20Concern&mc=0&mcv=0&mct=All%20Categories&mt=0&mtv=0&mtt=All%20Types&sp=1&spv=0&spt=Tabled%20Between&ss=jc7icOHu4kg=&tm=2&per=1&fd=01/01/2011&td=17/04/2018&tit=0&txt=0&pm=0&it=0&pid=1&ba=0"
NI <- read_html(url)
NI.res <- NI %>%
html_nodes("table") %>%
html_table(fill=TRUE)
NI.res2 <- NI.res[[1]][c(1:10),c(1:5)]
不幸但是,javascript的触发似乎不起作用。废弃的结果再次来自第1页,而不是第2页。我可能会遗漏一些相当基本的内容,但我无法弄清楚是什么。
我的尝试部分来自SO帖子here,here和here。我还看到this帖子。
背景信息:最后,在进一步的步骤中,我将不得不触发对所有页面上显示的每个查找/行的点击,并废弃每个条目背后的信息。因此,据我所知,RSelenium将成为这里的主要工具。
感谢任何提示!
更新
我做了一些&#39;建议采用here方法后的进展。它a)仍然没有做我打算做的所有事情,而且b)很可能不是最优雅的方式。但也许对他人有所帮助/开辟了前进的道路。请注意,此方法不需要RSelenium。
我基本上为每个javascript(页面索引)创建了一个循环,导致我要废弃的表的另一个页面。关键细节是EVENTARGUMENT
参数,我为其分配了相应的页码(我对js的了解基本为零)。
for (i in 2:15) {
target<- paste0("Page$",i)
page<-rvest:::request_POST(pgsession,"http://aims.niassembly.gov.uk/plenary/searchresults.aspx?tb=0&tbv=0&tbt=All%20Members&pt=7&ptv=7&ptt=Petition%20of%20Concern&mc=0&mcv=0&mct=All%20Categories&mt=0&mtv=0&mtt=All%20Types&sp=1&spv=0&spt=Tabled%20Between&ss=jc7icOHu4kg=&tm=2&per=1&fd=01/01/2011&td=17/04/2018&tit=0&txt=0&pm=0&it=0&pid=1&ba=0",
body=list(
`__VIEWSTATE`=pgform$fields$`__VIEWSTATE`$value,
`__EVENTTARGET`="ctl00$MainContentPlaceHolder$SearchResultsGridView",
`__EVENTARGUMENT`= target, `__VIEWSTATEGENERATOR`=pgform$fields$`__VIEWSTATEGENERATOR`$value,
`__VIEWSTATEENCRYPTED`=pgform$fields$`__VIEWSTATEENCRYPTED`$value,
`__EVENTVALIDATION`=pgform$fields$`__EVENTVALIDATION`$value
),
encode="form")
x <- read_html(page) %>%
html_nodes(css = "#ctl00_MainContentPlaceHolder_SearchResultsGridView") %>%
html_table(fill=TRUE) %>%
as.data.frame()
d<- x[c(1:paste(nrow(x)-2)),c(1:5)]
page.list[[i]] <- d
i=i+1
}
但是,此代码无法触发javascript /转到打开网站时在表格下方的页面索引中不可见的页面(1 - 11)。此循环只能废弃第2到11页。由于第12页及其后续脚本不可见,因此无法触发它们。