Это может выглядеть как сайт, который использует XHR через javascript для извлечения содержимого URL-адреса, но это не так. Это простой веб-сайт, который можно легко очистить по стандарту rvest
& xml2
звонки как html_session
и read_html
. Это делает URL-адрес Location:
одинаковый, поэтому он выглядит как XHR, даже подумал, что это не так.
Тем не менее, это сайт, основанный на <form>
, что означает, что вы могли бы быть щедрым для сообщества и написать R-обертку для «скрытого» API и, возможно, пожертвовать ее rOpenSci.
С этой целью я использовал curlconverter
пакет на «Копировать как закручивание» контента из POST
запроса и при условии, все поля формы (которые, кажется, карта наиболее - если не все - из полей на расширенный поиск страница):
library(curlconverter)
make_req(straighten())[[1]] -> req
httr::VERB(verb = "POST", url = "https://www.fbo.gov/index?s=opportunity&mode=list&tab=list",
httr::add_headers(Pragma = "no-cache",
Origin = "https://www.fbo.gov",
`Accept-Encoding` = "gzip, deflate, br",
`Accept-Language` = "en-US,en;q=0.8",
`Upgrade-Insecure-Requests` = "1",
`User-Agent` = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.41 Safari/537.36",
Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
`Cache-Control` = "no-cache",
Referer = "https://www.fbo.gov/index?s=opportunity&mode=list&tab=list",
Connection = "keep-alive",
DNT = "1"), httr::set_cookies(PHPSESSID = "32efd3be67d43758adcc891c6f6814c4",
sympcsm_cookies_enabled = "1",
BALANCEID = "balancer.172.16.121.7"),
body = list(`dnf_class_values[procurement_notice][keywords]` = "machine+learning",
`dnf_class_values[procurement_notice][_posted_date]` = "365",
search_filters = "search",
`_____dummy` = "dnf_",
so_form_prefix = "dnf_",
dnf_opt_action = "search",
dnf_opt_template = "VVY2VDwtojnPpnGoobtUdzXxVYcDLoQW1MDkvvEnorFrm5k54q2OU09aaqzsSe6m",
dnf_opt_template_dir = "Pje8OihulaLVPaQ+C+xSxrG6WrxuiBuGRpBBjyvqt1KAkN/anUTlMWIUZ8ga9kY+",
dnf_opt_subform_template = "qNIkz4cr9hY8zJ01/MDSEGF719zd85B9",
dnf_opt_finalize = "0",
dnf_opt_mode = "update",
dnf_opt_target = "", dnf_opt_validate = "1",
`dnf_class_values[procurement_notice][dnf_class_name]` = "procurement_notice",
`dnf_class_values[procurement_notice][notice_id]` = "63ae1a97e9a5a9618fd541d900762e32",
`dnf_class_values[procurement_notice][posted]` = "",
`autocomplete_input_dnf_class_values[procurement_notice][agency]` = "",
`dnf_class_values[procurement_notice][agency]` = "",
`dnf_class_values[procurement_notice][zipstate]` = "",
`dnf_class_values[procurement_notice][procurement_type][]` = "",
`dnf_class_values[procurement_notice][set_aside][]` = "",
mode = "list"), encode = "form")
curlconverter
добавляет httr::
префиксы к различным функциям, так как вы можете использовать req()
, чтобы сделать запрос. Это функция bona-fide R.
Однако большинство данных, передаваемых в это браузер «хлама» и может быть урезана немного, и переехал в POST
запроса:
library(httr)
library(rvest)
POST(url = "https://www.fbo.gov/index?s=opportunity&mode=list&tab=list",
add_headers(Origin = "https://www.fbo.gov",
Referer = "https://www.fbo.gov/index?s=opportunity&mode=list&tab=list"),
set_cookies(PHPSESSID = "32efd3be67d43758adcc891c6f6814c4",
sympcsm_cookies_enabled = "1",
BALANCEID = "balancer.172.16.121.7"),
body = list(`dnf_class_values[procurement_notice][keywords]` = "machine+learning",
`dnf_class_values[procurement_notice][_posted_date]` = "365",
search_filters = "search",
`_____dummy` = "dnf_",
so_form_prefix = "dnf_",
dnf_opt_action = "search",
dnf_opt_template = "VVY2VDwtojnPpnGoobtUdzXxVYcDLoQW1MDkvvEnorFrm5k54q2OU09aaqzsSe6m",
dnf_opt_template_dir = "Pje8OihulaLVPaQ+C+xSxrG6WrxuiBuGRpBBjyvqt1KAkN/anUTlMWIUZ8ga9kY+",
dnf_opt_subform_template = "qNIkz4cr9hY8zJ01/MDSEGF719zd85B9",
dnf_opt_finalize = "0",
dnf_opt_mode = "update",
dnf_opt_target = "", dnf_opt_validate = "1",
`dnf_class_values[procurement_notice][dnf_class_name]` = "procurement_notice",
`dnf_class_values[procurement_notice][notice_id]` = "63ae1a97e9a5a9618fd541d900762e32",
`dnf_class_values[procurement_notice][posted]` = "",
`autocomplete_input_dnf_class_values[procurement_notice][agency]` = "",
`dnf_class_values[procurement_notice][agency]` = "",
`dnf_class_values[procurement_notice][zipstate]` = "",
`dnf_class_values[procurement_notice][procurement_type][]` = "",
`dnf_class_values[procurement_notice][set_aside][]` = "",
mode="list"),
encode = "form") -> res
Эта часть:
set_cookies(PHPSESSID = "32efd3be67d43758adcc891c6f6814c4",
sympcsm_cookies_enabled = "1",
BALANCEID = "balancer.172.16.121.7")
делает я думаю, вы должны использовать html_session
или GET
по крайней мере один раз на основном URL-адресе, чтобы установить эти файлы cookie в кэшированном обработчике curl
(который будет создан автоматически &).
Возможно, бит add_headers()
не нужен, но это упражнение осталось для читателя.
Вы можете найти таблицу, которую вы ищете с помощью:
content(res, as="text", encoding="UTF-8") %>%
read_html() %>%
html_nodes("table.list") %>%
html_table() %>%
dplyr::glimpse()
## Observations: 20
## Variables: 4
## $ Opportunity <chr> "NSN: 1650-01-074-1054; FILTER ELEMENT, FLUID; WSIC: L SP...
## $ Agency/Office/Location <chr> "Defense Logistics Agency DLA Acquisition LocationsDLA Av...
## $ Type/Set-aside <chr> "Presolicitation", "Presolicitation", "Award", "Award", "...
## $ Posted On <chr> "Sep 28, 2016", "Sep 28, 2016", "Sep 28, 2016", "Sep 28, ...
Там есть индикатор на странице говорят эти результаты «1 - 20 из 2008». Вам также нужно очистить и обработать результаты с разбивкой по страницам. Это также рассматривается как упражнение для читателя.
Обратите внимание, что если вы получите ошибку curl :: curl_fetch_memory (url, handle = handle) Не удалось подключиться к серверу, оно решено по ссылке http://stackoverflow.com/questions/19641808/r-error- в-связи-хост. – user3969377
Кажется, что поисковая строка «машина + обучение» должна быть помещена в кавычки как «машинное обучение», чтобы найти 21 контракт, содержащий фразу «машинное обучение», вместо контрактов 2008 года. Как перейти по ссылке на список контрактов? Или получить 21-й пример на следующей странице? – user3969377
Фактически прочитайте, как очистить веб-страницы и скребки инструмента с помощью инструментов R. Вы должны быть готовы к работе _some_. И я согласен с котировками для поискового запроса, но это специфичная для сайта вещь, и это не мое задание, поэтому я дал этот ответ в первую очередь тем, кто пытается найти похожие решения, поскольку я был осторожен, чтобы это превратилось в вопрос «напиши мне этот вопрос». – hrbrmstr