使用rvest填写搜索表单并下载附件

时间:2016-12-23 03:26:08

标签: r web-scraping rvest

我正试图用rvest刮掉劳工部的数据。我有一个EIN和PN列表(网络搜索表单中的参数)我想搜索。这就是我到目前为止所拥有的:

library(rvest)
library(magrittr)

## URL to page with search form to be populated
site <- "http://www.efast.dol.gov/portal/app/disseminate?execution=e1s1"

session <- html_session(site)

form <- session %>%
  html_nodes("form") %>%
  extract2(1) %>%
  html_form() %>%
  set_values(`ein` = "060646973", # example EIN
             `pn` = "001") # example PN

result <- submit_form(session, form)

这会导致出现一个包含计划列表的页面。但是,我对rvest不熟悉,不知道如何浏览结果页面并下载附件。它很容易在浏览器中完成,但我想编写一个脚本来自动完成任务。

使用rvest或R中的任何其他软件包导航生成的网页和下载附件的任何帮助都将非常感激。非常感谢你!

1 个答案:

答案 0 :(得分:1)

这并不能解决您的问题(有很多RSelenium SO响应和博客帖子可以帮助您使用RSelenium),但您必须使用的“原因”对于此站点来说是丑陋的(并且它提供了指向您的位置)必须以URL方式启动RSelenium方法才能工作。)

该站点在服务器端使用“Java Server Faces”以及javascript来维护状态和扩充导航。您实际上 https://www.efast.dol.gov/portal/app/disseminate开始,因此后端可以正确启动您的会话。

填写完这两个字段后,它会生成一个POST请求,如下所示(以“Copy as cURL”格式):

curl -i -s -k  
     -X 'POST'
     -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:43.0) Gecko/20100101 Firefox/43.0' 
     -H 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' -H 'Faces-Request: partial/ajax' 
     -H 'X-Requested-With: XMLHttpRequest' -H 'Referer: https://www.efast.dol.gov/portal/app/disseminate?execution=e1s1' 
     -b 'JSESSIONID=0000UG27GxfJ4sVgFVXnUi3Ix9C:18fl2akcj' 
     --data-binary $'javax.faces.partial.ajax=true&javax.faces.source=form%3Anextbtn&javax.faces.partial.execute=%40all&javax.faces.partial.render=form&form%3Anextbtn=form%3Anextbtn&form=form&planName=&sponsorName=&administratorName=&filingId=&ackId=&ein=060646973&pn=001&form%3Aj_idt939%3Apybcalendar_input=&form%3Aj_idt942%3Apyecalendar_input=&formYear=&form%3AnumResults_input=100&form%3AnumResults_editableInput=100&javax.faces.ViewState=e1s1' 
    'https://www.efast.dol.gov/portal/app/disseminate?execution=e1s1'

我发布这个帖子是为了让您看到它提交的一些其他字段,这些字段最初并非直接位于<form>

POST的反应如下:

HTTP/1.1 200 OK
X-Powered-By: Servlet/3.0
Pragma: no-cache
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Cache-Control: no-cache
Cache-Control: no-store
X-Powered-By: JSF/2.0
X-Powered-By: JSF/2.0
X-UA-Compatible: IE=EmulateIE7
Content-Type: application/xml; charset=UTF-8
Content-Language: en-US
Date: Fri, 23 Dec 2016 13:10:26 GMT
Content-Length: 142
Connection: keep-alive

<?xml version='1.0' encoding='UTF-8'?>
<partial-response><redirect url="/portal/app/disseminate?execution=e1s2"></redirect></partial-response>

这是一个Java Server Faces AJAX重定向响应,它最终会导致您被重定向到结果页面,其实际结果位于<<table role="treegrid">(用于帮助您在返回的可怕HTML中定位表)。 / p>

然后,您需要弄清楚如何确保您可以单击复选框并下载信息。

自动导航中的任何错误步骤都会导致会话中断。所以,你可能会参与一个乏味的试验和确保目标选择操作正确的错误。