使用R语言根据JavaScript语句下载文件

6
我想创建一个R脚本,其中包括从http://www.fangraphs.com/projections.aspx?pos=all&stats=bat&type=zips下载棒球选手预测数据的功能。网页上有一个链接可以将这些数据导出为.csv格式,位于数据表右上角附近,但它似乎是一个JavaScript命令(javascript:__doPostBack('ProjectionBoard1$cmdCSV','')。我熟悉使用download.file()来使用链接下载.csv文件,但不确定如何处理这个问题。
如何使用R提取这些数据?

看起来你只需要点击“导出数据->保存”,然后使用read.csv - Rich Scriven
谢谢,如果需要的话,那就是我的做法。我希望有一种方法可以让 R 直接下载文件。我想定期运行脚本,因为某些数据会发生变化,希望尽可能自动化。 - user3271783
2个回答

1
下载不是一个简单的响应,可以通过download.file轻松检索。网页构建了一个FORM和一些巨大的参数来存储网页的状态,然后将此传递给服务器(以及大量cookies)以获得CSV响应。
为了使这个工作在R中(或任何其他编程语言),你需要构造该响应,通常你只能通过首先获取网页、爬取FORM参数(和cookies),然后构造你单击链接时执行的精确POST请求来完成。
这可能是使用RCurl实现的,如果你有一个可以保存POST请求参数的浏览器,那么使用RCurl读取它们有时会更容易。
Web scraping中另一种常见技术是基本上运行可以被脚本语言自动化的浏览器。有一个利用Selenium的R包可能能够做到这一点:

http://cran.r-project.org/web/packages/RSelenium/index.html

这里有一些相关但不重复的问题,比如:

如何使用R从需要cookies的SSL页面下载压缩文件

几年前的一个R-help帖子也提供了一些建议:

https://stat.ethz.ch/pipermail/r-help//2012-September/335769.html


正如@Spacedman所指出的,这是一个asp表单,POST请求比较复杂。您可以尝试使用Curl来复制它。虽然您也可以使用Selenium,但该过程稍微有些复杂,因为Selenium通常不用于下载文件,请参见https://dev59.com/NHzaa4cB1Zd3GeqPUcvQ#21958555。 - jdharrison

0

我曾经遇到过类似的问题,尝试下载多个 .pdf 文件时。我找到的解决方案如下:

[1]. 获取所有 .pdf 链接,例如这个链接:

link <- "http://www.biblioteca.presidencia.gov.br/presidencia/ex-presidentes/luiz-inacio-lula-da-silva/discursos/1o-mandato/2003/01-01-pronun-do-presidente-da-republica-luiz-inacio-lula-da-silva-na-sessao-solene-de-posse-no-cn.pdf" 

[2] 不要使用download.file()函数,而是使用browseURL()函数,像这样:

browseURL(link, browser = getOption("browser"),
        encodeIfNeeded = FALSE)

[3] browseURL() 函数可以让您的浏览器打开文件,并且可以自动将 .pdf 保存到您计算机的下载目录中。如果您正在使用 Google Chrome,您可以按照以下步骤进行操作:

https://www.computerhope.com/issues/ch001114.htm


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接