2016-09-29 8 views
0

Я хотел бы понять, какие приложения машинного обучения разрабатываются федеральным правительством США. Федеральное правительство поддерживает сайт FedBizOps, содержащий контракты. На веб-сайте можно найти фразу, например. «машинное обучение» и диапазон дат, например. «последние 365 дней», чтобы найти соответствующие контракты. В результате поиска появляются ссылки, содержащие сводку контракта.Seach website for phrase in R

Я хотел бы иметь возможность вытащить резюме контрактов с учетом поискового запроса и диапазона дат с этого сайта.

Есть ли способ очистить данные, полученные от браузера, до R? Аналогичный вопрос exists на веб-соскабливание, но я не знаю, как изменить диапазон дат.

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

ответ

3

Это может выглядеть как сайт, который использует 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». Вам также нужно очистить и обработать результаты с разбивкой по страницам. Это также рассматривается как упражнение для читателя.

+0

Обратите внимание, что если вы получите ошибку curl :: curl_fetch_memory (url, handle = handle) Не удалось подключиться к серверу, оно решено по ссылке http://stackoverflow.com/questions/19641808/r-error- в-связи-хост. – user3969377

+0

Кажется, что поисковая строка «машина + обучение» должна быть помещена в кавычки как «машинное обучение», чтобы найти 21 контракт, содержащий фразу «машинное обучение», вместо контрактов 2008 года. Как перейти по ссылке на список контрактов? Или получить 21-й пример на следующей странице? – user3969377

+2

Фактически прочитайте, как очистить веб-страницы и скребки инструмента с помощью инструментов R. Вы должны быть готовы к работе _some_. И я согласен с котировками для поискового запроса, но это специфичная для сайта вещь, и это не мое задание, поэтому я дал этот ответ в первую очередь тем, кто пытается найти похожие решения, поскольку я был осторожен, чтобы это превратилось в вопрос «напиши мне этот вопрос». – hrbrmstr