介绍:使用python和SHELL语言对Harvard dataverse数据库中的数据集进行下载
一、数据集介绍:
Harvard Dataverse Harvard Dataverse由美国哈佛大学定量社会科学研究中心 (the Institute for Quantitative Social Science)和哈佛大学图书馆合作创立的社会科学数据库
二、Harvard dataverseAPI下载介绍
关于API下载数据:Data Access API — Dataverse.org
关于PYTHON下载:Client Libraries — Dataverse.org
三、API下载
1.获取API令牌、服务器URL和数据集的持久标识
1. API令牌:
登录官网:https://dataverse.harvard.edu/
2. 服务器URL:
服务器URL通常是Dataverse实例的网址,例如https://dataverse.harvard.edu/dataset.xhtml?persistentId=doi:10.7910/DVN/VIJFPK
这个网站,URL就是https://dataverse.harvard.edu
3. 数据集的持久标识:
点击数据集页面上的“Cite”按钮,在弹出的窗口中可以看到数据集的持久标识(Persistent Identifier),通常以“doi:”开头,例如我下面要下载的数据doi.org/10.7910/DVN/VIJFPK,它对应的Persistent Identifier就是doi:10.7910/DVN/VIJFPK
也可以在HL中点击元数据metadata中查看Persistent Identifier
4. 下载数据的版本(针对Harvard dataverse):
点击数据的version,可以查看可以下载的版本
2. 下载:
1. 官网例子:
export API_TOKEN=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
export SERVER_URL=https://demo.dataverse.org
export PERSISTENT_ID=doi:10.70122/FK2/N2XGBJ
curl -L -O -J -H "X-Dataverse-key:$API_TOKEN" $SERVER_URL/api/access/dataset/:persistentId/?persistentId=$PERSISTENT_ID
官网的例子是连接到一个测试网站的,不能直接使用,原因是:其中的SERVER_URL不是我们要的。
此时改对URL后部分小文件已经可以使用了,但对于大文件,即便我们写对了也可竟会出现重定位然后SHELL脚本中断的情况,我们可以在curl后加上-v输出它的运行情况,如下图出现重定位,可以直接wget这个新路径(以下为我的SHELL脚本,可以输出我们需要的URL,也可以直接在脚本里启动下载):
export API_TOKEN=*****************************************
export SERVER_URL=https://dataverse.harvard.edu
export PERSISTENT_ID=doi:10.7910/DVN/VIJFPK
export VERSION=4.1
# 发起curl请求获取重定向链接
# Store the response headers in a variable
response=$(curl -s -D - -H "X-Dataverse-key:$API_TOKEN" --insecure "$SERVER_URL/api/access/dataset/:persistentId/versions/$VERSION?persistentId=$PERSISTENT_ID")
# Extract the redirect URL from the Location header
download_link=$(echo "$response" | grep -i 'Location' | awk '{print $2}')
echo $download_link
2. python下载:(支持重定位)
所需库:request
关键:request.get
request.get的API认证:有些API使用API密钥作为认证方式。API密钥通常作为请求头的一部分发送。
import requests
url = 'http://example.com/api'
api_key = 'your_api_key'
headers = {'Authorization': f'Bearer {api_key}'}
response = requests.get(url, headers=headers)
下载程序:
需要更改:API_TOKEN、PERSISTENT_ID、VERSION,后两者在所下载文件的说明中的Metadata以及Versions部分
import requests
def check_server_availability(url):
'''检查URL是否可以被正常访问'''
try:
response = requests.get(url)
if response.status_code == 200:
print(f'{url} 可以正常访问')
else:
print(f'{url} 访问失败,状态码:{response.status_code}')
except requests.RequestException as e:
print(f'发生异常:{e}')
# 设置API令牌、服务器URL和数据集的持久标识
API_TOKEN = '*************************************'
SERVER_URL = 'https://dataverse.harvard.edu'
PERSISTENT_ID = 'doi:10.7910/DVN/VIJFPK'#'doi:10.7910/DVN/G6X1ZS'#
VERSION = '4.1'#'1.0'#
check_server_availability(SERVER_URL)
# 构建API请求URL
url = f'{SERVER_URL}/api/access/dataset/:persistentId/versions/{VERSION}?persistentId={PERSISTENT_ID}'
# 发起GET请求下载数据集
response = requests.get(url, headers={'Authorization': f'Bearer {API_TOKEN}'},allow_redirects=False)#关闭重定位,否则会非常慢
if response.status_code == 303:
'''需要重定位的进程'''#重新定位后直接request.get即可,不用再API验证
redirect_url = response.headers['Location']
print('重定向到,'+redirect_url)
# 发起第二次请求,手动处理重定向
response = requests.get(redirect_url, stream=True)
if response.status_code == 200:
print('正在储存文件')
with open('/home/lyn/DATA/AH/AH2019.zip', 'wb') as file:
for chunk in response.iter_content(chunk_size=1024):
if chunk: # 过滤掉保持连接的新块
file.write(chunk)
print("文件下载成功,保存为: /home/lyn/DATA/AH/AH2019.zip")
else:
print(f"下载失败,状态码: {response.status_code}")
# 检查响应状态码
elif response.status_code == 200:
'''不需要重定位的进程'''
# 将响应内容写入文件
print('请求成功,正在下载')
with open('/home/lyn/DATA/AH/AH2019.zip', 'wb') as file:
file.write(response.content)
print('数据集下载成功!')
else:
print(f"下载失败,状态码: {response.status_code}")
参考文章:
URL知识+curl命令解释Harvard Dataverse 数据批量下载_hydrowed下载数据-CSDN博客