이것은 자바 스크립트를 통해 XHR을 사용하여 URL 콘텐츠를 검색하는 사이트처럼 보일지 모르지만 그렇지 않습니다. 표준 웹 사이트 rvest
& xml2
(html_session
및 read_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, ...
이 말을 페이지에 표시 거기는 결과입니다. 당신은 그것도 긁어 내고 페이지 매김 된 결과를 다루어야합니다. 이것은 독자에게 연습으로 남겨 두었습니다.
참고 : curl :: curl_fetch_memory (url, handle = handle) 오류가 발생하면 서버에 연결할 수 없으므로 링크 에서 해결됩니다. http://stackoverflow.com/questions/19641808/r-error- 호스트 연결에 사용됩니다. – user3969377
2008 년 계약 대신 "machine learning"이라는 구문을 포함하고있는 21 건의 계약을 찾기 위해 검색 문자열 "machine + learning"을 "machine learning"으로 따옴표로 묶어야합니다. 계약 목록에 대한 링크를 따르는 방법? 또는 다음 페이지에서 21 번째 예를 얻으시겠습니까? – user3969377
실제로 R 도구를 사용하여 웹 페이지 및 장비 스크래핑을 긁는 방법을 읽으십시오. 당신은 기꺼이 어떤 일을해야합니다. 그리고 검색어에 대한 인용문에 동의하지만 이는 사이트 별 문제이며 내 과제가 아니므로 비슷한 해결책을 찾으려는 다른 사람들에게 주로이 답변을 제공했습니다. "나를 위해이 근근이 살아가는 글 쓰다"라는 질문. – hrbrmstr