从私有 CKAN 数据集下载资源

Download resources from private CKAN datasets

我的目标是使用 (a) CKAN API 或 (b) CKANAPI CLI,或 (c) paster (如果 (c) 是可能的)。

我尝试使用 (a) 下载文件但未成功。例如,使用资源 URL 和 urllib2requests 文件已下载但已损坏(.zip)或 CKAN 登录页面存储在文件中(.xls)。

我试过使用 (b) 太失败了。例如使用以下代码:

ckanapi dump datasets dataset_name --datapackages=~/ckan_out -r http://localhost:5000 -a XXXXX-XXXX-XXXX-XXXX-XXXXXXXXX

URL xxxxxxxxxxxx refused connection. The resource will not be downloaded

我还没有找到任何具有 paster 下载资源功能的东西。

是否可以使用 CKAN 工具自动完成下载私有资源的过程?

我是否应该将数据集从私有更改为 public、下载资源,然后再次将其设为私有?

欢迎任何见解。

CKAN 2.5.2,UBUNTU14.04

因为我对安装了 CKAN 的机器具有管理权限 (Ubuntu 14.04) 我使用以下过程复制在 CKAN 存储文件夹中找到的资源并将它们安全地复制到另一个 host.

编写 python 脚本,其中:

(A) CKAN API 用于获取资源的元数据。或者,您可以使用 paster 在 *.csv 或 *.json 中生成元数据转储,但对我来说它不起作用,因为无法从我的 csv 访问从 paster 生成的文件模块或分别来自 json 模块。 paster clos文件生成后是否正确?

(B) 使用资源的元数据创建字典 (1),其中键表示 resource_id,值表示项目列表 [package_name,resource_format].

(C) 使用 python 模块 os 重建完整的 resource_id每个资源通过访问您在配置文件中定义的 CKAN 存储文件夹 ckan.storage_path 并将它们保存在列表中 (2)

(D)比较(1)和(2)中的resource_id,将(2)中的资源重命名为mv并在找到匹配项时使用在字典 (1) 的项目列表中找到的信息,并使用 scp 将它们安全地复制到另一个 host.

如果能够访问 CKAN 存储路径并且能够在机器之间的防火墙中打开端口,则上述方法工作正常;但是,如果有人也对仅使用 CKAN API 和身份验证执行相同的功能有见解,我将不胜感激。

遗憾的是,CKAN API 不提供下载资源数据的功能(仅针对元数据:resource_show)。资源下载由 CKAN 的网络 UI 代码处理。这意味着您不能使用 API 提供的身份验证方法(即您的 API-key),而必须使用您的普通凭据(用户名 + 密码):

import requests

CKAN_URL = 'http://localhost:5000'


def login(username, password):
    '''
    Login to CKAN.

    Returns a ``requests.Session`` instance with the CKAN
    session cookie.
    '''
    s = requests.Session()
    data = {'login': username, 'password': password}
    url = CKAN_URL + '/login_generic'
    r = s.post(url, data=data)
    if 'field-login' in r.text:
        # Response still contains login form
        raise RuntimeError('Login failed.')
    return s


def download_resource_data(session, pkg_id, res_id):
    url = '{ckan}/dataset/{pkg}/resource/{res}/download/'.format(
            ckan=CKAN_URL, pkg=pkg_id, res=res_id)
    return session.get(url).content


if __name__ == '__main__':
    session = login('my-user', 'my-password')
    data = download_resource_data(session, 'some-package', 'some-resource')
    print(data)

备选方案(使用 CKAN 2.8 测试): curl -H "X-CKAN-API-Key: $API_KEY" "$CKAN_RESOURCE_URL"

我打开了一个问题来支持 ckanapi 中的下载:https://github.com/ckan/ckanapi/issues/150