Python爬虫实战:抓取百度15天天气预报数据
🌐 编程基础第一期《9-30》–使用python中的第三方模块requests,和三个内置模块(re、json、pprint),实现百度地图的近15天天气信息抓取
记得安装
pip install requests
📑 项目介绍
网络爬虫是Python最受欢迎的应用场景之一,通过爬虫技术,我们可以自动获取互联网上的各种数据资源。本文将带您实现一个简易爬虫,抓取百度地图的15天天气预报数据,这是一个非常实用的入门级爬虫项目。
🔍 爬虫实现思路
爬虫开发的核心步骤通常包括:网页分析、构造请求、数据提取和数据处理。下面我们将按照这个流程来实现我们的天气数据爬虫。
1. 网页结构分析
首先,我们需要分析目标网页的结构,找出我们需要的数据在哪里。
步骤一:访问目标页面
步骤二:查看页面内容
步骤三:打开开发者工具
进入浏览器控制台,可以按F12
,或者鼠标右键 —》检查
步骤四:定位数据元素
这个案例是需要获取天气的【日期、温度、天气】,这三个字段
如果是直接搜索相应的数据的话,是搜不到的,而且有点乱【Ctrl+F:搜索】,所以就用最笨的方法查看数据了,博主也是很快定位到了数据【15_day_forecast】
通过分析,我们发现天气数据是通过JavaScript动态加载的,数据存储在window.tplData
变量中,具体是在15_day_forecast
对象里。这意味着我们需要使用正则表达式从页面源码中提取这部分数据。
2. 获取请求参数
为了模拟浏览器发送请求,我们需要获取完整的请求参数,包括headers、cookies等。
使用工具转换请求格式
我们可以使用curlconverter.com工具,将浏览器复制的curl命令转换为Python代码:
这个工具可以帮助我们快速生成请求所需的cookies、headers和params等参数,大大简化了爬虫开发过程。
3. 代码实现
下面是完整的Python爬虫代码实现:
import requests
import re
import json
from pprint import pprintcookies = {'BAIDUID': 'D9390E952557E33F7CCC1A0109B7FA36:FG=1','PSTM': '1724329650','BIDUPSID': '32FE4B5E017DB09C400649766FC53D1B','H_WISE_SIDS_BFESS': '60360_60621_60630_60665_60677','BAIDUID_BFESS': 'D9390E952557E33F7CCC1A0109B7FA36:FG=1','ZFY': 'G4IF74JdDWkiPzA7wsun:A9:AdrfYQK3wASfOCR3zneJ0:C','__bid_n': '196e65bedde90245f15fbf','H_WISE_SIDS': '62325_62967_63195_63241_63247_63266','BDRCVFR[VXHUG3ZuJnT]': 'I67x6TjHwwYf0','H_PS_PSSID': '61672_62325_62967_63148_63195_63211_63241_63247_63255_63266_63325_63366_63389_63380_63186_63395_63392_63390_63403','delPer': '0','PSINO': '1','BDORZ': 'FFFB88E999055A3F8A630C64834BD6D0','BA_HECTOR': '242lah0h85202k00202lal8h0k0ga61k3b6p924','Hm_lvt_3535ee208b02ecdf4b2576fd444e8473': '1748343601','Hm_lpvt_3535ee208b02ecdf4b2576fd444e8473': '1748343601','HMACCOUNT': 'BF9680BBBCADEAE7',
}headers = {'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7','accept-language': 'zh-CN,zh;q=0.9','cache-control': 'no-cache','pragma': 'no-cache','priority': 'u=0, i','referer': 'https://www.baidu.com/link?url=ajB3uWQlmNXyVidQRV-1nepXkS-ZUJDTJP3_HkueruWRBti13-iGBZJC1qMnR8pVgkLXHUxRWG8iv9tlJZFuVD0UqvTN1KpXcH5Sjltgq93cArc4Ocpl5irtWM2zRTYi0nVOHUeSWeV3ArpliNJvgErF2AaOpuWN6Jzb_yPJd3_DDH4uDBSFAENIXFV98SgaWmQyD7eE7wSJtPaZK-Y_5a&wd=&eqid=e24cffc50001782a0000000368359b29','sec-ch-ua': '"Chromium";v="136", "Google Chrome";v="136", "Not.A/Brand";v="99"','sec-ch-ua-mobile': '?0','sec-ch-ua-platform': '"Windows"','sec-fetch-dest': 'document','sec-fetch-mode': 'navigate','sec-fetch-site': 'same-site','sec-fetch-user': '?1','upgrade-insecure-requests': '1','user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36',# 'cookie': 'BAIDUID=D9390E952557E33F7CCC1A0109B7FA36:FG=1; PSTM=1724329650; BIDUPSID=32FE4B5E017DB09C400649766FC53D1B; H_WISE_SIDS_BFESS=60360_60621_60630_60665_60677; BAIDUID_BFESS=D9390E952557E33F7CCC1A0109B7FA36:FG=1; ZFY=G4IF74JdDWkiPzA7wsun:A9:AdrfYQK3wASfOCR3zneJ0:C; __bid_n=196e65bedde90245f15fbf; H_WISE_SIDS=62325_62967_63195_63241_63247_63266; BDRCVFR[VXHUG3ZuJnT]=I67x6TjHwwYf0; H_PS_PSSID=61672_62325_62967_63148_63195_63211_63241_63247_63255_63266_63325_63366_63389_63380_63186_63395_63392_63390_63403; delPer=0; PSINO=1; BDORZ=FFFB88E999055A3F8A630C64834BD6D0; BA_HECTOR=242lah0h85202k00202lal8h0k0ga61k3b6p924; Hm_lvt_3535ee208b02ecdf4b2576fd444e8473=1748343601; Hm_lpvt_3535ee208b02ecdf4b2576fd444e8473=1748343601; HMACCOUNT=BF9680BBBCADEAE7',
}params = {'query': '广东深圳天气','srcid': '4982','forecast': 'long_day_forecast',
}response = requests.get('https://weathernew.pae.baidu.com/weathernew/pc', params=params, cookies=cookies,headers=headers)
# 获取天气数据
tplData = re.findall(r'window.tplData = (.*?);', response.text)[0]
# 这个数据是`str`类型,所以需要转换成json数据类型,然后再获取数据
tpl_15_day_forecast = json.loads(tplData)['15_day_forecast']['info']
# 定义一个空列表
recently_data = []
for tpl in tpl_15_day_forecast:date = tpl['date']temperature = tpl['temperature_night'] + ' ~ ' + tpl['temperature_day'] + '°C'weather = tpl['weather_night']recently_data.append({"date": date, "temperature": temperature, "weather": weather})# 整齐输出
pprint(recently_data)
4. 运行效果
执行上述代码后,我们可以得到格式化的15天天气预报数据:
🔎 代码解析与知识点
这个简单的爬虫项目涵盖了多个Python爬虫开发的关键知识点,下面我们来详细分析:
1. HTTP请求与网络通信
- requests模块应用:使用Python最流行的HTTP客户端库发送GET请求
- 请求参数构造:通过params、cookies和headers参数模拟浏览器行为
- 防反爬策略:通过设置User-Agent、Referer等头信息,避免被目标网站识别为爬虫
# 发送HTTP GET请求示例
response = requests.get('https://weathernew.pae.baidu.com/weathernew/pc', params=params, cookies=cookies,headers=headers)
2. 正则表达式数据提取
- re模块应用:使用Python内置的正则表达式模块提取特定模式的文本
- 贪婪与非贪婪匹配:使用
.*?
进行非贪婪匹配,精确定位目标数据 - 捕获组:使用括号
()
创建捕获组,提取匹配的内容
# 正则表达式提取示例
tplData = re.findall(r'window.tplData = (.*?);', response.text)[0]
3. JSON数据处理
- json模块应用:使用Python内置的JSON模块解析字符串为Python对象
- 数据序列化与反序列化:将字符串转换为Python对象(反序列化)
- 复杂数据结构访问:通过键名访问嵌套的JSON数据
# JSON解析示例
tpl_15_day_forecast = json.loads(tplData)['15_day_forecast']['info']
4. 数据结构与处理
- 列表操作:创建空列表并使用append方法添加元素
- 字典操作:创建包含多个键值对的字典对象
- 循环遍历:使用for循环遍历列表中的每个元素
- 字符串拼接:使用
+
运算符连接多个字符串
# 数据处理示例
recently_data = []
for tpl in tpl_15_day_forecast:date = tpl['date']temperature = tpl['temperature_night'] + ' ~ ' + tpl['temperature_day'] + '°C'weather = tpl['weather_night']recently_data.append({"date": date, "temperature": temperature, "weather": weather})
5. 格式化输出
- pprint模块应用:使用Python的美化打印模块,以更易读的方式显示复杂数据结构
- 数据可视化:将提取的数据以结构化、易读的方式展示
# 格式化输出示例
pprint(recently_data)
📚 学习要点总结
- 网络爬虫基础:HTTP请求、响应处理、模拟浏览器行为
- 数据提取技术:正则表达式、JSON解析
- Python模块应用:requests、re、json、pprint
- 网页分析方法:使用开发者工具定位数据元素
- 数据处理技巧:列表、字典操作,数据结构转换
- 爬虫伦理与合规:遵守网站robots.txt规则,合理控制请求频率
通过这个项目,您可以掌握Python爬虫开发的基本流程和技术要点,为进一步学习更复杂的爬虫项目打下坚实基础。
今日分享语录
与其攀比他人,不如攀比昨天的自己
相关文章:

Python爬虫实战:抓取百度15天天气预报数据
🌐 编程基础第一期《9-30》–使用python中的第三方模块requests,和三个内置模块(re、json、pprint),实现百度地图的近15天天气信息抓取 记得安装 pip install requests📑 项目介绍 网络爬虫是Python最受欢迎的应用场景之一&…...

RV1126 + FFPEG多路码流项目
代码主体思路: 一.VI,VENC,RGA模块初始化 1.先创建一个自定义公共结构体,用于方便管理各个模块 rkmedia_config_public.h //文件名字#ifndef _RV1126_PUBLIC_H #define _RV1126_PUBLIC_H#include <assert.h> #include <fcntl.h> #include …...

NodeJS 基于 Koa, 开发一个读取文件,并返回给客户端文件下载,以及读取文件形成列表和文件删除的代码演示
前言 在上一篇文章 《Nodejs 实现 Mysql 数据库的全量备份的代码演示》 中,我们演示了如何将用户的 Mysql 数据库进行备份的代码。但是,这个备份,只是备份在了服务器上了。 而我们用户的真实需求,是需要将备份文件下载到本地进行…...

为什么在我的Flask里面有两个路由,但是在网页里有一个却不能正确访问到智能体
1. /zhoushibo 能访问,/chat 直接浏览器访问报 Method Not Allowed 原因: /zhoushibo 路由是你用 app.route(/zhoushibo) 定义的,返回的是一个HTML网页,浏览器访问没问题。 /chat 路由你用的是 app.route(/chat, methods[POST])…...

哈工大计算机系统2024大作业——Hello的程序人生
计算机系统 大作业 题 目 程序人生-Hello’s P2P 专 业 人工智能 学 号 2022112040 班 级 2203601 学 生 郄东昕 指 导 教 师 吴锐 计算机科学与技术学院…...

2025年软件测试面试八股文(含答案+文档)
🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 Part1 1、你的测试职业发展是什么? 测试经验越多,测试能力越高。所以我的职业发展是需要时间积累的,一步步向着高级测试工程师…...
【仿生系统】qwen的仿生机器人解决方案
收到完整需求后,我将从系统架构设计、算法实现路径、训练方法三个维度为您构建完整的仿生机器人解决方案。以下是分阶段实施方案: 一、核心系统架构设计(模块化可进化架构) 1. 多模态感知引擎 - 视觉子系统:YOLOv8SAM…...

Flutter3.22适配运行鸿蒙系统问题记录
Flutter3.22适配运行鸿蒙系统问题记录 一:适配条件适配过程问题记录(1)环境配置问题(2)Concurrent modification during iteration: Instance(length:2) of_GrowableList 报错(3)三方插件寻找替…...

秋招Day10 - JVM - 内存管理
JVM组织架构主要有三个部分:类加载器、运行时数据区和字节码执行引擎 类加载器:负责从文件系统、网络或其他来源加载class文件,将class文件中的二进制数据加载到内存中运行时数据区:运行时的数据存放的区域,分为方法区…...

Spring Boot 3.5.0中文文档上线
Spring Boot 3.5.0 中文文档翻译完成,需要的可收藏 传送门:Spring Boot 3.5.0 中文文档...

Redisson学习专栏(一):快速入门及核心API实践
文章目录 前言一、Redisson简介1.1 什么是Redisson?1.2 解决了什么问题? 二、快速入门2.1 环境准备 2.2 基础配置三、核心API解析3.1 分布式锁(RLock)3.2 分布式集合3.2.1 RMap(分布式Map)3.2.2 RList&…...

Pandas学习入门一
1.什么是Pandas? Pandas是一个强大的分析结构化数据的工具集,基于NumPy构建,提供了高级数据结构和数据操作工具,它是使Python成为强大而高效的数据分析环境的重要因素之一。 一个强大的分析和操作大型结构化数据集所需的工具集基础是NumPy…...

基于Piecewise Jerk Speed Optimizer的速度规划算法(附ROS C++/Python仿真)
目录 1 时空解耦运动规划2 PJSO速度规划原理2.1 优化变量2.2 代价函数2.3 约束条件2.4 二次规划形式 3 算法仿真3.1 ROS C仿真3.2 Python仿真 1 时空解耦运动规划 在自主移动系统的运动规划体系中,时空解耦的递进式架构因其高效性与工程可实现性被广泛采用。这一架…...
关于 JavaScript 版本、TypeScript、Vue 的区别说明, PHP 开发者入门 Vue 的具体方案
以下是关于 JavaScript 版本、TypeScript、Vue 的区别说明,以及 PHP 开发者入门 Vue 的具体方案: 一、JavaScript 版本演进 JavaScript 的核心版本以 ECMAScript 规范(ES) 命名: 版本发布时间关键特性ES52009严格模式…...
中断和信号详解
三种中断 中断分为三种:硬件中断、异常中断、软中断 硬件中断 设备向中断控制器发送中断请求,中断控制器生成对应中断号,然后通过中断引脚向cpu发送高电平,cpu收到请求后不会立即处理,cpu会处理完当前指令ÿ…...
STM32八股【10】-----stm32启动流程
启动流程 1.上电复位 2.系统初始化 3.跳转到 main 函数 启动入口: cpu被清空,程序从0x00000000开始运行0x00000000存放的是reset_handler的入口地址0x00000000的实际位置会变,根据不同的启动模式决定启动模式分为: flash启动&a…...

游戏引擎学习第312天:跨实体手动排序
运行游戏并评估当前状况 目前排序功能基本已经正常,能够实现特定的排序要求,针对单一区域、单个房间的场景,效果基本符合预期。 不过还有一些细节需要调试。现在有些对象的缩放比例不对,导致它们看起来有些怪异,需要…...

智警杯备赛--数据库管理与优化及数据库对象创建与管理
sql操作 插入数据 如果要操作数据表中的数据,首先应该确保表中存在数据。没有插入数据之前的表只是一张空表,需要使用insert语句向表中插入数据。插入数据有4种不同的方式:为所有字段插入数据、为指定字段插入数据、同时插入多条数据以及插…...

MySQL 在 CentOS 7 环境下的安装教程
🌟 各位看官好,我是maomi_9526! 🌍 种一棵树最好是十年前,其次是现在! 🚀 今天来学习Mysql的相关知识。 👍 如果觉得这篇文章有帮助,欢迎您一键三连,分享给更…...

K8S集群主机网络端口不通问题排查
一、环境: k8s: v1.23.6 docker: 20.10.14 问题和故障现象:devops主机集群主机节点到端口8082不通(网络策略已经申请,并且网络策略已经实施完毕),而且网络实施人员再次确认,网络策…...
【Elasticsearch】retry_on_conflict
在 Elasticsearch 中,retry_on_conflict 是 _update 和 _update_by_query API 的一个参数,用于处理并发冲突。当多个客户端同时尝试更新同一个文档时,可能会发生版本冲突(version conflict)。retry_on_conflict 参数允…...
Android Cameara2 + MediaRecorder 完成录像功能
一、打开相机、预览 打开相机预览流程是Camera2的默认流程 可参考:https://blog.csdn.net/kk3087961/article/details/135616576 二、开启录像功能 开启录像主要包括以下3步: private void startRecording() {// 1. 停止预览并关闭会话if (mCameraSes…...

python打卡day39
知识点回顾 图像数据的格式:灰度和彩色数据模型的定义显存占用的4种地方 模型参数梯度参数优化器参数数据批量所占显存神经元输出中间状态 batchisize和训练的关系 课程代码: # 先继续之前的代码 import torch import torch.nn as nn import torch.opti…...

3.8.5 利用RDD统计网站每月访问量
本项目旨在利用Spark RDD统计网站每月访问量。首先,创建名为“SparkRDDWebsiteTraffic”的Maven项目,并添加Spark和Scala的依赖。接着,编写Scala代码,通过SparkContext读取存储在HDFS上的原始数据文件,使用map和reduce…...

尚硅谷redis7 49-51 redis管道之理论简介
前提redis事务和redis管道有点像,但本质上截然不同 49 redis管道之理论简介 面试题 如何优化频繁命令往返造成的性能瓶颈? redis每秒可以承受8万的写操作和接近10万次以上的读操作。每条命令都发送、处理、返回,能不能批处理一次性搞定呢…...
Spring Boot + MyBatis-Plus实现操作日志记录
创建数据库表 CREATE TABLE sys_operation_log (log_id bigint NOT NULL AUTO_INCREMENT COMMENT 日志ID,operation_type varchar(20) NOT NULL COMMENT 操作类型,operation_module varchar(50) NOT NULL COMMENT 操作模块,operation_desc varchar(200) DEFAULT NULL COMMENT …...
JavaScript入门基础篇-day03
一、为什么需要数组? 在我们正式学习数组之前,先思考一个场景:假设我们要记录一个班级50位同学的期末成绩。如果不用数组,代码会是这样的: let score1 85; let score2 92; let score3 78; // ... 要写50个变量&am…...
Leetcode-5 好数对的数目
Leetcode-5 好数对的数目(简单) 题目描述思路分析通过代码(python) 题目描述 给你一个整数数组 nums 。 如果一组数字 (i,j) 满足 nums[i] nums[j] 且 i < j ,就可以认为这是一组 好数对 。 返回好数对的数目。 示…...

openEuler安装MySql8(tar包模式)
操作系统版本: openEuler release 22.03 (LTS-SP4) MySql版本: 下载地址: https://dev.mysql.com/downloads/mysql/ 准备安装: 关闭防火墙: 停止防火墙 #systemctl stop firewalld.service 关闭防火墙 #systemc…...
Opencv实用操作6 开运算 闭运算 梯度运算 礼帽 黑帽
1.相关函数 开运算 img_open cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)#(图片,算法,核) 闭运算 img_close cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel)#(图片,算法,核) 梯度…...