抓取AWS S3上托管的数据

时间:2019-05-01 03:11:49

标签: r web-scraping

我正在尝试抓取一些公共领域提供的但托管在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上的数据?

3 个答案:

答案 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)
  })