爬虫实战:如何优雅地抓取网页中隐藏在伪元素(__before)里的文本? 相信很多写过一段时间爬虫的同学大概率撞过这堵“隐形墙”在浏览器里明明白白显示着9.9的价格或者一段验证码文本但当你切换到 DevTools 时发现那个数字安安静静地挂在某个标签里。然而当你用 requests 抓下来再用 BeautifulSoup 或 XPath 去提取得时候拿到的却是一个空列表。即便你认为是 JS 动态加载一通 Selenium 渲染操作后DOM 里依旧是一无所有。这其实并非 JS 的锅而是 CSS **伪元素Pseudo-elements**在作祟。今天这篇文章我们就从技术根源出发手把手教你如何破除这层“伪装”并结合强大的代理工具实现稳定抓取。根因剖析文本去哪了问题的根源在于你想要抓取的文本根本就不在 DOM 树里。这些文本通常是 CSS 引擎根据 ::before 或 ::after 伪元素的 content 属性在运行时凭空生成的。因为伪元素并不属于 DOM 节点集合传统的 getElementById、querySelector 或者 XPath 自然全都失效了。在动手写代码前我们必须先分清 content 的四种常见取值来源写死的字符串例如 content: “9.9”;值直接硬编码在 CSS 规则中。attr()attr() 函数引用例如 content: attr(data-price);真实数据其实藏在 HTML 元素的>破局方案与实战演示应对这种反爬我们的决策优先级永远是能拿接口绝不渲染能抓静态绝不上自动化。首选方案直采接口。绝大数伪元素只是装饰背后都有明文 JSON 接口支撑。找到接口直接发纯 HTTP 请求速度快且反爬压力小。次选方案正则解析 CSS。如果 content 是写死的字符串或来自 attr()可以直接把 CSS 抓下来用正则提取不需要启动浏览器。终极方案渲染引擎 代理 IP。当 CSS 是动态注入的或者强制使用 counter() 渲染时我们就必须祭出 Selenium / Playwright 并调用 window.getComputedStyle 来读取最终样式。渲染抓取实战配合爬虫代理走到终极方案时一个无法回避的问题是单个 IP 使用 Selenium 频繁访问其极其明显的自动化特征会迅速触发验证码甚至封禁。浏览器需要加载完整资源、停留时间长IP 暴露面极大。在这类渲染型抓取中因为会话连续性如保持登录态、Cookie 验证、表单提交的要求一旦中途跳变 IP会导致之前的验证全部失效。此时我们需要使用代理厂商提供的固定转发模式。以爬虫代理为例其固定转发模式能够在一个特定时间窗口通常 1 到 3 分钟内保持出口 IP 一致完美契合了渲染型会话的需要。以下是基于 Selenium 接入固定转发代理并抓取伪元素数据的完整示例代码# 推荐使用 selenium-wire 以支持原生不支持的代理账密认证fromseleniumwireimportwebdriverfromselenium.webdriver.common.byimportByfromselenium.webdriver.support.uiimportWebDriverWaitfromselenium.webdriver.supportimportexpected_conditionsasECimporttime# 1. 配置亿牛云代理固定转发模式保持IP在时间窗口内连续proxyHostt.16yun.cnproxyPort31111proxyUserusername# 替换成你的账号proxyPasspassword# 替换成你的密码options{proxy:{http:fhttp://{proxyUser}:{proxyPass}{proxyHost}:{proxyPort},https:fhttp://{proxyUser}:{proxyPass}{proxyHost}:{proxyPort},no_proxy:localhost,127.0.0.1# 绕过本地请求}}# 2. 启动浏览器driverwebdriver.Chrome(seleniumwire_optionsoptions)try:urlhttps://example.com/product/123driver.get(url)# 3. 避免 headless 时序陷阱不能仅等待元素存在要轮询判断 content 是否渲染# 定义一个自定义的等待函数轮询获取 ::before 的内容deadlinetime.time()10# 10秒超时extracted_priceNonewhiletime.time()deadline:# 执行 JS 获取 getComputedStylevaldriver.execute_script(return getComputedStyle(document.querySelector(.price), ::before).getPropertyValue(content);)# 伪元素存在时有效内容不会是空或 noneifvalandval!none:# getPropertyValue(content) 返回的结果通常会包裹着额外的双引号或单引号extracted_priceval.strip().strip()breaktime.sleep(0.3)ifextracted_price:print(f成功抓取伪元素价格:{extracted_price})else:print(伪元素内容未能在规定时间内渲染。)finally:driver.quit()进阶避坑指南在实操过程中再点出几个很容易踩坑的地方返回值自带引号就像代码中展示的一样使用 getPropertyValue(‘content’) 取出来的如果是字符串它会原样返回 ““9.9”。一定要用 strip(”‘).strip(’) 进行清洗不然你的数据库里全都是脏数据。警惕图片“文字”如果 content 返回的是 url(…)请立刻停止尝试提取文本那实质上是一张图片。你要么去找其他数据源接口要么只能引入复杂的 OCR 链路。不要轻信 attr()attr()如果通过静态解析 CSS 发现 content 是 attr(data-price)千万别以为大功告成了你拿到的只是一个表达式。你必须回到那个真实的 DOM 节点上去提取它自身的>

相关新闻

最新新闻

TradingAgents多智能体量化交易框架:无GPU环境4步本地部署教程

TradingAgents多智能体量化交易框架:无GPU环境4步本地部署教程

TradingAgents多智能体量化交易框架:无GPU环境4步本地部署教程 【免费下载链接】TradingAgents-AI.github.io TradingAgents: Multi-Agents LLM Financial Trading Framework 项目地址: https://gitcode.com/GitHub_Trending/tr/TradingAgents-AI.github.io …

2026/8/29 16:06:57
国内知名的AI算力芯片测试座公司提高芯片测试效率

国内知名的AI算力芯片测试座公司提高芯片测试效率

随着AI大模型算力需求爆发式增长,AI芯片的性能迭代速度已从传统的"两年一更"缩短至"一年甚至半年一更"。作为芯片量产前的"质检关卡",测试座(Socket)的效率直接决定了芯片的出货速度和良率成本。然…

2026/8/29 16:06:57
HP Z820工作站BIOS救砖实战:双BIOS芯片识别、编程器刷写与风险规避

HP Z820工作站BIOS救砖实战:双BIOS芯片识别、编程器刷写与风险规避

简介:BIOS(基本输入输出系统)是计算机硬件初始化和启动操作系统的底层固件,其核心原理在于存储并执行初始化硬件、引导系统的指令。随着硬件发展,UEFI逐渐取代传统BIOS,支持更快的启动和更大的硬盘。在服务…

2026/8/29 16:06:57
PCF8591芯片实战指南:从I2C通信到ADDA转换的嵌入式应用

PCF8591芯片实战指南:从I2C通信到ADDA转换的嵌入式应用

1. 项目概述:从“信号”到“世界”的桥梁 在嵌入式开发和电子制作的世界里,我们常常需要让单片机这个“数字大脑”与外部“模拟世界”对话。单片机处理的是0和1,是离散的数字信号;而现实世界中的温度、光线、声音、压力&#xff0…

2026/8/29 16:06:57
AI玩具技术全景:大模型、Agent与端云协同实战指南

AI玩具技术全景:大模型、Agent与端云协同实战指南

前两天我拆开一个刚到手的AI玩偶,装好电池,它开口喊了一声我的名字。那一瞬间我确实愣了一下。以前我们熟悉的AI基本都活在手机屏幕里,但这一轮大模型落地潮,肉眼可见地朝着“物理世界”狂奔——毛绒玩具、桌面机器人、故事机、手…

2026/8/29 16:06:57
Windows 文件被占用删不掉?File Locksmith 文件解锁完整指南

Windows 文件被占用删不掉?File Locksmith 文件解锁完整指南

Windows 文件被占用删不掉?File Locksmith 文件解锁完整指南 【免费下载链接】PowerToys Microsoft PowerToys is a collection of utilities that supercharge productivity and customization on Windows 项目地址: https://gitcode.com/GitHub_Trending/po/Pow…

2026/8/29 16:01:56