一、需求分析(先想清楚要什么!)

做爬虫项目第一步永远不是写代码!!!先明确目标:我们要获取中国主要城市最近7天的天气数据,包含以下信息:

  • 城市名称(比如北京、上海)
  • 日期(2023-12-01格式)
  • 最高/最低温度(带摄氏度符号)
  • 天气状况(晴/多云/雨等)
  • 风力风向(东北风3-4级)

二、技术选型(工具选对,事半功倍!)

  1. Requests库:发送HTTP请求的神器(比urllib好用100倍!)
  2. BeautifulSoup4:HTML解析界的瑞士军刀
  3. Pandas:数据处理的扛把子
  4. Pyecharts:可视化装X利器(比Matplotlib更酷炫!)

安装命令(先准备好这些武器):

pip install requests beautifulsoup4 pandas pyecharts

三、实战开始(系好安全带!)

3.1 锁定目标网站

推荐使用中国天气网(www.weather.com.cn),该网站:

  • 数据权威可靠
  • 页面结构清晰
  • 反爬措施相对宽松(新手友好!)

3.2 网页结构分析(关键步骤!)

以北京天气页面为例,按F12打开开发者工具:

  • 城市名称在<div class="crumbs fl">下的最后一个<a>标签
  • 日期在<ul class="t clearfix">下的<h1>标签
  • 温度数据藏在<div class="tem"><span><i>标签
  • 天气状况在<p class="wea">

3.3 代码实现(核心代码来了!)

import requests
from bs4 import BeautifulSoup
import pandas as pd

def get_weather(city_code):
    url = f'http://www.weather.com.cn/weather/{city_code}.shtml'
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
    }
    
    try:
        response = requests.get(url, headers=headers)
        response.encoding = 'utf-8'
        soup = BeautifulSoup(response.text, 'html.parser')
        
        # 解析城市名称
        city = soup.select('.crumbs.fl a')[-1].text
        
        # 解析7天数据
        weather_list = []
        for item in soup.select('.t.clearfix li'):
            date = item.h1.text
            temp = item.select_one('.tem').text.strip().replace('\n', '/')
            wea = item.select_one('.wea').text
            wind = item.select_one('.win i').text
            
            weather_list.append({
                '城市': city,
                '日期': date,
                '温度': temp,
                '天气': wea,
                '风力': wind
            })
            
        return pd.DataFrame(weather_list)
    
    except Exception as e:
        print(f'抓取出错啦!错误信息:{e}')
        return None

# 示例:获取北京天气(城市代码101010100)
df = get_weather('101010100')
print(df.head())

3.4 数据存储(存好了才安心)

把数据保存到CSV:

df.to_csv('weather_data.csv', index=False, encoding='utf-8-sig')

四、可视化展示(让数据说话!)

4.1 温度变化折线图

from pyecharts.charts import Line

line = Line()
line.add_xaxis(df['日期'].tolist())
line.add_yaxis('最高温度', [int(x.split('/')[0]) for x in df['温度']])
line.add_yaxis('最低温度', [int(x.split('/')[1]) for x in df['温度']])
line.set_global_opts(title_opts={"text": "北京近7日温度变化"})
line.render('temperature.html')

4.2 天气分布饼图

from pyecharts.charts import Pie

weather_count = df['天气'].value_counts()
pie = Pie()
pie.add("", [list(z) for z in zip(weather_count.index, weather_count.values)])
pie.set_global_opts(title_opts={"text": "天气类型分布"})
pie.render('weather_pie.html')

五、避坑指南(血泪经验!)

  1. User-Agent一定要设置!否则秒被识别为爬虫
  2. 注意编码格式!中文网站常用gbk/gb2312/utf-8
  3. 控制请求频率!加个time.sleep(2)更安全
  4. 异常处理要完善!网络波动、元素不存在都要考虑
  5. 城市代码表需要提前整理(文末附常见城市代码)

六、扩展玩法(玩点更酷的!)

  • 定时爬取:用schedule库每天自动抓取
  • 发送邮件:用smtplib把天气数据发到自己邮箱
  • 微信推送:通过Server酱推送到手机
  • 语音播报:用pyttsx3实现语音天气预报

附:常用城市代码表

城市 代码
北京 101010100
上海 101020100
广州 101280101
深圳 101280601
杭州 101210101

(完整城市代码表可以访问国家气象信息中心官网获取)

写在最后

爬虫虽好,可不要贪杯哦~(你懂的!)建议:

  1. 遵守网站robots协议
  2. 控制请求频率
  3. 不要用于商业用途
  4. 及时删除敏感数据

遇到问题欢迎评论区交流,代码亲测有效,赶紧跑起来试试吧!

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐