我正在尝试抓取一些公共领域提供的但托管在AWS S3上的数据:链接为here。页面源代码携带不多,因此通常
read_html(url) %>%
html_nodes(xpath = '//*[@id="listing"]/pre/a[1]')
将不返回任何内容。通过检查Elements,我也尝试过
ctrl + A
但也没有运气。
我最好的选择是打开Firefox,单击View Selection Source
,然后右键单击并询问a
,然后我用正则表达式为'use strict';
const md5File = require('md5-file/promise');
module.exports = function hashAssetFiles(asset) {
return Promise.all(asset.files.map(md5File)).then(hashes => {
asset.fileHashes = hashes;
return asset;
});
};
节点进行解析。但是,该方法在具有更复杂子文件夹结构的设置中特别适用。
我希望最终能够下载链接中的所有内容,而无需人工干预,包括所有子文件夹中的项目。 R中是否有一种巧妙的方法来处理我遗失的AWS S3上的数据?
答案 0 :(得分:2)
如果您要下载的整个存储桶为public
,则可以按以下方式使用AWS CLI
。
在浏览器中打开链接,然后看到显示的source
:
<script type="text/javascript">
var S3BL_IGNORE_PATH = true;
var BUCKET_NAME = 'dl.ncsbe.gov';
var BUCKET_URL = 'https://s3.amazonaws.com';
var S3B_ROOT_DIR = '';
</script>
因此,存储区名称为 dl.ncsbe.gov 。 从here
安装AWS CLI现在,您可以按以下方式下载整个存储桶:
$ aws s3 sync s3://dl.ncsbe.gov .
这将下载到您的当前目录
这是一个大水桶,所以我停了下来。 以下是我得到的:
$ ls -lrt
total 56
drwxrwxr-x 3 ubuntu ubuntu 4096 May 5 14:30 Campaign_Finance
drwxrwxr-x 2 ubuntu ubuntu 4096 May 5 14:30 Changed_Statutes
drwxrwxr-x 4 ubuntu ubuntu 4096 May 5 14:30 Elections
drwxrwxr-x 5 ubuntu ubuntu 4096 May 5 14:30 Ethics
drwxrwxr-x 11 ubuntu ubuntu 4096 May 5 14:30 One-Stop_Early_Voting
drwxrwxr-x 3 ubuntu ubuntu 4096 May 5 14:30 Outreach
drwxrwxr-x 2 ubuntu ubuntu 4096 May 5 14:30 PrecinctMaps
drwxrwxr-x 3 ubuntu ubuntu 4096 May 5 14:31 Press
drwxrwxr-x 4 ubuntu ubuntu 4096 May 5 14:31 Public_Records_Requests
drwxrwxr-x 3 ubuntu ubuntu 4096 May 5 14:31 Requests
drwxrwxr-x 64 ubuntu ubuntu 4096 May 5 14:31 ENRS
drwxrwxr-x 5 ubuntu ubuntu 4096 May 5 14:31 Rulemaking
drwxrwxr-x 6 ubuntu ubuntu 4096 May 5 14:31 NVRA
drwxrwxr-x 11 ubuntu ubuntu 4096 May 5 14:31 ShapeFiles
如果要特定的文件夹而不是整个存储桶,则也可以在aws s3
命令中添加该文件夹名称,例如:
$ aws s3 sync s3://dl.ncsbe.gov/data/SampleBallots/ .
希望这会有所帮助!
答案 1 :(得分:1)
该页面似乎使用javascript来包含您要查找的数据,请参阅https://dl.ncsbe.gov/list.js,该数据是在加载页面时获得的。
rvest
不支持使用javascript加载数据的页面,因此您可能必须切换到R
+ PhantomJS
,也可以使用{{1 }}:
您使用的xpath非常接近,您可以删除索引RSelenium
,否则您将获得第一个元素。所以我建议使用:a[1]
。
然后,您可以通过提取//*[@id="listing"]/pre/a
属性来提取链接,并使用href
中的链接。我添加了一个带有download.file()
的十个链接的示例。这是设置软件包的绝佳链接:https://rpubs.com/johndharrison/RSelenium-Docker。
可复制的示例:
RSelenium
答案 2 :(得分:1)
aws.s3
软件包使您可以在R中轻松访问AWS S3命令行工具。它具有帮助程序功能,可以找到像这样的公共存储桶,并列出存储桶中的对象。
我将在您指向的子文件夹(data/SampleBallots
)中获得该存储桶中所有内容的列表。默认设置为限制为1000条记录,我用max = Inf
覆盖了该记录。
library(dplyr)
library(stringr)
library(purrr)
library(aws.s3)
ballot_keys <- get_bucket_df(bucket = "dl.ncsbe.gov", prefix = "data/SampleBallots", max = Inf) %>%
pull(Key)
length(ballot_keys)
#> [1] 10869
也许您要做要该文件夹中的所有10,869个对象。密钥作为每个对象的路径返回,其中一些是基础SampleBallots
中的zip文件。
ballot_keys[1:4]
#> [1] "data/SampleBallots/2008-05-06.zip" "data/SampleBallots/2008-06-24.zip"
#> [3] "data/SampleBallots/2008-11-04.zip" "data/SampleBallots/2009-09-15.zip"
length(str_subset(ballot_keys, "\\.zip$"))
#> [1] 24
您提到的那些子文件夹中还有许多文件,我没有进行梳理,但这些子文件夹具有这样的键。
ballot_keys[200]
#> [1] "data/SampleBallots/2016-03-15/ANSON/ANSON-20160315-Style044-DEM-WADESBORO_1.pdf"
然后,您可以使用软件包的save_object
函数来下载所需的任何文件。您可以仅使用键的子集(如下所示)以及一些循环方法,*apply
函数或purrr::map
/ purrr::walk
来完成此操作。给每个对象一个文件路径(我只是通过密钥的结尾来实现),它们将下载到您提供的路径中。我下载的文件不多于1个,因为它们相对较大(〜200MB)。
str_subset(ballot_keys, "\\.zip$") %>%
walk(function(key) {
filename <- str_extract(key, "[\\d\\-]+\\.zip$")
save_object(object = key, bucket = "dl.ncsbe.gov", file = filename)
})