Python 爬取历史天气数据
Python 爬取历史天气数据
作者:梅昊铭
1. 导读
之前Mo给大家分享过杭州历年天气情况的数据集,相信有不少小伙伴好奇这些数据是怎么获取。今天Mo就来教大家如何使用Python来进行历史天气数据的爬取。本文的内容只要求大家熟悉 Python 即可,欢迎大家跟着小Mo一起学习。
项目地址:https://momodel.cn/workspace/5ea1cd698446abd9da8b73f1?type=app
2. 准备工作
2.1 目标网站分析
在爬取数据之前,我们首先要对爬取的目标网站进行分析,弄清楚爬取的页面和数据在哪里,然后再利用 Python 工具进行数据爬取。
首先,设定爬取数据的目标网站为2345天气预报网,然后进入历史天气数据页面并设定目标城市为杭州。
然后分析该网页,我们发现改变相应的年月网页的 URL 并没有发生改变,这说明网页上的数据是动态加载的。我们打开 Chrome 浏览器的DevTools,再改变年月,发现该页面动态加载了一个 js 文件。
仔细分析后,我们发现每改变一次年月,该页面就动态加载一个 js 文件。点开对应的 js 链接,我们就可以发现每个月份的历史数据是通过请求一个 js 数据文件获取的。
接着我们使用 Python 对每一个 js 文件进行分析,就可以获取相应月份的历史天气数据了。
2.2 Python 库
利用 Python 进行数据爬取时,我们常用的一些库有requests
, Beautifulsoup
, scrapy
等。本文中,我们使用 requests
工具来获取历史天气数据的 js 数据文件,并用 demjson
工具包对返回的非标准 json 数据格式进行解析。最后,使用 csv
包将获取的历史数据存到csv文件中。
本教程中使用的Python 第三方库:requests
, demjson
。
3. 数据爬取
3.1 构造URL列表
通过前面的分析,我们已经了解到每个月份的历史天气数据是通过一个 Javascript 文件获取的。因此,我们需要构造带爬取数据的 URL 列表,再批量爬取数据。
# 构造2019全年的月份列表
months = []
for year in (2019,):
for month in range(12):
months.append("%d%02d"%(year, month+1))
todo_urls = [
"http://tianqi.2345.com/t/wea_history/js/"+month+"/58457_"+month+".js"
for month in months
]
3.2 批量下载数据
使用 requests
库获取 js 文件中的数据,并存到 datas
变量中。
import requests
datas = []
for url in todo_urls:
r = requests.get(url, headers = headers)
if r.status_code!=200:
raise Exception()
# 去除javascript前后的字符串,得到一个js格式的JSON
data = r.text.lstrip("var weather_str=").rstrip(";")
datas.append(data)
3.3 解析数据
我们从 js 文件获取的数据 json 格式存储的,需要使用 demjson 对数据进行解析。
# 解析所有月份的数据
all_datas = []
for data in datas:
tqInfos = demjson.decode(data)["tqInfo"]
all_datas.extend([x for x in tqInfos if len(x)>0])
3.4 将结果导入 csv 文件
import csv
with open('./hangzhou_tianqi_2019.csv', 'w', newline='', encoding='utf-8') as csv_file:
writer = csv.writer(csv_file)
columns = list(all_datas[0].keys())
writer.writerow(columns)
for data in all_datas:
writer.writerow([data[column] for column in columns])
3.5 结果展示
4. 参考资料
- Github项目:https://github.com/peiss/ant-learn-python
- 教程视频:https://www.bilibili.com/video/BV1pJ411A7N2?from=search&seid=14913508329256294969
- 爬虫教程:https://morvanzhou.github.io/tutorials/data-manipulation/scraping/
关于我们
Mo(网址:https://momodel.cn) 是一个支持 Python的人工智能在线建模平台,能帮助你快速开发、训练并部署模型。
近期 Mo 也在持续进行机器学习相关的入门课程和论文分享活动,欢迎大家关注我们的公众号获取最新资讯!
![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9pbWdiZWQubW9tb2RlbC5jbi9JTUdfNjAyMC5KUEc?x-oss-process=image/format,png
上一篇: [python爬虫]爬取天气网全国所有县市的天气数据
下一篇: JAVA进程空间