python下载资源文件:zenodo中的数据集

简介

  1. 最近看见一篇论文:《A first Chinese building height estimate at 10 m resolution (CNBH-10 m) using multi-source earth observations and machine learning》,估算了中国2020年10m空间分辨率的建筑物高度,其数据集已经在zenodo上公开,由于数据数量太多,所以我写了一个python代码,下载这些数据。
  2. 该网站站点不安全,进行数据下载时需要验证证书,所以需要禁用SSL证书验证警告(关键点),然后就是简单的发送GET请求获取需要的内容。

代码1

资源文件链接示例:

  1. https://www.zenodo.org/record/7923866/files/CNBH10m_X103Y41.tif?download=1
  2. https://www.zenodo.org/record/7923866/files/CNBH10m_X105Y25.tif?download=1

使用循环语句修改粗体文字内容,就能实现自动化,增加一个文件作为下载记录。

import os
import pandas as pd
import requests
import urllib3

# 禁用SSL证书验证警告
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

# 本案例中循环语句的i,j起始值由数据名称决定
for i in range(70,140,1):
    for j in range(1,70,1):
        # 记录文件,不存在就新建
        if not os.path.exists('下载记录.csv'):
	        f = open('下载记录.csv','a')#append
	        f.write('name\n')
	        f.close()
        
        download_link = f'https://www.zenodo.org/record/7923866/files/CNBH10m_X{i}Y{j}.tif?download=1'  # 下载链接
        # 根据特定需要进行更改
        name = download_link[44:]
        name = name[:-11]  # 文件名
        save_path ='data/建筑高度/' + name  # 保存路径
        
        # 读取记录文件,判断当前下载的数据是否已经下载
        df = pd.read_csv('下载记录.csv')
        if(name in df.values):
            print(f'文件“{name}”已存在')
        else:
            try:
                # 发送一个GET请求到指定的URL,并将响应保存在变量response中,verify=False表示不对SSL证书进行验证
                response = requests.get(download_link, verify=False)
                if response.status_code == 200:  # 状态码为 200 表示请求成功
                    with open(save_path, 'wb') as file:  # 以二进制写模式打开名为save_path的文件
                        file.write(response.content)  # 将response对象的内容写入到文件中
                    print('文件下载成功!')
                    # 记录下载成功的文件名
                    f = open('下载记录.csv','a')#append
                    l = name + '\n'
                    f.write(l)
                    f.close()
                else:
                    print('下载失败,状态码:', response.status_code)  # 如果响应的状态码不是200,就打印错误信息
            except requests.exceptions.RequestException as e:  # 如果产生任何异常,都在这里处理
                print('下载发生错误:', str(e))

'''上述代码使用requests库发送HTTP GET请求并禁用了SSL证书验证。
通过将verify参数设置为False,可以忽略不安全网站的 SSL 证书错误。
这种做法是为了应对特定情况下的需求,如在开发和测试环境中处理不安全网站。
在生产环境中,最好遵循安全最佳实践,并在与不安全网站进行通信时进行适当的证书验证。'''

在这里插入图片描述

代码2

import os
import time
import logging
import pandas as pd
import requests
from bs4 import BeautifulSoup

# 生成下载记录
def _log(log_file):
    logging.basicConfig(filename=log_file, level=logging.INFO,
                    format="%(asctime)s %(name)s %(levelname)s %(message)s",
                    datefmt='%Y-%m-%d %H:%M:%S')

# 获取tif文件的下载连接
def get_link(url):
    response = requests.get(url)
    soup = BeautifulSoup(response.text)
    head_text = soup.head
    link_text = head_text.find_all('link')
    links = [link.get('href') for link in link_text if link.get('href').endswith('.tif')]
    return links

# 根据下载连接下载tif数据
def get_data(url, save_path):
    filename = url.rsplit('/')[-1]
    try:
        response = requests.get(link)
        response.raise_for_status()  # 抛出HTTPError以捕获错误状态码
        if response.status_code == 200:  # 状态码为 200 表示请求成功
            with open(os.path.join(save_path,filename), 'wb') as file:  # 以二进制写模式打开名为save_path的文件
                file.write(response.content)  # 将response对象的内容写入到文件中
        logging.info(f"成功下载: {link}")
        print(f"成功下载: {link}")
    except requests.exceptions.RequestException as e:
        logging.error(f"下载失败: {link}, 错误信息: {str(e)}")
        print(f"下载失败: {link}, 错误信息: {str(e)}")

url = 'https://zenodo.org/records/7923866'
log_file = 'data/下载记录.txt'
save_path = 'data/tif'
_log(log_file)
links = get_link(url)
for link in links:
    get_data(link, save_path)
    time.sleep(2)  # 睡眠,防止下载过快

结果

在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值