欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python 爬取历史天气数据

程序员文章站 2022-07-14 17:00:01
...

Python 爬取历史天气数据

作者:梅昊铭

1. 导读

之前Mo给大家分享过杭州历年天气情况的数据集,相信有不少小伙伴好奇这些数据是怎么获取。今天Mo就来教大家如何使用Python来进行历史天气数据的爬取。本文的内容只要求大家熟悉 Python 即可,欢迎大家跟着小Mo一起学习。

项目地址:https://momodel.cn/workspace/5ea1cd698446abd9da8b73f1?type=app

2. 准备工作

2.1 目标网站分析

在爬取数据之前,我们首先要对爬取的目标网站进行分析,弄清楚爬取的页面和数据在哪里,然后再利用 Python 工具进行数据爬取。

首先,设定爬取数据的目标网站为2345天气预报网,然后进入历史天气数据页面并设定目标城市为杭州

然后分析该网页,我们发现改变相应的年月网页的 URL 并没有发生改变,这说明网页上的数据是动态加载的。我们打开 Chrome 浏览器的DevTools,再改变年月,发现该页面动态加载了一个 js 文件。

Python 爬取历史天气数据

仔细分析后,我们发现每改变一次年月,该页面就动态加载一个 js 文件。点开对应的 js 链接,我们就可以发现每个月份的历史数据是通过请求一个 js 数据文件获取的。

Python 爬取历史天气数据

接着我们使用 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 结果展示

Python 爬取历史天气数据

4. 参考资料

  1. Github项目:https://github.com/peiss/ant-learn-python
  2. 教程视频:https://www.bilibili.com/video/BV1pJ411A7N2?from=search&seid=14913508329256294969
  3. 爬虫教程: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 爬取历史天气数据
Python 爬取历史天气数据