R:使用doPostBack脚本中的内容抓取aspx

时间:2019-05-08 20:15:32

标签: javascript r web-scraping rvest

更新2

自从我取得了一些进步以来,我提出了一个新的,更精确的问题: R: scraping data after POST only works for first page

我的计划:

我想从瑞士政府那里获取有关某大学研究项目的药品信息:

http://www.spezialitaetenliste.ch/ShowPreparations.aspx?searchType=Substance&searchValue=

该页面确实提供了robotx.txt文件,但是其内容可免费向公众公开,我认为禁止抓取该数据。

我已经实现的目标:

我可以设法抓取第一个搜索页面的html表:

library("rvest")
library("dplyr)")

url<-"http://www.spezialitaetenliste.ch/ShowPreparations.aspx?searchType=Substance&searchValue="

read_html(url) %>%
  html_nodes(xpath='//*[@id="ctl00_cphContent_gvwPreparations"]') %>%
  html_table() %>%
  bind_rows() %>%
  tibble()

现在,我想抓取列出的药物的详细信息(如果我单击Präparat= preparation列中的链接,它将显示在页面底部)。 但是,此链接不是简单的hmtl,而是doPostBack javascript。

我发现这些脚本遵循以下规则:

  

javascript:__ doPostBack('ctl00 $ cphContent $ gvwPreparations $ ctl02 $ ctl00','')   javascript:__ doPostBack('ctl00 $ cphContent $ gvwPreparations $ ctl03 $ ctl00','')   ...   javascript:__ doPostBack('ctl00 $ cphContent $ gvwPreparations $ ctl16 $ ctl00','')

如此

  

gvw $ Preparations $ .. = gvw $ Preparations $ ctl(清单+1中的Nr)$ ct100

我失败的地方:

我尝试实施此解决方案以获取详细的药品信息:

Scrape website with R by navigating doPostBack

但是

url<-"http://www.spezialitaetenliste.ch/ShowPreparations.aspx?searchType=Substance&searchValue="

pgsession<-html_session(url)
pgform<-html_form(pgsession)[[1]]
page<-rvest:::request_POST(pgsession,"http://www.spezialitaetenliste.ch/ShowPreparations.aspx?searchType=Substance&searchValue=",
                           body=list(
                             `__VIEWSTATE`=pgform$fields$`__VIEWSTATE`$value,
                             `__EVENTTARGET`="ctl00$cphContent$gvwPreparations$ctl02$ctl00",
                             `__EVENTARGUMENT`="",
                             `__VIEWSTATEGENERATOR`=pgform$fields$`__VIEWSTATEGENERATOR`$value,
                             `__VIEWSTATEENCRYPTED`=pgform$fields$`__VIEWSTATEENCRYPTED`$value,
                             `__EVENTVALIDATION`=pgform$fields$`__EVENTVALIDATION`$value
                           ),
                           encode="form"
)


read_html(page) %>% html_nodes(css="ctl00_cphContent_fvwPreparation") 

给我{xml_nodeset (0)}

我认为我的request_POST不正确... 但是,我不知道怎么了。

因此,开放点是:

  • 获取详细信息的正确方法是什么 doPostBack Java脚本(即,如果单击第一列中的链接,则显示在页面末尾的表)

  • 如何获取其他页面的结果(935)?我必须使用 RSelenium并单击结果,如果是,如何将RSeleniumrvest结合起来?还是有更简单的方法 这样做吗?

更新

借助 hrbrmstr 的帮助,我可以(至少部分)解决第一个问题:

https://www.queryxchange.com/q/27_51801321/getting-xml-nodeset-0-when-using-html-nodes-from-rvest-package-in-r/

read_html(page) %>% html_nodes(xpath = '//*[@id="ctl00_cphContent_fvwPreparation"]') %>% html_text

这给了我详细的信息(有点非结构化形式)。

但是,我仍然不知道如何从所有其他页面获取信息。

使用RSelenium,我会做类似的事情:

library("RSelenium")

# star selenum
sel <- remoteDr(browserName = "chrome", port = 4445L)

# go to the URL 
sel %>% 
  go("http://www.spezialitaetenliste.ch/ShowPreparations.aspx?searchType=Substance&searchValue=")


# chose max page
sel %>% 
  findElement(using = 'xpath', "//*/option[@value = '100']") %>%  # find the submit button 
  elementClick()  # click it 

但是,我不知道如何结合RSeleniumrvest

是否可以通过URL选择最多显示的页面,例如

http://www.spezialitaetenliste.ch/ShowPreparations.aspx?PageSize=500

然后选择带有

的下一页
http://www.spezialitaetenliste.ch/ShowPreparations.aspx?PageSize=500&PageNr=2

更新2

自从我取得了一些进步以来,我提出了一个新的,更精确的问题: R: scraping data after POST only works for first page

0 个答案:

没有答案