新闻详情

新闻详情

首页 / 资讯中心 / 详情

Python爬虫实战:2345天气网天气预报数据采集与存储

发布时间:2026/9/30 9:16:49来源:尧图网络
Python爬虫实战:2345天气网天气预报数据采集与存储
1. 项目整体设计与思路拆解1.1 为什么选2345天气网作为入门爬虫案例最近不少读者在后台问说网上Python爬虫教程多是爬豆瓣、爬链家、爬知乎看得懂代码但一换网站就蒙圈。这次选2345天气网的城市天气预报数据采集正好把“采集思路”这件事讲透——天气数据是典型的“高频、公开、结构规整”的信息源非常适合第一次完整走通“找地址-抓包分析-写代码-存数据”全流程。2345天气网这个站点的特点很鲜明它既有PC端的复杂页面也有移动端WAP相对精简的结构而且城市页面URL规律性极强——城市ID一换整个页面内容就跟着切换。这种规律性对入门爬虫来说简直是“新手友好”的典范你完全可以靠“观察URL变化”就推断出接口规则而不需要一上来就去啃那种乱糟糟的大平台接口文档。另外一个重要原因是2345天气网的天气预报数据不仅有当天实时天气、温度、风力风向还有未来几天的预报字段丰富但结构简单非常适合后续做数据清洗、可视化分析的延伸练习。换句话说这个项目不只是“交一个爬虫作业”而是可以作为一个“数据全链路小项目”的起点。1.2 核心设计思路先找接口再谈代码我见过太多新手一上来就requests.get一个网址然后正则表达式满天飞地抠数据。这种写法不是不行而是容易被页面结构调整打爆。正确的做法是先判断数据是“直接渲染在HTML里”还是“通过Ajax异步加载回来的”。这一步判断决定了整个爬虫的技术路线。2345天气网温度等关键数据在WAP端其实是通过一个独立的JSON接口返回的而不是全写死在HTML源码里。这给了我们一个极好的教学机会——抓包、看Network面板、找XHR请求、解析JSON这一整套动作就是爬虫进阶的核心基本功。掌握了这套“先抓包再写代码”的思路以后你去爬App接口、爬加密接口至少知道该从哪里下手。所以我在这篇教程里不会一上来就甩代码而是会花比较多篇幅讲清楚“为什么这样设计”——包括为什么选WAP端、为什么优先找JSON接口、为什么请求头里的User-Agent要伪装。1.3 技术选型与工具清单这个项目用到的工具非常克制全部是Python爬虫的“标准配置”工具/库用途说明Python 3.8运行环境推荐3.10以上语法更友好requests发送HTTP请求比urllib好用得多必须掌握json解析接口返回数据Python标准库csv存储数据标准库零依赖Fiddler/浏览器开发者工具抓包分析新手推荐直接用Chrome的F12SQLAlchemy进阶数据入库可选扩展后面单独讲选型逻辑很简单requests负责和服务器对话json处理返回的文本csv做持久化。这三个东西能解决80%的入门级爬虫需求没必要为了“显得高级”引入Scrapy。真正的进阶点在于“分析接口”而不是“堆技术栈”。2. 核心细节解析与实操要点2.1 抓包到底在抓什么从F12开始先明确一个概念所谓“抓包”抓的不是某种神秘数据包而是你的浏览器和服务器之间来回传递的HTTP请求和响应。打开Chrome开发者工具F12切到Network面板然后刷新页面你会看到一长串请求记录。这些记录就是“包”。在Network面板里有一个Filter输入框你输入“XHR”就能过滤出Ajax请求。XHR是XMLHttpRequest的缩写是现代网页与服务器异步交换数据的核心机制。天气预报这类动态数据绝大多数走的就是XHR通道而不是整页刷新。实操建议在2345天气网的城市页面按下F12刷新页面过滤XHR请求你会看到一个类似/wap/newdiyi.php?的请求点击它在Preview标签页里能看到整整齐齐的JSON数据——城市名、日期、天气、最高温、最低温全都在一起。恭喜你你找到了“数据源头”。这一步成功之后后面的爬虫代码其实就是在模拟这个请求。2.2 接口分析URL参数的意义抓到的接口地址通常长这样示意https://www.2345.com/weather/api/newdiyi.php?citycode101020100day3这里面最关键的就是citycode。101020100代表上海换成101010100就是北京。这种编码规律其实有官方气象行业背景——中国天气网的城市代码就是12位数字前两位是省份后六位是城市区县。2345天气网沿用了这套编码体系等于帮你省掉了“城市名转城市ID”的麻烦。另一个参数是day表示预报天数填3就是三天预报填7就是七天预报。很多新手会忽略这种参数其实它就是一个天然的扩展点——想抓多长时间的天气改一个数字就行。2.3 请求头伪装与常见反爬策略服务器不会随随便便把数据交给一个“陌生人”。当你的requests请求发送出去时服务器能看到你的User-Agent表明你是什么客户端、Referer表明你从哪里跳转过来、Cookie等信息。如果你直接用默认的Python-requests头几乎任何一个正经网站都会怀疑你是爬虫。最简单的伪装就是修改User-Agent将其伪装成Chrome浏览器headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36, Referer: https://www.2345.com/weather/ }这里还有一个容易被忽略的细节Referer。有些接口会校验请求来源如果Referer不对就直接拒绝访问。你从2345天气网页面发起的请求Referer自然应该是该网站的某个页面这个逻辑很好理解。实战中我习惯把Referer和UA一起加上避免玄学问题。2.4 常见数据结构JSON字段拆解拿到接口返回的JSON后不要急着写解析代码先花一分钟看懂结构。接口返回的数据通常是这样组织的{ city: 上海, citycode: 101020100, data: [ { date: 2025-04-15, weather: 多云, temp_max: 23, temp_min: 15, wind: 东南风3级 } ] }注意不同网站字段命名习惯不同有的人叫high、low有的人叫temp_max、temp_min还有的人会嵌套好几层。安全做法是先print整个JSON看结构再写提取逻辑。别凭感觉猜字段名最终解释权在返回的数据手里。3. 实操过程与核心环节实现3.1 环境准备与依赖安装开始写代码之前先把环境收拾利索。如果你还没装Python去官方网站下载安装包即可注意安装时勾选“Add Python to PATH”不然命令行里敲python会提示找不到命令。然后安装requests库pip install requests如果你的环境是Python 3.4以前的版本不太可能可能还需要单独装编码相关的库。在2025年的环境下绝大多数情况用上面的命令就够了。如果pip下载慢可以换国内镜像源这个属于基操不多啰嗦。注意如果你在Anaconda环境下建议直接用conda装库或者用pip装到当前虚拟环境避免不同项目之间的包版本冲突。3.2 第一步先写一个最小的“试探”程序我的习惯是先写一个极其精简的版本把数据抓回来看看长什么样而不是一步到位写完整版。这就像炒菜前先尝一口盐味别等整锅菜端上桌才发现齁咸。import requests url https://www.2345.com/weather/api/newdiyi.php params { citycode: 101020100, day: 3 } headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36, Referer: https://www.2345.com/weather/ } r requests.get(url, paramsparams, headersheaders, timeout10) print(r.status_code) print(r.text[:500])如果看到200和一长串JSON文本说明接口通路已打通。如果出现403或者418之类状态码大概率是请求头被识别了回头检查UA和Referer。这一步的“试探”价值还在于确认编码。你可以在r.encoding里看到requests推断的编码如果出现乱码手动设置r.encoding utf-8再试。3.3 完整爬虫代码逐段讲解下面给出完整版本。这段代码包含三个核心能力构造请求、解析数据、保存CSV。代码里的注释我尽量写得详细方便你直接对照理解。# -*- coding: utf-8 -*- 2345天气网城市天气预报数据采集 作者实战向 用途演示requests JSON解析 CSV存储的完整流程 import requests import json import csv import time class WeatherSpider: def __init__(self, citycode): self.citycode citycode self.url https://www.2345.com/weather/api/newdiyi.php self.headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36, Referer: https://www.2345.com/weather/ } def fetch_data(self, days3): 获取某个城市的天气预报数据 params { citycode: self.citycode, day: days } try: resp requests.get(self.url, paramsparams, headersself.headers, timeout10) resp.raise_for_status() resp.encoding utf-8 return resp.json() except requests.exceptions.RequestException as e: print(f[错误] 请求失败: {e}) return None def parse_weather(self, json_data): 解析JSON提取我们需要的字段 if not json_data: return [] city json_data.get(city, 未知) weather_list json_data.get(data, []) result [] for item in weather_list: one_day { 城市: city, 城市代码: self.citycode, 日期: item.get(date), 天气: item.get(weather), 最高温度: item.get(temp_max), 最低温度: item.get(temp_min), 风力风向: item.get(wind) } result.append(one_day) return result def save_to_csv(self, weather_rows, filename): 把解析后的数据写入CSV文件 if not weather_rows: print([警告] 没有数据可保存) return fieldnames [城市, 城市代码, 日期, 天气, 最高温度, 最低温度, 风力风向] with open(filename, modew, encodingutf-8-sig, newline) as f: writer csv.DictWriter(f, fieldnamesfieldnames) writer.writeheader() writer.writerows(weather_rows) print(f[成功] 数据已保存到 {filename}) if __name__ __main__: # 上海城市代码 101020100可自行替换为其他城市 spider WeatherSpider(101020100) data spider.fetch_data(days3) rows spider.parse_weather(data) spider.save_to_csv(rows, shanghai_weather.csv)这里有几个写代码以外的细节需要强调encodingutf-8-sig这个参数是我推荐你一定要用的。它会在CSV文件开头写入一个BOM头这样你用Excel打开文件时中文不会乱码。如果你用普通的utf-8Python和记事本打开没问题但Excel会显示成乱码——这是Windows老用户的痛国产软件生态也大多跟Excel走所以后缀加-sig是一种更保险的做法。time.sleep在这样的单次请求场景下可以不写但如果后面你做批量多城市采集建议每次请求间隔2到3秒防止被服务器限流或封IP。这属于爬虫礼仪问题后面章节细讲。3.4 扩展多城市批量采集如何做爬一个城市不过瘾自然会想爬一堆城市。这时城市代码表就派上用场了。2345天气网有城市列表页你可以通过一次请求拿到全国城市及对应ID。更通用简单的方式是自己维护一个城市ID字典比如cities { 北京: 101010100, 上海: 101020100, 广州: 101280101, 深圳: 101280601, 杭州: 101210101 }然后循环遍历批量采集spider WeatherSpider() all_rows [] for city, code in cities.items(): spider.citycode code data spider.fetch_data(days3) rows spider.parse_weather(data) all_rows.extend(rows) print(f{city} 抓取完成得到 {len(rows)} 条数据) time.sleep(2) # 每请求一次停2秒温柔一点 spider.save_to_csv(all_rows, multi_cities_weather.csv)这种批量思路才是爬虫真正发挥威力的地方——手复制粘贴几百个网页肯定崩溃写循环跑一遍就完事了。3.5 进阶扩展用SQLAlchemy存数据库本来这个项目用CSV收尾完全够用但你如果希望数据能被长期反复查询、整合到更大的项目里那最好存进SQLite或MySQL。我在这里用SQLAlchemy做一个最小演示不去展开ORM高深用法只做到能存能取。先安装pip install sqlalchemy代码from sqlalchemy import create_engine, Column, String, Integer from sqlalchemy.orm import declarative_base, sessionmaker Base declarative_base() class Weather(Base): __tablename__ weather_data id Column(Integer, primary_keyTrue, autoincrementTrue) city Column(String(50)) citycode Column(String(20)) date Column(String(20)) weather Column(String(50)) temp_max Column(String(10)) temp_min Column(String(10)) wind Column(String(50)) engine create_engine(sqlite:///weather.db) Base.metadata.create_all(engine) Session sessionmaker(bindengine) session Session() # 假设 rows 是之前parse_weather返回的list for row in rows: record Weather(**row) session.add(record) session.commit() print(入库成功)值得注意的点Weather(**row)这行代码用了解包操作将字典里的键值直接映射为ORM模型的属性。这里要求字典的键名和模型字段名必须一致所以上面的parse_weather里字典的键设计就得提前想好。这算是一个“数据建模意识”爬下来只是第一步数据怎么组织、怎么为后续分析服务才是更值钱的能力。4. 常见问题与排查技巧实录4.1 常见异常速查表写代码的路上总会踩坑这里我把高频问题和对应排查思路整理成一张表你可以直接对照异常现象可能原因排查思路状态码403请求头被识别缺少UA/Referer加上完整headers看Network里浏览器发的请求头复制一份状态码418触发反爬幽默状态码降低请求频率检查是否请求太快JSON解析报错返回的可能是HTML而不是JSON先打印resp.text前200字符判断是不是被重定向到了验证页中文乱码编码不对手动设置resp.encoding utf-8或gbkCSV中Excel打开乱码编码不是utf-8-sig改用utf-8-sig重新写文件接口返回null/空数据城市ID写错对照城市列表确认citycode是否有误连接超时网络问题加timeout参数适当重试4.2 关于反爬的几条红线建议我理解的“爬虫礼仪”或者说“安全底线”是这样几条第一只抓公开数据不碰需要登录才能看的私有数据第二控制请求频率别用多线程疯狂催命式请求人家网站也是要钱的第三抓下来的数据自己用就好不要批量倒卖这既是法律风险也是道德问题第四发现网站有robots.txt声明不允许抓取的内容尊重一下。实践里2345天气网这类天气站的反爬其实比较温和你只要带了完整的浏览器请求头控制好频率基本不会被封。真正容易惹麻烦的是那种“并发几十个线程轰同一个接口”的写法分分钟把你的IP送走。4.3 抓包工具的选择心得我在教程开头提到Fiddler但说实话对于纯Web网页抓包Chrome的F12已经非常够用了。Fiddler更适合做移动端App抓包、HTTPS解密这些更复杂的场景。如果你是初学者建议先把F12的Network面板、Preserve log、Filter这几个功能玩熟再考虑引入独立抓包工具。Fiddler真正上手的时候有一个关键坑抓HTTPS包需要安装并信任它的根证书否则看到的全是乱码“CONNECT”字样。具体操作是在Fiddler里打开Tools Options HTTPS勾选Decrypt HTTPS traffic然后按提示安装证书。这个过程不难但很多人的抓包“失败”都卡在这一步。4.4 城市ID获取技巧从页面里反查如果你不知道某个城市的ID最简单的办法不是去网上搜列表而是直接打开2345天气网在搜索框输入城市名回车后看浏览器地址栏URL里的数字编码。那个数字就是citycode。这个方法“现场反查”比任何静态列表都可靠。比方说我输入“成都”URL变成.../weather/chengdu.htm具体编码取决于网站的跳转逻辑你只要观察链接里出现的数字段复制出来就行。靠这种方式积累一份自己的城市ID笔记比到处找别人整理的旧列表要稳妥得多。5. 实操总结与个人经验补充最后分享几个我反复踩过的坑。第一是关于requests.get的params参数和url拼接的取舍建议直接用params字典传参requests会自动做URL编码比你手动拼接字符串靠谱得多。第二是关于打印调试抓回来的数据即使看起来很规整也建议每次都打印前几条看看因为网站改版升级是很常见的接口返回字段名说变就变你的代码必须跟着变。第三是保存文件的时机不要等所有城市抓完才保存每抓一个城市就追加写入一次防止中途报错导致全部数据丢失。其实做爬虫做到后来最大的感触是这个技术本身不复杂复杂的是对目标的敬畏——对目标网站稳定运行的敬畏对自己数据使用边界的约束。2345天气网这个案例像一个“样板间”把请求、解析、存储、异常处理这些环节都串了一遍。你把这个流程玩熟了往后遇到任何数据采集需求心里至少会有一个清晰的行动框架先分析、再试探、后写完整代码、最后考虑存储和扩展。接下来你可以自己动手做的练习换一个城市跑一遍程序然后试着把days参数改成7观察返回的数据结构变化。如果能顺手把这批数据存入SQLite并做一个小查询那这一篇教程的价值就真正吃到肚子里了。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

S/4HANA迁移实战:基于SNP工具链与Kyano验证的选择性迁移策略 2026/9/30 10:52:00

S/4HANA迁移实战:基于SNP工具链与Kyano验证的选择性迁移策略

这个标题放在不少SAP顾问群里,估计能炸出一堆同行。S/4HANA迁移推了这么多年,真正落地最难的不是技术多高深,而是业务中断窗口和存量数据迁移的风险控制。RISE with SAP把云化节奏推快了,但客户问的第一句话永远是:我那…

阅读更多 →
Linux `arch` 命令详解:一条命令快速识别主机硬件架构(linux-command 命令手册) 2026/9/30 10:51:59

Linux `arch` 命令详解:一条命令快速识别主机硬件架构(linux-command 命令手册)

文档教程 【免费下载链接】linux-command Linux命令大全搜索工具,内容包含Linux命令手册、详解、学习、搜集。https://git.io/linux 项目地址: https://gitcode.com/GitHub_Trending/linux/linux-command 点击查看 免费下载 arch 是 GNU coreutils 包提…

阅读更多 →
90DaysOfDevOps Day 15:DevOps 工程师每日必备的 Linux 命令实战指南 2026/9/30 10:51:52

90DaysOfDevOps Day 15:DevOps 工程师每日必备的 Linux 命令实战指南

文档/教程 【免费下载链接】90DaysOfDevOps This repository started out as a learning in public project for myself and has now become a structured learning map for many in the community. We have 3 years under our belt covering all things DevOps, including Pri…

阅读更多 →
Node.js Docker 镜像 Tag 与 Digest 深入解析:为什么 `:latest` 标签必须谨慎使用 2026/9/30 10:51:52

Node.js Docker 镜像 Tag 与 Digest 深入解析:为什么 `:latest` 标签必须谨慎使用

文档教程后端 【免费下载链接】nodebestpractices ✅ The Node.js best practices list (July 2026) 项目地址: https://gitcode.com/GitHub_Trending/no/nodebestpractices 点击查看 免费下载 本指南源自 nodebestpractices 项目 Docker 章节的经典条目「Understa…

阅读更多 →
500-AI-Agents-Projects 简历解析 Agent 实战:基于 LangChain 与 GPT-4o-mini 实现简历结构化抽取与候选人匹配评分 2026/9/30 10:51:52

500-AI-Agents-Projects 简历解析 Agent 实战:基于 LangChain 与 GPT-4o-mini 实现简历结构化抽取与候选人匹配评分

示例工程人工智能 【免费下载链接】500-AI-Agents-Projects The 500 AI Agents Projects is a curated collection of AI agent use cases across various industries. It showcases practical applications and provides links to open-source projects for implementation, i…

阅读更多 →
大学生兼职平台毕业设计实战:多角色权限与数据库设计全解析 2026/9/30 10:51:52

大学生兼职平台毕业设计实战:多角色权限与数据库设计全解析

大学生兼职平台这类毕业设计,我最近正好带了一套完整源码,编号 56715,带着几个学生一步步跑通、改前端、写论文、准备答辩。先说结论:这题目看起来不起眼,但它把多角色权限、信息发布、投递流转、审核机制这些企业应用…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉