我的目标是使用(a)CKANAPI或(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
不幸的是,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