2016-09-29 3 views
0

나는 미국의 연방 정부에서 어떤 학습 기계 응용 프로그램을 개발하고 있는지 알고 싶습니다. 연방 정부는 계약이 포함 된 웹 사이트 FedBizOps을 유지 관리합니다. 웹 사이트에서 문구를 검색 할 수 있습니다 (예 : '기계 학습'및 기간 (예 : 관련 계약을 찾기 위해 "지난 365 일". 결과 검색은 계약 요약을 포함하는 링크를 생성합니다.구문을위한 웹 사이트 검색 R

이 사이트에서 검색어 및 날짜 범위가 주어지면 계약서 요약을 볼 수 있습니다.

브라우저에서 렌더링 된 데이터를 R으로 스크래핑 할 수있는 방법이 있습니까? 웹 스크랩에서 비슷한 질문이 exists이지만 기간을 변경하는 방법을 모르겠습니다.

정보가 R로 보내지면 요약 문구를 버블 차트로 정리하고 싶습니다.

답변

3

이것은 자바 스크립트를 통해 XHR을 사용하여 URL 콘텐츠를 검색하는 사이트처럼 보일지 모르지만 그렇지 않습니다. 표준 웹 사이트 rvest & xml2 (html_sessionread_html)으로 쉽게 긁힐 수있는 일반 웹 사이트 일뿐입니다. 그것 Location: URL을 동일하게 유지합니다. 따라서 XHR이 그렇지 않다고 생각하는 것처럼 보입니다.

그러나 이것은 <form> 기반 사이트이므로 커뮤니티에 관대하고 "숨겨진"API에 대한 R 래퍼를 작성하고 rOpenSci에 기부 할 수 있음을 의미합니다. 이를 위해

, 나는 POST 요청의 내용은 "컬로 복사"에 curlconverter 패키지를 사용하고 대부분에 매핑하는 것 모든 양식 필드 (제공 - 전부는 아니더라도을 - 필드의 에 고급 검색 페이지) : 실제로 요청을하려면 req()를 사용할 수 있기 때문에

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:: 접두사를 추가합니다. 그것은 진정한 R 기능입니다.

그러나, 대부분의 데이터는 브라우저 "cruft에"인 전달되고 및 비트를 트리밍 할 수 있고 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") 

차종 캐시 된 curl 처리기 (자동으로 생성 된 &)에 쿠키를 설정하기 위해 기본 URL에서 html_session 또는 GET을 적어도 한 번 사용해야한다고 생각합니다.

add_headers() 비트가 필요하지 않을 수도 있지만 이는 독자에게 남겨진 연습 과제입니다.

당신은을 통해 찾고있는 테이블을 찾을 수 있습니다 - "20 2008 년 1"

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, ... 

이 말을 페이지에 표시 거기는 결과입니다. 당신은 그것도 긁어 내고 페이지 매김 된 결과를 다루어야합니다. 이것은 독자에게 연습으로 남겨 두었습니다.

+0

참고 : curl :: curl_fetch_memory (url, handle = handle) 오류가 발생하면 서버에 연결할 수 없으므로 링크 에서 해결됩니다. http://stackoverflow.com/questions/19641808/r-error- 호스트 연결에 사용됩니다. – user3969377

+0

2008 년 계약 대신 "machine learning"이라는 구문을 포함하고있는 21 건의 계약을 찾기 위해 검색 문자열 "machine + learning"을 "machine learning"으로 따옴표로 묶어야합니다. 계약 목록에 대한 링크를 따르는 방법? 또는 다음 페이지에서 21 번째 예를 얻으시겠습니까? – user3969377

+2

실제로 R 도구를 사용하여 웹 페이지 및 장비 스크래핑을 긁는 방법을 읽으십시오. 당신은 기꺼이 어떤 일을해야합니다. 그리고 검색어에 대한 인용문에 동의하지만 이는 사이트 별 문제이며 내 과제가 아니므로 비슷한 해결책을 찾으려는 다른 사람들에게 주로이 답변을 제공했습니다. "나를 위해이 근근이 살아가는 글 쓰다"라는 질문. – hrbrmstr