RVEST выберите элемент из выпадающего списка и отправьте форму - PullRequest
0 голосов
/ 09 марта 2020

Я использую rvest для очистки веб-сайта, чтобы загрузить все данные в таблицах. Шаг 1 работает. Я не получаю Шаг 2 правильно:

Шаг 1:

library(rvest)
library(httr)
url<-'http://www.ahw.gov.ab.ca/IHDA_Retrieval/ihdaData.do'
sess<-html_session(url)
sess %>% follow_link(css='#content > div > p:nth-child(8) > a') -> sess
sess %>% follow_link(css='#content > div > table:nth-child(3) > tbody > tr:nth-child(10) > td > a') -> sess

Шаг 2:

pg_form<-html_form(sess)[[2]]
filled_form <-set_values(pg_form, `displayObject.id` = "1006")
d<-submit_form(session=sess, form=filled_form)

Я не уверен, как отправить выбранную форму. Нужно ли использовать селен вместо rvest?

1 Ответ

1 голос
/ 10 марта 2020

Вам не нужно , чтобы использовать RSelenium . Вы можете очистить этот конкретный сайт, используя rvest и httr, но это немного сложно. Вам необходимо научиться отправлять формы в http-запросах. Это требует небольшого изучения лежащих в основе html и http-запросов, отправляемых вашим веб-браузером.

В вашем случае форма на самом деле довольно проста. Он имеет только два поля: поле command, которое всегда равно "doSelect", и поле displayObject.id, которое является уникальным числом для каждого элемента выбора, полученное из атрибутов "value" тегов "option" в html.

Вот как мы можем посмотреть на выпадающие списки и связанные с ними идентификаторы:

library(tidyverse)
library(rvest)
library(httr)

url <- "http://www.ahw.gov.ab.ca/IHDA_Retrieval/"

paste0(url, "ihdaData.do") %>%
GET() %>%
read_html() %>% 
html_node('#content > div > p:nth-child(8) > a') %>%
html_attr("href") %>% 
{paste0(url, .)} %>%
GET() %>%
read_html() %>%
html_node('#content > div > table:nth-child(3) > tbody > tr:nth-child(10) > td > a') %>%
html_attr("href") %>% 
{paste0(url, .)} %>%
GET() %>%
read_html() -> page

pages <- tibble(id = page %>% html_nodes("option") %>% html_attr("value"),
                item = page %>% html_nodes("option") %>% html_text())
pages <- pages[which(pages$item != ""), ]

Это дает нам список доступных элементов на странице:

pages
#> # A tibble: 8 x 2
#>   id    item                                                                    
#>   <chr> <chr>                                                                   
#> 1 724   Human Immunodeficiency Virus (HIV) Incidence Rate (Age Specific)        
#> 2 723   Human Immunodeficiency Virus (HIV) Incidence Rate (by Geography)        
#> 3 886   Human Immunodeficiency Virus (HIV) Proportion (Ethnicity)               
#> 4 887   Human Immunodeficiency Virus (HIV) Proportion (Exposure Cateogory)      
#> 5 719   Notifiable Diseases - Age-Sex Specific Incidence Rate                   
#> 6 1006  Sexually Transmitted Infections (STI) - Age-Sex Specific Case Counts (P~
#> 7 466   Sexually Transmitted Infections (STI) - Age-Sex Specific Rates of Repor~
#> 8 1110  Sexually Transmitted Infections (STI) - Quarterly Congenital Syphilis C~

Теперь, если мы хотим выбрать первый, мы просто публикуем список с необходимыми параметрами по правильному URL, который вы можете найти, проверив консоль разработчика в вашем браузере (F12 в Chrome, Firefox или IE). В данном случае это относительный URL "selectSubCategory.do"

params <- list(command = "doSelect", displayObject.id = pages$id[1])
next_page <- POST(paste0(url, "selectSubCategory.do"), body = params)

Так что теперь next_page содержит html страницы, которую вы искали. К сожалению, в данном случае это еще одна раскрывающаяся страница выбора.

Надеемся, что, следуя приведенным выше методам, вы сможете перемещаться по страницам достаточно хорошо, чтобы получить необходимые данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...