R: веб-очистка формы .aspx со скрытыми полями, ошибка «Неизвестные имена полей» - PullRequest
0 голосов
/ 22 марта 2020

В течение двух дней я пытался понять, как заполнить форму и отправить ее для загрузки .csv файлов из https://www.igb.illinois.gov/VideoReports.aspx. Кажется, я не могу это взломать, к сожалению. Полное раскрытие: я начинающий веб-скребок. Я могу сделать основную очистку, но для меня это новая территория. В конце концов я надеюсь написать программу, которая сведет ежемесячные отчеты о доходах всех заведений к сентябрю 2009 года.

Кажется, основная проблема связана с тем, как выложена форма. Я не могу понять, как определить поля, которые я хотел бы заполнить, чтобы запросить файл .csv. Я использовал rvest и RHTMLForms. Я нашел форму в chrome инструментах разработчика и вижу все, что мне нужно. Кажется, я просто не могу детализировать, куда мне нужно go, чтобы отправить запрос.

Вот где я до сих пор дошел:

library('rvest')
library('RHTMLForms')

igb <- "https://www.igb.illinois.gov/VideoReports.aspx"
igb_html <- read_html(igb)

igbForm <- html_form(igb_html)
igbForm

Кажется, проблема в Начните здесь. «Форма» имеет только один элемент и включает скрытые входные данные. Поля, которые я хочу запросить, находятся ближе к концу. Это выглядит так ...

[[1]]
<form> 'aspnetForm' (POST VideoReports.aspx)
  <input hidden> '__VIEWSTATE': /wEPDwUKMTU1MTExNzA3NQ9kFgJmD2QWAgIDD2QWAgIBD2QWBAIBD2QWEgIDDw8WAh4EVGV4dAUOU2VwdGVtYmVyIDIwMTJkZAIFDw8WAh8ABQ1GZWJydWFyeSAyMDIwZGQCFQ9kFgICAw8QZBAVAg5TdW1tYXJ5IHJlcG9ydA1EZXRhaWwgcmVwb3J0FQIOU3VtbWFyeSByZXBvcnQNRGV0YWlsIHJlcG9ydBQrAwJnZ2RkAhcPZBYCAgMPEA8WBh4ORGF0YVZhbHVlRmllbGQFA0tleR4NRGF0YVRleHRGaWVsZAUFVmFsdWUeC18 ....[TRUNCATE]

и в самом конце я получаю то, что хотел бы запросить ...

  <input radio> 'ctl00$MainPlaceHolder$SearchType': TypeStatewide
  <input radio> 'ctl00$MainPlaceHolder$SearchType': TypeMuni
  <input radio> 'ctl00$MainPlaceHolder$SearchType': TypeEst
  <select> 'ctl00$MainPlaceHolder$SearchStateType' [1/2]
  <select> 'ctl00$MainPlaceHolder$SearchMunicipality' [0/1069]
  <select> 'ctl00$MainPlaceHolder$SearchEstablishment' [0/10182]
  <input text> 'ctl00$MainPlaceHolder$SearchLicenseNumber': 
  <select> 'ctl00$MainPlaceHolder$SearchStartMonth' [1/12]
  <select> 'ctl00$MainPlaceHolder$SearchStartYear' [1/9]
  <select> 'ctl00$MainPlaceHolder$SearchEndMonth' [1/12]
  <select> 'ctl00$MainPlaceHolder$SearchEndYear' [1/9]
  <input radio> 'ctl00$MainPlaceHolder$ViewType': ViewPDF
  <input radio> 'ctl00$MainPlaceHolder$ViewType': ViewCSV

Я использовал следующее для пика в то, что мне нужно ...

igb_form <- getHTMLFormDescription(igb_html)
igb_form[[1]]

... и этот код, чтобы найти поля и значения для каждого из них. Например ...

igb_form_att <- igb_form[[1]]
igb_form_att$elements[[9]]

... показывает мне поле начального месяца и значения из выпадающего меню ...

ctl00$MainPlaceHolder$SearchStartMonth: [ February ]  January, February, March, April, May, June, July, August, September, October, November, December

Я думал, что это будет сделано. Итак, я запустил следующее ...

igb_fill <- set_values(igb_html,
                      'ctl00$MainPlaceHolder$SearchType' = 'TypeEst',
                      'ctl00$MainPlaceHolder$SearchEstablishment'='All Establishments',
                      'ctl00$MainPlaceHolder$SearchEstablishment' ='',
                      'ctl00$MainPlaceHolder$SearchStartMonth'='September',
                      'ctl00$MainPlaceHolder$SearchStartYear'='2009',
                      'ctl00$MainPlaceHolder$SearchEndMonth' ='February',
                      'ctl00$MainPlaceHolder$SearchEndYear'='2020',
                      'ctl00$MainPlaceHolder$ViewType'='ViewCSV')

submit_form(session=igb_html, form=igb_fill, POST(igb))

Но получил эту ошибку ...

Error: Unknown field names: ctl00$MainPlaceHolder$SearchType, ctl00$MainPlaceHolder$SearchEstablishment, ctl00$MainPlaceHolder$SearchStartMonth, ctl00$MainPlaceHolder$SearchStartYear, ctl00$MainPlaceHolder$SearchEndMonth, ctl00$MainPlaceHolder$SearchEndYear, ctl00$MainPlaceHolder$ViewType
Traceback:

1. set_values(igb_form, `ctl00$MainPlaceHolder$SearchType` = "TypeEst", 
 .     `ctl00$MainPlaceHolder$SearchEstablishment` = "All Establishments", 
 .     `ctl00$MainPlaceHolder$SearchEstablishment` = "", `ctl00$MainPlaceHolder$SearchStartMonth` = "September", 
 .     `ctl00$MainPlaceHolder$SearchStartYear` = "2009", `ctl00$MainPlaceHolder$SearchEndMonth` = "February", 
 .     `ctl00$MainPlaceHolder$SearchEndYear` = "2020", `ctl00$MainPlaceHolder$ViewType` = "ViewCSV")
2. stop("Unknown field names: ", paste(no_match, collapse = ", "), 
 .     call. = FALSE)

Извиняюсь за многословный вопрос, но я много возился это и, кажется, не может найти ответ, который помогает мне добраться туда, где мне нужно go. Может быть, я над головой. Но я был бы признателен за любую помощь! (Я также уверен, что код отправки неправильный, но я могу решить эту проблему после этого.)

1 Ответ

0 голосов
/ 25 марта 2020

Были некоторые проблемы с вашим кодом:

  • Функция set_values(...) принимает форму, а не весь html, поэтому я заменил igb_html на igb_form.
  • Функция submit_form(...) занимает html_session, поэтому я заменил read_html(igb) на html_session(igb).

Следующий код должен работать:

library(rvest)

igb <- "https://www.igb.illinois.gov/VideoReports.aspx"
igb_html <- html_session(igb)

igb_form <- html_form(igb_html)[[1]]

igb_fill <- set_values(igb_form,
                       'ctl00$MainPlaceHolder$SearchType' = 'TypeEst',
                       'ctl00$MainPlaceHolder$SearchEstablishment'='All Establishments',
                       'ctl00$MainPlaceHolder$SearchEstablishment' ='',
                       'ctl00$MainPlaceHolder$SearchStartMonth'='September',
                       'ctl00$MainPlaceHolder$SearchStartYear'='2009',
                       'ctl00$MainPlaceHolder$SearchEndMonth' ='February',
                       'ctl00$MainPlaceHolder$SearchEndYear'='2020',
                       'ctl00$MainPlaceHolder$ViewType'='ViewCSV')

igb_html <- submit_form(igb_html, igb_fill, submit = "ctl00$MainPlaceHolder$ButtonSearch")

igb_html
...