python 2.7 - 从私有 CKAN 数据集下载资源



我的目标是使用(a)CKANAPI或(b)CKANAPI CLI或(c)粘贴器(如果(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 工具自动执行下载私有资源的过程?

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

欢迎任何见解。

CKAN 2.5.2, UBUNTU 14.04

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

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 的计算机(Ubuntu 14.04)具有管理访问权限,因此我使用以下过程复制在 CKAN 存储文件夹中找到的资源,并将它们安全地复制到另一台主机中。

编写一个 python 脚本,其中:

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

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

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

(D) 对 (1) 和 (2) 中的resource_ids进行比较,当找到匹配项时,使用 mv 并使用字典 (1) 中的项目列表中的信息重命名 (2) 中的资源,并使用 scp 将它们安全地复制到另一台主机。

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

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

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

最新更新