我的目标是使用(a)CKAN API或(b)CKANAPI CLI或(c)贴纸(如果(c)可能)下载私有数据集中作为资源保存的文件。
我尝试使用(a)下载文件失败。例如,使用资源URL和urllib2
或requests
文件已下载,但文件已损坏( .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
答案 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