使用RSelenium触发doPostBack javascript以废弃多页表格

时间:2018-04-11 08:47:21

标签: r web-scraping rvest rselenium

我正在努力寻找网络废料'表格中的数据跨越多个页面。页面通过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帖子hereherehere。我还看到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页及其后续脚本不可见,因此无法触发它们。

0 个答案:

没有答案