Python爬虫入门:用Requests和BeautifulSoup抓取天气数据

发布时间:2026/9/10 10:57:21

Python爬虫入门:用Requests和BeautifulSoup抓取天气数据 1. Python Web爬虫入门指南最近在帮朋友抓取一些公开的天气数据时发现很多刚接触Python爬虫的同学都会卡在基础环节。今天我就用最直白的方式带大家从零开始搭建一个能实际运行的网页爬虫。不需要复杂的环境配置只要你会基本的Python语法跟着做就能上手。我们这次要用的就是Python里最经典的两个库Requests和BeautifulSoup。Requests负责把网页内容搬到我们的电脑里BeautifulSoup则像手术刀一样帮我们精准提取需要的数据。这种组合特别适合新手因为它既不会像Scrapy那样需要学习复杂框架又能完成90%的常见爬取任务。2. 环境准备与工具安装2.1 Python环境配置首先确保你的电脑已经安装了Python 3.6以上版本。在命令行输入python --version如果显示版本号说明已安装如果报错则需要去Python官网下载安装包。有个小技巧安装时务必勾选Add Python to PATH选项这样后续使用会方便很多。2.2 安装必备库我们将通过pip安装三个核心工具pip install requests beautifulsoup4 lxmlrequests网络请求库版本建议≥2.22.0beautifulsoup4HTML解析库版本建议≥4.9.0lxml解析器比Python内置的html.parser速度更快注意国内用户如果下载慢可以加上清华源参数-i https://pypi.tuna.tsinghua.edu.cn/simple3. 爬虫核心原理剖析3.1 HTTP请求与响应机制当我们在浏览器输入网址时背后其实发生了这样的对话浏览器客户端请给我这个网页的内容发送HTTP请求服务器好的这是你要的HTML文档返回HTTP响应Requests库就是帮我们自动化这个过程的工具。相比浏览器它更轻量且可编程。比如获取百度首页import requests response requests.get(https://www.baidu.com) print(response.text) # 打印网页源代码3.2 HTML解析原理服务器返回的HTML就像一份装修设计图BeautifulSoup就是帮我们看懂这份图纸的翻译官。它把杂乱的HTML标签转换成树形结构让我们可以用类似文件路径的方式定位元素。假设有这样一段HTMLdiv classweather span classcity北京/span span classtemp28℃/span /divBeautifulSoup可以这样提取数据from bs4 import BeautifulSoup soup BeautifulSoup(html_doc, lxml) city soup.find(span, class_city).text temp soup.find(span, class_temp).text4. 实战天气预报爬虫开发4.1 目标网站分析我们以中国天气网为例http://www.weather.com.cn。打开页面后按F12进入开发者工具在Elements面板查看网页结构在Network面板观察数据请求发现城市天气数据主要在class为tem和sky的div中。这里有个重要技巧始终先检查robots.txt文件http://www.weather.com.cn/robots.txt确认允许爬取的路径。4.2 完整爬取代码实现import requests from bs4 import BeautifulSoup def get_weather(city_code): url fhttp://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, headersheaders, timeout5) response.encoding utf-8 soup BeautifulSoup(response.text, lxml) # 提取天气数据 weather_div soup.find(div, class_t) date weather_div.find(h1).text temp weather_div.find(p, class_tem).text.strip() weather weather_div.find(p, class_wea).text return { date: date, temperature: temp, weather: weather } except Exception as e: print(f爬取失败: {str(e)}) return None # 示例获取北京天气城市代码可以从网页URL获取 print(get_weather(101010100))4.3 关键参数说明User-Agent模拟浏览器访问避免被识别为爬虫timeout设置超时时间防止长时间等待encoding指定编码格式解决中文乱码问题try-except异常处理增强程序健壮性5. 高级技巧与反爬对策5.1 常见反爬机制破解频率限制遇到429错误时import time time.sleep(random.uniform(1, 3)) # 随机延迟IP封禁使用代理IP池proxies { http: http://proxy_ip:port, https: https://proxy_ip:port } requests.get(url, proxiesproxies)动态加载对于AJAX请求需要分析XHR接口在开发者工具的Network面板找XHR类型的请求直接调用数据接口获取JSON格式数据5.2 数据存储方案爬取的数据可以多种方式保存# CSV存储 import csv with open(weather.csv, a, newline) as f: writer csv.writer(f) writer.writerow([date, temp, weather]) # Excel存储需安装openpyxl from openpyxl import Workbook wb Workbook() ws wb.active ws.append([date, temp, weather]) wb.save(weather.xlsx) # 数据库存储SQLite示例 import sqlite3 conn sqlite3.connect(weather.db) cursor conn.cursor() cursor.execute(INSERT INTO weather VALUES (?,?,?), (date, temp, weather)) conn.commit()6. 常见问题排查手册6.1 错误代码速查表错误现象可能原因解决方案404 Not FoundURL错误或页面不存在检查URL拼写确认页面可访问403 Forbidden被服务器拒绝访问添加Headers模拟浏览器429 Too Many Requests请求过于频繁增加延迟时间或使用代理IP中文乱码编码格式不匹配设置response.encodingutf-8AttributeError元素查找失败先用print(soup)确认HTML结构6.2 调试技巧逐步打印法print(response.status_code) # 先看状态码 print(response.text[:500]) # 查看部分返回内容 print(soup.prettify()) # 格式化输出HTML结构XPath辅助定位 虽然BeautifulSoup主要用find方法但有时XPath更直观from lxml import etree tree etree.HTML(response.text) city tree.xpath(//span[classcity]/text())[0]7. 项目扩展方向掌握了基础爬虫后可以尝试这些进阶玩法定时爬取用schedule库实现每日自动抓取import schedule import time def job(): print(开始执行爬取任务...) # 爬虫代码 schedule.every().day.at(08:00).do(job) while True: schedule.run_pending() time.sleep(1)可视化展示用matplotlib绘制温度变化曲线import matplotlib.pyplot as plt dates [周一, 周二, 周三] temps [22, 25, 19] plt.plot(dates, temps) plt.title(一周温度变化) plt.show()邮件通知通过smtplib发送天气预警import smtplib from email.mime.text import MIMEText def send_email(content): msg MIMEText(content) msg[Subject] 天气预警 smtp smtplib.SMTP(smtp.163.com) smtp.login(your_email163.com, password) smtp.sendmail(your_email163.com, targetqq.com, msg.as_string())8. 法律与道德规范在开发爬虫时务必注意遵守robots.txt协议不爬取个人隐私数据控制请求频率避免对目标服务器造成压力商业用途需获得授权用户生成内容(UGC)需特别谨慎处理我个人的经验是对于重要项目最好在代码中加入延迟参数像这样# 人性化爬取设置 DELAY 3 # 秒 MAX_PAGE 10 # 限制爬取页数刚开始做爬虫时我曾因为没设置延迟导致IP被封。后来发现把爬虫想象成一个有礼貌的访客很重要——不要太频繁按门铃适可而止地获取需要的信息就好。
延伸阅读

更多相关文章

2026/9/10 10:57:21

Comsol多孔介质两相流模拟:水驱油过程建模与实战解析

水驱油,这几个字在我们做油气田开发模拟的人眼里,其实就是把地层里那些靠天然能量已经采不出来的原油,用注入水一点一点顶出来。整个过程听起来简单,真正落到数值模拟层面就麻烦不少:水进到孔隙里不是均匀推进的&#…

2026/9/10 10:52:20

MTProxy硬件加速:使用AES-NI提升加密性能

MTProxy硬件加速:使用AES-NI提升加密性能 MTProxy作为一款高效的代理工具,其核心优势在于通过加密技术保障数据传输安全。而AES-NI(Advanced Encryption Standard Instruction Set)硬件加速技术的应用,更是让MTProxy的…

2026/9/10 11:52:31

Phase Goal

Phase Goal 【免费下载链接】get-shit-done A light-weight and powerful meta-prompting, context engineering and spec-driven development system for Claude Code by TCHES. 项目地址: https://gitcode.com/GitHub_Trending/getshi/get-shit-done As a new user, I…

2026/9/9 13:11:35

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/10 11:16:38

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/9 16:31:09

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/10 0:00:55

目录对比去重实战:用哈希算法精准清理重复文件

我电脑里现在还有一块换了三次机的“数据墓地”硬盘,里面存着2016年以前所有旧笔记本的完整备份。平时不觉得有什么,直到前阵子想把它整理归档,发现同一个安装包、同一批照片、同一份论文草稿,在几个不同的备份目录里反复出现。更…

2026/9/10 0:00:55

Leaflet离线地图完整Demo合集:内网部署与坐标纠偏实战

简介:这是一份面向Web GIS开发者的LeafLet离线地图示例合集,帮助开发者快速掌握离线地图从搭建到交互的完整流程。压缩包共723个文件,大小14.06MB,以319个js脚本、175个html页面和29个css样式文件为主体,配合png/svg图…

2026/9/10 0:00:55

MATLAB读取Rinex 3.02观测文件:多系统GNSS数据解析实战

简介:基于MATLAB开发的Rinex3.02版观测文件(o文件)读取代码包,面向卫星定位导航方向的学习者与研究人员,用于解决新版观测文件的数据解析、历元提取与时间转换问题。压缩包共4个文件,包含两个m脚本、一个19…

2026/9/7 16:23:03

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/7 22:46:00

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/9 10:21:54

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码