使用R将字段添加到在线表单并抓取生成的javascript创建表

时间:2015-07-08 14:56:39

标签: javascript r web-scraping phantomjs rselenium

我正在努力让R通过邮政编码完成搜索'具有预定义文本(例如BN1 1NA)的此网页http://cti.voa.gov.uk/cti/上的字段,前进到下一页并刮取生成的4列表,根据邮政编码,该表可以在多个页面上。为了使其更加复杂,“改进”指标'不是文本字段,而是图像文件(如果使用邮政编码BN1 3HP进行搜索,则会看到)。我希望此列包含0或1,具体取决于图像是否存在。

最终,我正在使用一个很好的数据框来反映屏幕上的4列。

我试图修改此question的建议,以便在没有运气的情况下完成我上面描述的内容,并且说实话,我试图破译这个建议。

我意识到R可能不是最适合我需要做的事情,但它是我可以获得的全部内容。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:4)

我不确定美国之音网站的T& C对刮痧的看法,但是这段代码可以完成这项工作:

library("httr")
library("rvest")
post_code <- "B1 1"
resp <- POST("http://cti.voa.gov.uk/cti/InitS.asp?lcn=0",
             encode = "form",
             body = list(btnPush = 1,
                         txtPageNum = 0,
                         txtPostCode = post_code,
                         txtRedirectTo = "InitS.asp",
                         txtStartKey = 0))
resp_cont <- read_html(resp)
council_table <- resp_cont %>%
  html_node(".scl_complex table") %>%
  html_table

Firebug有一个出色的“网络”面板,可以看到POST标头。大多数现代浏览器也内置了类似的内容。

答案 1 :(得分:4)

我使用RSelenium取消埃克塞特邮政编码的议会税单:

library(RSelenium)
library(RCurl)
input = 'EX4 2NU'
appURL <- "http://cti.voa.gov.uk/cti/"
RSelenium::startServer()
remDr <- remoteDriver()
remDr$open()
Sys.sleep(5)
remDr$navigate(appURL)
search.form <- remDr$findElement(using = "xpath", "//*[@id='txtPostCode']")
search.form$sendKeysToElement(list(input, key = "enter"))
doc <- remDr$getPageSource()
tbl = xpathSApply(htmlParse(doc[[1]]),'//tbody')
temp1 = readHTMLTable(tbl[[1]],header=F)

v = length(xpathSApply(htmlParse(doc[[1]]),'//a[@class="next"]'))
while (v != 0) {
    nextpage <- remDr$findElement(using = "xpath", "//*[@class = 'next']")
    nextpage$clickElement()
    doc <- remDr$getPageSource()
    tbl = xpathSApply(htmlParse(doc[[1]]),'//tbody')
    temp2 = readHTMLTable(tbl[[1]],header=F)
    temp1 = rbind(temp1,temp2)
    v = length(xpathSApply(htmlParse(doc[[1]]),'//a[@class="next"]'))
}
finaltable = temp1

希望你觉得它有用。有了这个,您可以废弃多个页面数据。