手把手教你用Python抓取全国天气数据(附实战代码)[特殊字符]

前言:为什么选择天气数据?

最近帮学妹做课程设计(她居然想用Excel手动录入天气数据!),果断祭出Python爬虫大法。相比其他数据源,天气数据有三大优势:① 数据更新频率高 ② 结构化程度好 ③ 学习价值大(包含时间、地点、数值多维信息)!!!

一、准备你的"挖矿工具"

1.1 基础装备清单

  • Python 3.8+(别用老版本自找麻烦)
  • requests库(网络请求必备神器)
  • BeautifulSoup4(HTML解析老司机)
  • pandas(数据整理大杀器)
  • 你的浏览器开发者工具(F12打开新世界)

1.2 超实用技巧

# 安装依赖一条龙
pip install requests bs4 pandas --user -i https://pypi.tuna.tsinghua.edu.cn/simple

(重要提示)国内用户一定要用清华镜像源!速度直接起飞🛫

二、锁定目标网站

这里以【中国天气网】为例(www.weather.com.cn),注意看它的robots.txt文件:

User-agent: *
Disallow: /e/
Disallow: /m/

(划重点)我们要爬的市级页面在/www/weather/目录下,完全合规!!!

三、实战代码分解

3.1 获取网页源代码

import requests

url = 'http://www.weather.com.cn/weather/101020100.shtml'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}

response = requests.get(url, headers=headers)
response.encoding = 'utf-8'  # 解决中文乱码问题
print(response.text[:500])  # 预览前500字符

(避坑指南)遇到403错误?八成是User-Agent被识别为爬虫,把headers伪装得更像浏览器!

3.2 解析数据的关键XPath

用开发者工具定位元素,发现天气数据在:

<div class="c7d">
    <ul class="t clearfix">
        <li>
            <h1>14日(今天)</h1>
            <p class="wea">多云</p>
            <p class="tem">28℃</p>
        </li>
        <!-- 后续日期结构相同 -->
    </ul>
</div>

3.3 完整解析代码

from bs4 import BeautifulSoup

soup = BeautifulSoup(response.text, 'html.parser')
weather_list = []

for item in soup.select('.t.clearfix li'):
    date = item.h1.text
    weather = item.select_one('.wea').text
    temp = item.select_one('.tem').text.strip()
    
    weather_list.append({
        '日期': date.split('(')[0],
        '星期': date.split('(')[1][:-1],
        '天气': weather,
        '温度': temp.replace('\n', '')
    })

print(weather_list[:3])  # 查看前3天数据

(神操作)用split()处理日期中的括号,比正则表达式更简单高效!

四、数据存储与可视化

4.1 保存到CSV

import pandas as pd

df = pd.DataFrame(weather_list)
df.to_csv('shanghai_weather.csv', index=False, encoding='utf_8_sig')

4.2 温度变化折线图

import matplotlib.pyplot as plt

# 清洗温度数据
df['最高温'] = df['温度'].str.split('/').str[0].str.replace('℃','').astype(int)
df['最低温'] = df['温度'].str.split('/').str[1].str.replace('℃','').astype(int)

plt.figure(figsize=(10,6))
plt.plot(df['日期'], df['最高温'], label='最高温度', marker='o')
plt.plot(df['日期'], df['最低温'], label='最低温度', marker='x')
plt.title('上海未来7天气温趋势')
plt.xticks(rotation=45)
plt.legend()
plt.savefig('weather_trend.png')

(效果预览)生成的折线图能清晰看到温差变化,学妹直呼专业!

五、高级技巧扩展

5.1 自动获取城市代码

中国天气网的城市代码规律:

  • 北京:101010100
  • 上海:101020100
  • 广州:101280101
    发现规律了吗?前三位是区号+01结尾!

5.2 多城市批量爬取

city_codes = {
    '北京': '101010100',
    '上海': '101020100', 
    '广州': '101280101'
}

all_data = []
for city, code in city_codes.items():
    url = f'http://www.weather.com.cn/weather/{code}.shtml'
    # 爬取逻辑同上...
    all_data.extend(city_data)

5.3 应对反爬策略

  • 随机User-Agent池
  • 代理IP轮换
  • 随机访问间隔
  • 禁用Cookie

(血泪教训)千万别用time.sleep(1)这种固定间隔,用random.uniform(0.5, 3)更安全!

六、常见问题FAQ

Q:返回的数据是乱码怎么办?
A:先检查response.encoding是否正确,或者用response.content.decode(‘utf-8’)

Q:突然获取不到数据了?
A:八成是网站改版了,用浏览器F12查看新结构,及时调整CSS选择器

Q:想爬历史天气数据?
A:试试这个接口:http://d1.weather.com.cn/calendar/2023/101020100_202303.html

(机密透露)带__参数的需要处理JavaScript加密,下次教大家破解方法!

结语:你的第一个天气数据集

按照本教程,你可以轻松获得:

  • 结构化天气数据CSV文件
  • 可视化温度趋势图
  • 多城市天气比对能力

赶紧用这些数据做个天气分析APP,或者结合机器学习预测天气变化吧!遇到问题欢迎评论区交流~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值