【Python爬虫高级技巧】BeautifulSoup高级教程:数据抓取、性能调优、反爬策略,全方位提升爬虫技能!
大家好,我是唐叔!上期我们聊了 BeautifulSoup的基础用法 ,今天带来进阶篇。我将分享爬虫老司机总结的BeautifulSoup高阶技巧,以及那些官方文档里不会告诉你的实战经验!
文章目录
- 一、BeautifulSoup性能优化技巧
- 1. 解析器选择玄机
- 2. 加速查找的秘诀
- 二、复杂HTML处理技巧
- 1. 处理动态属性
- 2. 嵌套数据提取
- 三、反爬对抗实战方案
- 1. 伪装浏览器头
- 2. 处理CloudFlare防护
- 3. 随机延迟策略
- 四、企业级实战案例:电商价格监控
- 需求分析
- 完整实现
- 五、BeautifulSoup的局限性
- 什么时候不该用BeautifulSoup?
- 替代方案对比
- 六、唐叔的爬虫心法
- 七、资源推荐
一、BeautifulSoup性能优化技巧
1. 解析器选择玄机
# 测试不同解析器速度(100KB HTML文档)
import timeit
html = open("page.html").read()print("html.parser:", timeit.timeit(lambda: BeautifulSoup(html, 'html.parser'), number=100))
print("lxml: ", timeit.timeit(lambda: BeautifulSoup(html, 'lxml'), number=100))
print("html5lib: ", timeit.timeit(lambda: BeautifulSoup(html, 'html5lib'), number=100))
实测结论:
- lxml比html.parser快约3-5倍
- html5lib比lxml慢约10倍
- 黄金法则:稳定性要求高用html5lib,速度优先用lxml
2. 加速查找的秘诀
# 低效写法(逐层查找)
soup.find('div').find('ul').find_all('li')# 高效写法(CSS选择器一次性定位)
soup.select('div > ul > li')
性能对比:
方法 | 10次查找耗时(ms) |
---|---|
链式find | 45 |
CSS选择器 | 12 |
二、复杂HTML处理技巧
1. 处理动态属性
# 查找包含data-开头的属性
soup.find_all(attrs={"data-": True})# 正则匹配属性值
import re
soup.find_all(attrs={"class": re.compile("btn-.*")})
2. 嵌套数据提取
目标:提取作者信息和出版日期
<div class="book"><span>作者:<em>唐叔</em></span><p>出版:2023-06</p>
</div>
代码:
# 传统写法
author = soup.find(class_="book").em.text
date = soup.find(class_="book").p.text.split(":")[1]# 更健壮的写法
book = soup.find(class_="book")
author = book.find(text=re.compile("作者:")).find_next("em").text
date = book.find(text=re.compile("出版:")).split(":")[1]
三、反爬对抗实战方案
1. 伪装浏览器头
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36','Accept-Language': 'zh-CN,zh;q=0.9','Referer': 'https://www.google.com/'
}
2. 处理CloudFlare防护
# 需要配合cloudscraper库
import cloudscraper
scraper = cloudscraper.create_scraper()
html = scraper.get("https://受保护网站.com").text
soup = BeautifulSoup(html, 'lxml')
3. 随机延迟策略
import random
import timedef random_delay():time.sleep(random.uniform(0.5, 3.0))
四、企业级实战案例:电商价格监控
需求分析
- 定时抓取某电商平台商品价格
- 处理JavaScript渲染内容
- 绕过反爬机制
- 异常监控和报警
完整实现
import requests
from bs4 import BeautifulSoup
import random
import time
from datetime import datetimedef monitor_price(url):try:# 1. 伪装请求headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)','Accept-Encoding': 'gzip'}proxies = {'http': 'http://10.10.1.10:3128','https': 'http://10.10.1.10:1080'}# 2. 随机延迟time.sleep(random.randint(1, 5))# 3. 获取页面response = requests.get(url, headers=headers, proxies=proxies, timeout=10)response.raise_for_status()# 4. 解析价格soup = BeautifulSoup(response.text, 'lxml')price = soup.find('span', class_='price').text.strip()name = soup.find('h1', id='product-name').text.strip()# 5. 数据存储log = f"{datetime.now()},{name},{price}\n"with open('price_log.csv', 'a') as f:f.write(log)return float(price.replace('¥', ''))except Exception as e:# 6. 异常处理send_alert_email(f"监控异常: {str(e)}")return Nonedef send_alert_email(message):# 实现邮件发送逻辑pass
关键技巧:
- 使用随机User-Agent轮换(可准备UA池)
- 代理IP池应对IP封锁
- 完善的异常处理机制
- 请求间隔随机化
五、BeautifulSoup的局限性
什么时候不该用BeautifulSoup?
- 页面完全由JavaScript渲染 → 考虑Selenium/Puppeteer
- 需要处理大量异步请求 → 直接分析API接口
- 超大规模数据抓取 → Scrapy框架更合适
替代方案对比
场景 | 推荐工具 | 优势 |
---|---|---|
简单静态页 | BeautifulSoup | 轻量易用 |
复杂动态页 | Selenium | 能执行JS |
API接口 | Requests | 直接高效 |
大型项目 | Scrapy | 完整框架 |
六、唐叔的爬虫心法
- 二八法则:80%的网站用BeautifulSoup+Requests就能搞定,不必过度设计
- 伦理边界:设置合理的爬取频率,尊重robots.txt
- 数据思维:先分析网站结构再写代码,事半功倍
- 持续进化:定期更新反爬策略,像维护产品一样维护爬虫
终极忠告:
“最厉害的爬虫工程师不是会绕过所有反爬,而是能让爬虫像真实用户一样优雅地获取数据”
七、资源推荐
- 官方文档:https://www.crummy.com/software/BeautifulSoup/bs4/doc/
- CSS选择器备忘单:https://www.w3schools.com/cssref/css_selectors.asp
- 反爬对抗库:
- fake-useragent:UA伪装
- requests-html:JS渲染
- scrapy-splash:高级渲染
如果觉得有用,别忘了点赞关注!关于爬虫工程化的更多实践,我们下期再见!
唐叔说:“技术人要学会把经验转化为可复用的方法论,这才是真正的成长。希望这篇能帮你少走弯路!”
【爬虫】往期文章推荐:
- 【Python爬虫神器】requests库常用操作详解 ,附实战案例
- 【Python爬虫高级技巧】requests库高级用法 - 代理SSL流式一网打尽
- 【建议收藏】Python爬虫必学BeautifulSoup:5分钟上手,小白也能高效抓取豆瓣网页数据!
更多内容可以关注《唐叔学Python》专栏。
相关文章:
【Python爬虫高级技巧】BeautifulSoup高级教程:数据抓取、性能调优、反爬策略,全方位提升爬虫技能!
大家好,我是唐叔!上期我们聊了 BeautifulSoup的基础用法 ,今天带来进阶篇。我将分享爬虫老司机总结的BeautifulSoup高阶技巧,以及那些官方文档里不会告诉你的实战经验! 文章目录 一、BeautifulSoup性能优化技巧1. 解析…...
【动手学深度学习】卷积神经网络(CNN)入门
【动手学深度学习】卷积神经网络(CNN)入门 1,卷积神经网络简介2,卷积层2.1,互相关运算原理2.2,互相关运算实现2.3,实现卷积层 3,卷积层的简单应用:边缘检测3.1࿰…...
IPSG 功能协议
IPSG(IP Source Guard)即 IP 源保护,是一种基于 IP 地址和 MAC 地址绑定的安全功能,用于防止 IP 地址欺骗和非法的 IP 地址访问。以下是配置 IPSG 功能的一般步骤: 基于端口的 IPSG 配置 进入接口配置模式࿱…...
19.go日志包log
核心功能与接口 基础日志输出 Print 系列:支持 Print()、Println()、Printf(),输出日志不中断程序。 log.Print("常规日志") // 输出: 2025/03/18 14:47:13 常规日志 log.Printf("格式化: %s", "数据") Fatal…...
横扫SQL面试——TopN问题
横扫SQL面试 电商平台的"销量Top10商品"🛍️,内容社区的"热度Top5文章“”🔥,还是金融领域的"交易额Top3客户"💰——TopN问题无处不在! 无论是日常业务分析📊&#x…...
高级:微服务架构面试题全攻略
一、引言 在现代软件开发中,微服务架构被广泛应用于构建复杂、可扩展的应用程序。面试官通过相关问题,考察候选人对微服务架构的理解、拆分原则的掌握、服务治理的能力以及API网关的运用等。本文将深入剖析微服务架构相关的面试题,结合实际开…...
使用MATIO库读取Matlab数据文件中的cell结构数据
使用MATIO库读取Matlab数据文件中的cell结构数据 MATIO是一个用于读写Matlab数据文件(.mat)的C/C库。下面我将展示如何使用MATIO库来读取Matlab文件中的cell结构数据。 示例程序 #include <stdio.h> #include <stdlib.h> #include <matio.h>int main(int …...
pyTorch框架使用CNN进行手写数字识别
目录 1.导包 2.torchvision数据处理的方法 3.下载加载手写数字的训练数据集 4.下载加载手写数字的测试数据集 5. 将训练数据与测试数据 转换成dataloader 6.转成迭代器取数据 7.创建模型 8. 把model拷到GPU上面去 9. 定义损失函数 10. 定义优化器 11. 定义训练…...
新能源汽车电子电气架构设计中的功能安全
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 周末洗了一个澡,换了一身衣服,出了门却不知道去哪儿,不知道去找谁,漫无目的走着,大概这就是成年人最深的孤独吧! 旧人不知我近况,新人不知我过…...
使用binance-connector库获取Binance全市场的币种价格,然后选择一个币种进行下单
一个完整的示例,展示如何使用 api 获取Binance全市场的币种价格,然后选择一个最便宜的币种进行下单操作 代码经过修改,亲测可用,目前只可用于现货,合约的待开发 获取市场价格:使用client.ticker_price()获取所有交易对的当前价格 账户检查:获取账户余额,确保有足够的资…...
HikariCP 源码核心设计解析与 ZKmall开源商城场景调优实践
HikariCP 作为 Spring Boot 默认数据库连接池,其高性能源于独特的无锁设计、轻量级数据结构和精细化生命周期管理。以下从源码解析与 ZKmall开源商城性能调优两个维度展开: 一、HikariCP 源码核心设计解析 无锁并发控制与 ConcurrentBag 容器 Concur…...
P1036 [NOIP 2002 普及组] 选数(DFS)
题目描述 已知 n 个整数 x1,x2,⋯,xn,以及 1 个整数 k(k<n)。从 n 个整数中任选 k 个整数相加,可分别得到一系列的和。例如当 n4,k3,4 个整数分别为 3,7,12,19 时,可得全部的组合与它…...
自然语言处理
自然语言处理基础 什么是自然语言处理:让计算机来理解人类所说的一种语言。自然语言处理实际就是让计算机理解人类说的话,然后像人一样进行交互,去进行对话,去生成自然语言。 自然语言处理的基本任务 词性标注:把给…...
LeetCode刷题常见的Java排序
1. 字符串排序(字母排序) 首先,你的代码实现了根据字母表顺序对字符串中的字母进行排序,忽略了大小写并且保留了非字母字符的位置。关键点是: 提取和排序字母:通过 Character.isLetter() 判断是否为字母,并利用 Character.toLowerCase() 来忽略大小写进行排序。保留非字…...
# 利用OpenCV和Dlib实现疲劳检测:守护安全与专注
利用OpenCV和Dlib实现疲劳检测:守护安全与专注 在当今快节奏的生活中,疲劳和注意力不集中是许多人面临的常见问题,尤其是在驾驶、学习等需要高度集中精力的场景中。疲劳不仅影响个人的健康和安全,还可能导致严重的事故。为了应对…...
python基础-16-处理csv文件和json数据
文章目录 【README】【16】处理csv文件和json数据【16.1】csv模块【16.1.1】reader对象【16.1.2】在for循环中, 从reader对象读取数据【16.1.3】writer对象【16.1.5】DictReader与DictWriter对象 【16.4】json模块【16.4.1】使用loads()函数读取json字符串并转为jso…...
Mysql 数据库编程技术01
一、数据库基础 1.1 认识数据库 为什么学习数据库 瞬时数据:比如内存中的数据,是不能永久保存的。持久化数据:比如持久化至数据库中或者文档中,能够长久保存。 数据库是“按照数据结构来组织、存储和管理数据的仓库”。是一个长…...
基于SSM的车辆管理系统的设计与实现(代码+数据库+LW)
摘要 当下,正处于信息化的时代,许多行业顺应时代的变化,结合使用计算机技术向数字化、信息化建设迈进。以前企业对于车辆信息的管理和控制,采用人工登记的方式保存相关数据,这种以人力为主的管理模式已然落后。本人结…...
BugKu Simple_SSTI_2
这个题很简单,主要是记录一下,做题的原理: 打开环境,提示我们用flag传参,然后我们需要判断是什么模板: 这里有一张图片,可以帮助我们轻松判断是什么模板类型:这个图片找不到出处了&…...
浙考!【触发器逻辑方程推导(电位运算)】
RS触发器是浙江高考通用技术一大考点。“对角线原则”、“置1置0”、“保持”、“不使用”、“记忆功能”…经常让考生云里雾里,非常反直觉。 这篇文章,我想以高中生的视角诠释一下触发器。 1、触发器逻辑方程推导(以或非门触发器为例&…...
二叉树的前序中序后序遍历
一、前序遍历 144. Binary Tree Preorder Traversal 递归代码实现: /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* …...
es中节点类型有哪些
Elasticsearch 节点类型有哪些 在 Elasticsearch 中,节点类型(或角色)定义了每个节点在集群中的职责。不同版本的 Elasticsearch 对节点角色的定义和管理方式有所不同,尤其在 7.9.0 版本引入 node.roles 后,配置方式更…...
【学习笔记】深度学习环境部署相关
文章目录 [AI硬件科普] 内存/显存带宽,从 NVIDIA 到苹果 M4[工具使用] tmux 会话管理及会话持久性[A100 02] GPU 服务器压力测试,gpu burn,cpu burn,cuda samples[A100 01] A100 服务器开箱,超微平台,gpu、…...
游戏引擎学习第206天
回顾并为当天的工作定下目标 接着回顾了前一天的进展。之前我们做了一些调试功能,并且已经完成了一些基础的工作,但是还有一些功能需要继续完善。其中一个目标是能够展示实体数据,以便在开发游戏逻辑系统时,可以清晰地查看和检查…...
Rust所有权详解
文章目录 Rust所有权所有权规则作用域 内存和分配移动与克隆栈空间堆空间 关于函数的所有权机制作为参数作为返回值 引用与租借垂悬引用 Rust所有权 C/C中我们对于堆内存通常需要自己手动管理,手动申请和释放,即便有了智能指针,对于效率的影…...
贪心算法的使用条件
1. 算法原理 贪心算法是一种在每一步选择中都采取当前状态下最优(局部最优)的策略,从而希望最终得到全局最优解的算法。其核心思想是:“目光短浅” 地选择当前最优解,不回溯、不瞻前顾后。 示例:活动选择问…...
网络性能优化参数关系解读 | TCP Nagle / TCP_NODELAY / TCP_QUICKACK / TCP_CORK
注:本文为 “网路性能优化” 相关文章合辑。 未整理去重。 如有内容异常,请看原文。 TCP_NODELAY 详解 lenky0401 发表于 2012-08-25 16:40 在网络拥塞控制领域,Nagle 算法(Nagle algorithm)是一个非常著名的算法&…...
《打破SQL与AI框架对接壁垒,解锁融合新路径》
在当今科技飞速发展的浪潮中,SQL作为管理和处理关系型数据的经典语言,与代表前沿技术的人工智能框架之间的融合,正逐渐成为推动数据驱动型应用发展的重要力量。这种融合所带来的接口实现,不仅是技术上的突破,更是为众多…...
虚拟Ashx页面,在WEB.CONFIG中不添加handlers如何运行
https://localhost:44311/webapi.ashx 虚拟ASHX页面,在WEB.CONFIG中添加handlers,如何不添加节点,直接运行?把页面直接保存ASHX名称?现在是.VB 如果你不想通过在 web.config 里添加 handlers 节点来配置处理程序,而是直接让 .as…...
【ssrf漏洞waf绕过】
SSRF绕过方法 SSRF对于防御方式(waf)绕过方法 SSRF攻击内网的redis 题目一 基于java 的一个 WEBLOGIC 框架 首先我们要知道它内网有什么服务,我们正常给8888端口发送请求是能接受到的,那么我们把8888端口给关闭了,再次请求发现后有一个错误…...
BEVFormer v2(CVPR2023)
文章目录 AbstractIntroductionRelated WorksBEV 3D Object DetectorAuxiliary Loss in Camera 3D Object DetectionTwo-stage 3D Object Detector BEVFormer v2Overall ArchitecturePerspective SupervisionPerspective LossRavamped Temporal EncoderTwo-stage BEV DetectorD…...
车载通信架构 --- AUTOSAR 网络管理
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 周末洗了一个澡,换了一身衣服,出了门却不知道去哪儿,不知道去找谁,漫无目的走着,大概这就是成年人最深的孤独吧! 旧人不知我近况,新人不知我过…...
STM32单片机入门学习——第16节: [6-4] PWM驱动LED呼吸灯PWM驱动舵机PWM驱动直流电机
写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难,但我还是想去做! 本文写于:2025.04.05 STM32开发板学习——第16节: [6-4] PWM驱动LED呼吸灯&PWM驱动舵机&PWM驱…...
RoMo: Robust Motion Segmentation Improves Structure from Motion
前言 看起来像是一篇投稿CVPR的文章,不知道被哪个瞎眼审稿人拒了。同期还有一篇CVPR被接收的工作Segment Any Motion in Videos,看起来不如这篇直白(也可能是因为我先看过spotlesssplats的缘故),后面也应该一并介绍了…...
【AI编程学习之Python】第五天:Python的变量和常量
对象 Python中一切变量的值皆为对象。每个对象由:标识(identity)、类型(type)、value(值)组成。 标识用于唯一标识对象,通常对应于对象在计算机内存中的地址。使用内置函数id(obj)可返回对象obj的标识。 类型用于表示对象存储的“数据”的类型。类型可以限制对象的取值范围以…...
经典算法 约数之和
原题目链接 问题描述 假设现在有两个自然数 A 和 B,设 S 为 A^B 的所有约数之和。 请你计算:S mod 9901 的值。 输入格式 在一行中输入两个用空格隔开的整数 A 和 B。 输出格式 输出一个整数,表示 S mod 9901 的值。 数据范围 0 ≤ A, …...
zookeeper基本概念和核心作用
图片来源: 02-Zookeeper概念_哔哩哔哩_bilibili02-Zookeeper概念是黑马程序员Zookeeper视频教程,快速入门zookeeper技术的第2集视频,该合集共计24集,视频收藏或关注UP主,及时了解更多相关视频内容。https://www.bilib…...
蓝桥杯嵌入式客观题二
十四届模拟一 1. 2.串口通信是一种传输线按位数据顺序传输方式 3.USART_SR是属于STM32微控制器USART的状态寄存器。 4.STM32G431RBT6是32位的ARM微控制器 ARM处理器是英国ARM公司设计的一种低功耗RISC微处理器 5.中断配置EXTI->FTSR(下降沿触发选择寄存器…...
第一章:服务架构演进史_《凤凰架构:构建可靠的大型分布式系统》_Notes
第一章 服务架构演进史 1. 原始分布式时代(1970s-1980s) 核心问题:如何用不可靠的硬件构建可靠的大规模系统? 关键知识点: 技术背景: 硬件限制:微型计算机性能低下(如Intel 8086处…...
BUUCTF-web刷题篇(13)
22.NiZhuanSiWei 分析:有三个参数需要以get方式传入,发现有file_get_contents(),所以要使用php伪代码,preg_match("/flag/",$file)说明正则匹配不能含有flag,同时还有反序列化,存在漏洞。 已知前…...
7-9 趣味游戏
题目解析 在某个学校的趣味游戏活动中,N 名同学站成一排,他们的年龄恰好是 1 到 N ,需要注意的是他们并不是按照年龄的大小排列的,而是随机排列的。 游戏的规则是请同学们快速计算出,如果在这 N 名同学的小组中&…...
用 Python 制作仓库自动化指南
1. 环境准备 Python 3.x pip (Python 包管理工具) 文本编辑器或 IDE (如 VS Code、PyCharm) 2. 安装依赖库 pandas: 数据处理 openpyxl: Excel 文件操作 sqlite3: SQLite 数据库交互 smtplib: 邮件发送 bash pip install pandas openpyxl sqlite3 smtplib 3. 功能实现…...
Johnson算法——两阶段流水线调度的最优解法
前言:写这个题目的时候感觉就是说任务a的时候是一定需要的,无法避免,怎么才能节约时间呢,就是进行任务a时候也进行任务b 第一个进行的任务a肯定时间越短越好,因为这样b的等待时间越短 最后一个进行的任务b的时候越短越…...
反向查询详解以Django为例
以下给出两张表格 class User(AbstractUser):mobilemodels.CharField(max_length11,default0,uniqueTrue,verbose_name手机号)email_activemodels.BooleanField(defaultFalse,verbose_name邮箱验证状态)default_address models.ForeignKey(Address, related_nameusers, nullT…...
PDP动物性格测试:趣味性格分析工具
PDP动物性格测试:趣味性格分析工具 📝 简介 大家好!今天我想向大家推荐一个有趣且实用的在线工具 —— PDP动物性格测试。这是一个基于PDP(Process Dynamic Pattern)理论的性格测试工具,通过将性格特征与…...
蓝桥杯 完全平方数 刷题笔记
关键分析 --- ### **完全平方数的质因数指数特性** **核心结论**: 一个数是完全平方数,当且仅当它的所有质因数的指数均为偶数。 --- #include <bits/stdc.h> using namespace std; #define int long long int n;signed main(){cin >>…...
C++自学笔记---数组和指针的异同点
数组和指针的异同点 0. 复习一下:指针运算符 * 和 & 我们前两篇有讲过这两个运算符,& 是取地址运算符,* 是解引用运算符。这两个运算符是理解指针的关键,因为它们分别代表了获取变量地址和访问指针指向的值这两个基本操…...
【学习笔记】pytorch强化学习
https://www.bilibili.com/video/BV1zC411h7B8 文章目录 [mcts] 01 mcts 基本概念基本原理(UCB)及两个示例[mcts] 02 mcts from scartch(UCTNode,uct_search, pUCT,树的可视化) [mcts] 01 mcts 基本概念基本…...
C++学习之线程同步
目录 1.线程同步相关概念 2.锁属性-建议锁 3.Mutex互斥锁操作 4.互斥锁使用注意事项 5.互斥量的初始化方法 6.死锁 7.读写锁特性 8.读写锁操作函数 9.读写锁使用示例 10.条件变量操作函数 11.生产者消费者模型简单分析 12.条件变量实现生产者消费者模型代码预览 13…...
定积分的应用(4.39-4.48)
battle cry 前言4.394.404.414.424.434.444.454.464.474.48 前言 题目确实比较多。slow down and take your time. 4.39 狂算了一遍,然后发现不是计算出问题了,是积分上下限写错了。还有把函数代进去也出了一点问题。 点火公式一家人我不记得&#x…...