最近天气逐渐变冷,我们公司主管供应链运营的同事提了这样的一个数据获取需求。
“能否获取全国主要城市的天气数据?最好能加上未来30天的天气预报的数据?”
目的是针对于公司负责销售的一些对温度要求高的产品,如液态、胶类产品增加保温袋及做保温措施,这样最大限度的让货品能够完整的送到客户手中,但前提是要有全国各个城市的天气数据。
接到这个需求以后,我花了两天时间,把全国43座城市的天气数据抓取下来,使用Python+飞书多维表实现一个自动取数脚本,从而实现自动化。
一共抓取了43座城市的天气数据,从哈尔滨到三亚,数据全抓下来了,能够解决业务的一些需求,保障业务的正常进行,下面复盘一下,如何使用Python+飞书多维表实现自动化取数。
开发环境准备
Python爬虫的第一步是安装所需的库,一开始我忘了装openpyxl,结果程序跑到最后一步报错,所以,为了代码能够正常运行,安装这些库是必要的。
库功能说明
-
• requests:发HTTP请求,就像给API发微信
-
• pandas:处理数据,比Excel好用,数据清洗都用它
-
• openpyxl:专门管Excel文件的格式,没它不行
pip install requests pandas openpyxl
API接口介绍
本文使用 SOJSON免费天气API,免费使用,无需注册,支持全国主要城市,而且还提供16天天气预报(虽然没有得到30天的天气预报,但是16天的天气预报已经能满足业务需要了),重要的是这个API完全返回的是JSON格式数据,对于数据解析比较友好了。
API地址格式
http://t.weather.sojson.com/api/weather/city/{城市代码}
完整代码实现
首先需要导入必要的一些库,比如爬虫的库,数据处理的库等,这些库我基本都用过,按照常见的定义写出来就好。
import requests
import json
import time
from datetime import datetime
from typing import List, Dict, Optional
import pandas as pd
对于天气爬虫类进行定义,包括请求头,请求地址等。
class WeatherCrawler:
def __init__(self):
# API基础配置
self.base_url = "http://t.weather.sojson.com/api/weather/city"
self.headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}
# 全国主要城市列表
self.major_cities = [
"北京", "上海", "广州", "深圳", "天津", "重庆",
"南京", "杭州", "成都", "武汉", "西安", "沈阳",
# ... 更多城市
]
另外,我们只需要爬取全国主要城市的天气数据,需要根据官方API文档提供的城市代码映射。
def _get_city_code(self, city_name: str) -> Optional[str]:
"""获取SOJSON免费API的城市编码"""
city_codes = {
"北京": "101010100", "上海": "101020100",
"广州": "101280101", "深圳": "101280601",
# ... 其他城市代码
}
return city_codes.get(city_name)
接着就可以发送请求获取天气数据了,注意网络返回的状态码,如果返回的是200,就可以正常访问了。
def get_weather_data(self, city_id: str) -> Optional[Dict]:
"""获取天气数据"""
try:
url = f"{self.base_url}/{city_id}"
response = requests.get(url, headers=self.headers, timeout=10)
if response.status_code == 200:
data = response.json()
if data.get("status") == 200:
return self._convert_weather_data(data)
else:
print(f"获取天气数据失败: {data.get('message', '未知错误')}")
else:
print(f"天气数据HTTP请求失败: {response.status_code}")
return None
except Exception as e:
print(f"获取天气数据异常: {str(e)}")
return None
另外,通过API返回的数据是JSON格式数据,需要对返回的数据做数据转换处理。
def _convert_weather_data(self, data: Dict) -> Dict:
try:
city_info = data.get("cityInfo", {})
weather_data = data.get("data", {})
forecast_list = weather_data.get("forecast", [])
# 构建标准化数据结构
current_weather = {
"code": "200",
"updateTime": city_info.get("updateTime", ""),
"city": city_info.get("city", ""),
"now": {
"temp": weather_data.get("wendu", ""),
"text": forecast_list[0].get("type", ""),
"humidity": weather_data.get("shidu", "").replace("%", ""),
"quality": weather_data.get("quality", ""),
"pm25": str(weather_data.get("pm25", "")),
"pm10": str(weather_data.get("pm10", "")),
},
"forecast": []
}
return current_weather
except Exception as e:
print(f"转换天气数据异常: {str(e)}")
return {}
最后,我们将爬取下来的数据保存到Excel表格进行备用。
def save_weather_data_to_excel(all_weather_data: Dict[str, List[Dict]], filename: str = "天气数据爬取_近30天.xlsx"):
"""将所有天气数据保存到Excel文件"""
try:
# 合并所有城市的数据
all_data = []
for city_name, city_data in all_weather_data.items():
all_data.extend(city_data)
# 创建DataFrame并保存
df = pd.DataFrame(all_data)
df.to_excel(filename, index=False, engine='openpyxl')
print(f"✓ 天气数据已保存到文件: {filename}")
print(f" 包含 {len(all_data)} 条记录,{len(all_weather_data)} 个城市")
except Exception as e:
print(f"保存Excel文件失败: {str(e)}")
上面已经完成了Python自动爬取43个城市的天气数据,接下来我还需要将爬取下来的数据自动上传到飞书多维表格进行数据留存,同样是写代码完成飞书表上传的。

要想将本地数据自动上传到飞书多维表格,还是用Python写代码实现,但是,需要提前获取你保存的飞书多维表对应的对应的授权码,打开飞书多维表格,新建一个多维表,在右上角点击多维表格插件,点击自定义插件。
点击获取授权码,就可以看到一串生成的很长的代码了,这串代码用于授权Python可以操作飞书多维表,比如编辑、读取、下载等功能。
另外,点击开发工具,获取刚刚新建的飞书多维表的BaseID和TableID,用于标识是哪个多维表的哪个数据表。
下面就是通过Python代码实现的数据自动上传,由于篇幅过长,这里就不展示代码部分了,对于飞书表数据上传部分的代码,可以私信作者获取,感兴趣的同学可以上手实操一下。

至此,忙活了两天时间,终于将天气数据爬取下来,并自动上传到飞书多维表中,而且也能很快在业务中使用,辅助运营的同事做决策,对于持续性的降温天气,可以优先使用保温袋等等保障措施。
关注和星标『大话数据分析』
和作者一起学习数据分析!
👆点击关注|设为星标|干货速递👆
前蚂蚁金服数据运营,现京东经营分析,公众号、知乎、头条「大话数据分析」主理人,专注于数据分析的实践与分享,掌握Python、SQL、PowerBI、Excel等数据分析工具,擅长运用技术解决企业实际问题。