【问题标题】:Using rvest to fill out search form and download attachments使用 rvest 填写搜索表并下载附件
【发布时间】:2017-05-08 18:22:10
【问题描述】:

我正在尝试使用 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 中的任何其他包下载附件的帮助将不胜感激。非常感谢!

【问题讨论】:

  • 您能否分享其他搜索参数,例如归档 ID、确认 ID。
  • 您将需要RSelenium 来填写表格,如果您可以单独使用rvest,我会感到惊讶。

标签: r web-scraping rvest


【解决方案1】:

这并不能解决您的问题(有大量的 RSelenium SO 响应和博客文章来帮助您使用 RSelenium),但是对于这个站点来说,您必须这样做的“原因”是丑陋的(它提供了一个指向您的位置的指针必须以 URL 方式启动 RSelenium 方法才能工作)。

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

填写完这两个字段后,它会发出一个如下所示的POST 请求(以“复制为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'

我发布它是为了让您看到它提交的一些附加字段,这些字段最初并不直接在 &lt;form&gt; 中。

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 重定向响应,最终会导致您被重定向到结果页面,实际结果位于 &lt;&lt;table role="treegrid"&gt; 中(旨在帮助您在它返回的可怕 HTML 中定位表格)。

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

自动导航中的任何错误步骤都将导致会话中断。因此,您可能需要进行繁琐的试错以确保目标选择操作正确。

【讨论】:

    猜你喜欢
    • 2021-04-29
    • 1970-01-01
    • 2017-07-25
    • 2018-11-23
    • 2021-02-01
    • 2020-10-07
    • 2013-01-21
    • 2015-10-20
    • 2017-07-22
    相关资源
    最近更新 更多