我的目标是使用 (a) CKAN API,或 (b) CKANAPI CLI,或 (c) paster(如果 (c) 可行)下载私有(private)数据集中作为资源保存的文件。
我尝试使用 (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 工具自动化下载私有(private)资源的过程?
我是否应该将数据集从私有(private)更改为公共(public),下载资源,然后再次将它们设为私有(private)?
我们非常欢迎任何见解。
CKAN 2.5.2,UBUNTU 14.04
最佳答案
不幸的是,CKAN API 不提供下载资源数据的功能(仅针对元数据:resource_show
)。资源下载由 CKAN 的 web 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)
关于python-2.7 - 从私有(private) CKAN 数据集下载资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38271351/