Как получить таблицу из html-формы с помощью rvest или httr?

Я использую R версии 3.3.1. Я пытаюсь удалить данные со следующего веб-сайта:

http://plovila.pomorstvo.hr/

Как видите, это HTML-форма. Я хотел бы выбрать "Tip objekta" (тип объекта), например "Jahta" (Яхта), и ввести "NIB" (целое число, например 93567). Можете попробовать сами; просто выберите «Jahta» и введите 93567 в поле NIB.

Метод POST, введите application/x-www-form-urlencoded. Я пробовал 3 разных подхода: используя rvest, POST (пакет httr) и postForm (Rcurl). Мой код Rvest:

session <- html_session("http://plovila.pomorstvo.hr")
form <- html_form(session)[[1]]
form <- set_values(form,  `ctl00$Content_FormContent$uiTipObjektaDropDown` = 2,
                    `ctl00$Content_FormContent$uiOznakaTextBox` = "",
                    `ctl00$Content_FormContent$uiNibTextBox` = 93567)
x <- submit_form(session, form)

Если я запустил этот код и получу статус 200, но я не понимаю, как мне получить таблицу:

введите здесь описание изображения

Дополнительный шаг - отправить кнопку Detalji и получить дополнительную информацию, но я не вижу никакой информации из вывода x submit.


person Mislav    schedule 26.09.2016    source источник
comment
Похоже, что submit_form пытается использовать второе текстовое поле в качестве кнопки отправки, хотя по какой-то причине я не могу заставить его использовать правильное.   -  person alistaire    schedule 27.09.2016
comment
Я этого не осознавал. мне кажется, он использует правильную кнопку?   -  person Mislav    schedule 27.09.2016
comment
Это дает мне сообщение Submitting with 'ctl00$Content_FormContent$uiNibTextBox', которое не является кнопкой отправки.   -  person alistaire    schedule 27.09.2016
comment
да, вы правы. Может быть, это можно настроить вручную   -  person Mislav    schedule 27.09.2016
comment
Может с параметром submit, но я не могу заставить работать название кнопки по какой-то причине.   -  person alistaire    schedule 27.09.2016
comment
кажется, этот сайт сложно выбросить.   -  person Mislav    schedule 27.09.2016


Ответы (1)


Я использовал пакет curlconverter, чтобы взять данные «Копировать как cURL» из запроса XHR POST и автоматически превратить их в:

httr::VERB(verb = "POST", url = "http://plovila.pomorstvo.hr/", 
    httr::add_headers(Origin = "http://plovila.pomorstvo.hr", 
        `Accept-Encoding` = "gzip, deflate", 
        `Accept-Language` = "en-US,en;q=0.8", 
        `X-Requested-With` = "XMLHttpRequest", 
        Connection = "keep-alive", 
        `X-MicrosoftAjax` = "Delta=true", 
        Pragma = "no-cache", `User-Agent` = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.34 Safari/537.36", 
        Accept = "*/*", `Cache-Control` = "no-cache", 
        Referer = "http://plovila.pomorstvo.hr/", 
        DNT = "1"), httr::set_cookies(ASP.NET_SessionId = "b4b123vyqxnt4ygzcykwwvwr"), 
    body = list(`ctl00$uiScriptManager` = "ctl00$Content_FormContent$ctl00|ctl00$Content_FormContent$uiPretraziButton", 
        ctl00_uiStyleSheetManager_TSSM = ";|635908784800000000:d29ba49:3cef4978:9768dbb9", 
        `ctl00$Content_FormContent$uiTipObjektaDropDown` = "2", 
        `ctl00$Content_FormContent$uiImeTextBox` = "", 
        `ctl00$Content_FormContent$uiNibTextBox` = "93567", 
        `__EVENTTARGET` = "", `__EVENTARGUMENT` = "", 
        `__LASTFOCUS` = "", `__VIEWSTATE` = "/wEPDwUKMTY2OTIzNTI1MA9kFgJmD2QWAgIDD2QWAgIBD2QWAgICD2QWAgIDD2QWAmYPZBYIAgEPZBYCZg9kFgZmD2QWAgIBDxAPFgYeDURhdGFUZXh0RmllbGQFD05heml2VGlwT2JqZWt0YR4ORGF0YVZhbHVlRmllbGQFDElkVGlwT2JqZWt0YR4LXyFEYXRhQm91bmRnZBAVBAAHQnJvZGljYQVKYWh0YQbEjGFtYWMVBAEwATEBMgEzFCsDBGdnZ2cWAQICZAIBDw8WAh4HVmlzaWJsZWdkFgICAQ8PFgIfA2dkZAICDw8WAh8DaGQWAgIBDw8WBB4EVGV4dGUfA2hkZAIHDzwrAA4CABQrAAJkFwEFCFBhZ2VTaXplAgoBFgIWCw8CCBQrAAhkZGRkZDwrAAUBBAUHSWRVcGlzYTwrAAUBBAUISWRVbG9za2E8KwAFAQQFBlNlbGVjdGRlFCsAAAspelRlbGVyaWsuV2ViLlVJLkdyaWRDaGlsZExvYWRNb2RlLCBUZWxlcmlrLldlYi5VSSwgVmVyc2lvbj0yMDEzLjMuMTExNC40MCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0xMjFmYWU3ODE2NWJhM2Q0ATwrAAcACyl1VGVsZXJpay5XZWIuVUkuR3JpZEVkaXRNb2RlLCBUZWxlcmlrLldlYi5VSSwgVmVyc2lvbj0yMDEzLjMuMTExNC40MCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0xMjFmYWU3ODE2NWJhM2Q0ARYCHgRfZWZzZGQWBB4KRGF0YU1lbWJlcmUeBF9obG0LKwQBZGZkAgkPZBYCZg9kFgJmD2QWIAIBD2QWBAIDDzwrAAgAZAIFDzwrAAgAZAIDD2QWBAIDDzwrAAgAZAIFDzwrAAgAZAIFD2QWAgIDDzwrAAgAZAIHD2QWBAIDDzwrAAgAZAIFDzwrAAgAZAIJD2QWBAIDDzwrAAgAZAIFDzwrAAgAZAILD2QWBgIDDxQrAAI8KwAIAGRkAgUPFCsAAjwrAAgAZGQCBw8UKwACPCsACABkZAIND2QWBgIDDxQrAAI8KwAIAGRkAgUPFCsAAjwrAAgAZGQCBw8UKwACPCsACABkZAIPD2QWAgIDDxQrAAI8KwAIAGRkAhEPZBYGAgMPPCsACABkAgUPPCsACABkAgcPPCsACABkAhMPZBYGAgMPPCsACABkAgUPPCsACABkAgcPPCsACABkAhUPZBYCAgMPPCsACABkAhcPZBYGAgMPPCsACABkAgUPPCsACABkAgcPPCsACABkAhkPPCsADgIAFCsAAmQXAQUIUGFnZVNpemUCBQEWAhYLZGRlFCsAAAsrBAE8KwAHAAsrBQEWAh8FZGQWBB8GZR8HCysEAWRmZAIbDzwrAA4CABQrAAJkFwEFCFBhZ2VTaXplAgUBFgIWC2RkZRQrAAALKwQBPCsABwALKwUBFgIfBWRkFgQfBmUfBwsrBAFkZmQCHQ88KwAOAgAUKwACZBcBBQhQYWdlU2l6ZQIFARYCFgtkZGUUKwAACysEATwrAAcACysFARYCHwVkZBYEHwZlHwcLKwQBZGZkAiMPPCsADgIAFCsAAmQXAQUIUGFnZVNpemUCBQEWAhYLZGRlFCsAAAsrBAE8KwAHAAsrBQEWAh8FZGQWBB8GZR8HCysEAWRmZAILD2QWAmYPZBYCZg9kFgICAQ88KwAOAgAUKwACZBcBBQhQYWdlU2l6ZQIFARYCFgtkZGUUKwAACysEATwrAAcACysFARYCHwVkZBYEHwZlHwcLKwQBZGZkZIULy2JISPTzELAGqWDdBkCVyvvKIjo/wm/iG9PT1dlU", 
        `__VIEWSTATEGENERATOR` = "CA0B0334", 
        `__PREVIOUSPAGE` = "jGgYHmJ3-6da6PzGl9Py8IDr-Zzb75YxIFpHMz4WQ6iQEyTbjWaujGRHZU-1fqkJcMyvpGRkWGStWuj7Uf3NYv8Wi0KSCVwn435kijCN2fM1", 
        `__ASYNCPOST` = "true", 
        `ctl00$Content_FormContent$uiPretraziButton` = "Pretraži"), 
    encode = "form") -> res

Вы можете увидеть результат через:

content(res, as="text") # returns raw HTML 

or

content(res, as="parsed") # returns something you can use with `rvest` / `xml2`

К сожалению, это еще один бесполезный веб-сайт SharePoint, который сайты «электронного правительства» по всему миру купили как хорошее занятие. Это означает, что вам придется методом проб и ошибок выяснить, какой из этих параметров необходим, поскольку практически на каждом сайте они разные. Я попробовал минимальный набор, но безрезультатно.

Возможно, вам даже придется сначала отправить GET запрос на главный сайт, чтобы установить сеанс.

Но это должно заставить вас двигаться в правильном направлении.

person hrbrmstr    schedule 26.09.2016
comment
Первый код (content(res, as="text")) дает мне ошибку: Error: is.response(x) is not TRUE. Второй дает мне какой-то странный текстовый объект, в котором я не вижу никаких данных. Почему вы говорите, что этот сайт бесполезен? Что вы посоветуете, как продолжить? Как оформить GET-запрос на основной сайт? Я не знаю, как вы взяли все это в httr::... - person Mislav; 27.09.2016
comment
Я не могу удержать тебя через это. Я объяснил шаги, которые я предпринял, и что это сайт SharePoint, который очень сложно очистить (и он бесполезен, потому что они решили использовать SharePoint, а не настоящие веб-технологии). Если вы не можете заставить эту идиому работать, попробуйте использовать RSelenium. - person hrbrmstr; 27.09.2016
comment
это, наверное, слишком сложная задача для меня. Спасибо за помощь. - person Mislav; 27.09.2016
comment
вы предлагаете утилизировать с помощью rsillenim? почему это лучше, чем другие пакеты? - person Mislav; 27.09.2016