更新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
并单击结果,如果是,如何将RSelenium
和rvest
结合起来?还是有更简单的方法
这样做吗?
更新
借助 hrbrmstr 的帮助,我可以(至少部分)解决第一个问题:
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
但是,我不知道如何结合RSelenium
和rvest
是否可以通过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