从私有CKAN数据集下载资源

时间:2016-07-08 16:19:40

标签: python-2.7 ubuntu-14.04 ckan

我的目标是使用(a)CKAN API或(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

3 个答案:

答案 0 :(得分:6)

不幸的是,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)

答案 1 :(得分:0)

由于我对安装了CKAN的计算机具有管理访问权限(Ubuntu 14.04),因此我使用以下过程复制CKAN存储文件夹中的资源,并将其安全地复制到另一台主机中。

写一个python脚本:

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

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

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

(D)在(1)和(2)中的resource_ids之间进行比较,使用ckan.storage_path并使用项目列表中的信息重命名(2)中的资源在字典(1)中找到匹配项,并使用mv将其安全地复制到另一个主机。

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

答案 2 :(得分:0)

替代方法(已通过CKAN 2.8测试): curl -H "X-CKAN-API-Key: $API_KEY" "$CKAN_RESOURCE_URL"

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