概要
最近在做项目复现,需要下载相关数据集,对于大量的时间序列数据集,网站中往往是以时间分类来存放的,对于动辄需要学习几年甚至十几年的深度学习模型来说,数据下载必然要交给代码来自动执行,下面通过一个具体的示例来展示一下使用python自动下载网站中的数据集并分门别类的存储好。
数据集网站链接:挪威气象局浮标数据集
地址:https://thredds.met.no/thredds/catalog/obs/buoy-svv-e39/catalog.html
本文数据的相关处理方式我也专门写了博客说明,需要的同学请移步:使用python的NetCDF4库来处理时序数据详细流程
这里下载好的海浪数据集也上传到我的资源,需要的同学直接取用即可。
挪威峡湾海洋波浪场浮标检测数据
目标数据介绍
这里我们要下载的数据集是挪威气象局通过布置海洋浮标的方式来获得的海浪要素数据集,我们需要的时间跨度为2017-2020年之间四年的数据,浮标一共布置在五个地点,我们要做的是设置程序,自动抓取目标数据集的URL,下载下来,并分类存储在本地文件夹下。
程序所需相关库
所需相关库如下:
import time
import requests
import os
from bs4 import BeautifulSoup
import re
import sys
这里介绍一下这两个库
-
BeautifulSoup 是一个用于解析 HTML 和 XML 文档的 Python 库,广泛应用于网页抓取、数据提取和处理任务。
-
requests 是一个简单易用的 HTTP 库,用于发送各种 HTTP 请求(GET、POST、PUT、DELETE 等)。广泛用于网页抓取、数据传输等领域。
安装也很简单,直接使用pip命令即可。
pip install beautifulsoup4
重点代码细节解释
这里我通过一个小示例的debug过程来说明一下BeautifulSoup对网页HTML信息的识别抓取过程,帮助大家更好的理解,
示例代码如下:
import requests
from bs4 import BeautifulSoup
base_url = "https://thredds.met.no/thredds/catalog/obs/buoy-svv-e39/catalog.html"
response = requests.get(base_url)
soup = BeautifulSoup(response.text, "html.parser")
year_urls = []
#上面三行就是抓取到我们给的URL对应网页的HTML页面
# 查找页面中包含年份的目录链接
for link in soup.find_all("a"):
href = link.get("href")
if href and "/catalog.html" in href:
print("发现目标URL")
很多同学可能疑惑,下面那个for循环到底是在干嘛呢?为什么运行就能抓取到我们要的URL呢?
这就需要我们使用debug操作,结合网页实际的HTML页面来看看代码到底做了什么
首先debug一下,看看link变量的变化
可以看到,link是一个不断在变化的URL地址,且前面都带了一个“a”的标记,我们去网站的HTML页面看看这个标记代表着什么。
使用chorme浏览器打开我在文章一开始给出的超链接地址,在网页上按下F12,我们就可以看到详细的HTML信息页面
图中红框就是我们想要的数据集,我们要获得网页中这些数据集的URL。在HTML页面中检查一下,我们就会发现代码的原理。
大家看到这里就明白了为什么soup.find_all(“a”)中查找条件要写“a”了,因为他代表着网页中所有的跳转链接部分,代码抽取所有跳转链接,再筛选到我们需要的年份数据集链接,这就是这段代码背后的原理,也是这章下载内容最关键的点。
下载流程
首先把相关库导入进去
import time
import requests
import os
from bs4 import BeautifulSoup
import re
import sys
对于以时间序列为标志的数据集,最重要的就是处理好时间序列,才能做到有条理、不遗漏的下载所需数据集,所以我们先做一个时间处理:
# 获取年份目录的页面
def get_year_urls(start_years, end_years):
response = requests.get(base_url)
soup = BeautifulSoup(response.text, "html.parser")
year_urls = []
# 查找页面中包含年份的目录链接
for link in soup.find_all("a"):
href = link.get("href")
if href and "/catalog.html" in href:
year_str = href.split("/")[0]
if year_str.isdigit() and start_years <= int(year_str) <= end_years:
#这里大家要注意做一个替换,换成你要下载数据集的地址
#当然想更省事的同学也可以直接用split库把这里的地址切分开做一个拼接。
year_urls.append(f"https://thredds.met.no/thredds/catalog/obs/buoy-svv-e39/{
year_str}/catalog.html")
return year_urls
上面函数的目的是获取一个你要抓取的数据集的精确到年份的URL列表
下面我们继续把时间精确到月份上:
# 获取每月数据页面的 URL 列表
def get_month_urls(year_url):
response = requests.get