Подтвердить что ты не робот

Использование R для добавления поля в онлайн-форму и скрипирования в результате создания таблицы, созданной javascript

Я пытаюсь получить R, чтобы заполнить поле "Поиск по почтовому индексу" на этой веб-странице http://cti.voa.gov.uk/cti/ с предопределенным текстом (например, BN1 1NA), перейдите на следующую страницу и очистите итоговую таблицу столбцов, которая, в зависимости от почтового индекса, может быть на нескольких страницах. Чтобы сделать его более сложным, "индикатор улучшения" не является текстовым полем, а скорее файлом изображения (как видно, если вы просматриваете почтовый индекс BN1 3HP). Я бы предпочел, чтобы этот столбец содержал 0 или 1 в зависимости от того, присутствует ли изображение.

В конечном итоге я получаю хороший кадр данных, который отображает 4 столбца на экране.

Я попытался изменить предложения от question, чтобы сделать то, что я описал выше, без везения, и, честно говоря, я вышел из своей глубины пытаясь расшифровать этот.

Я понимаю, что R не может быть самым подходящим для того, что мне нужно сделать, но все, что у меня есть для меня. Любая помощь будет принята с благодарностью.

4b9b3361

Ответ 1

Я не уверен, что T & C веб-сайта VOA должен сказать о выскабливании, но этот код выполнит эту работу:

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. В большинстве современных браузеров есть что-то подобное.

Ответ 2

Я использую RSelenium для отказа от налогового списка совета по почтовому индексу Exeter:

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

Надеюсь, вы сочтете это полезным. С помощью этого вы можете отказаться от нескольких данных на странице.