爬虫实战:如何优雅地抓取网页中隐藏在伪元素(__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 节点上去提取它自身的>

相关新闻

最新新闻

企业拓客难?沃创云大模型AI外呼,8大优势实现降本增效

企业拓客难?沃创云大模型AI外呼,8大优势实现降本增效

电销行业人力成本高、接通率低、人工效率参差不齐,是多数企业拓客的痛点。沃创云依托大模型打造AI外呼系统,打造更自然、智能、高效的客户触达方案,一站式解决企业外呼难题。八大核心优势,重塑外呼模式 1. 真人级自然对话&#xf…

2026/7/7 8:47:20
AI智能诊断Core Dump:从段错误到分钟级定位的工程实践

AI智能诊断Core Dump:从段错误到分钟级定位的工程实践

1. 项目概述:当AI遇见段错误,一场静默的“谋杀案”侦破如果你是一名后端或系统开发,一定对“段错误”(Segmentation Fault)和它留下的“犯罪现场”——core dump文件——又爱又恨。爱的是,当程序在线上神秘…

2026/7/7 8:47:20
概率数据结构:用极低内存实现近似计数与集合判断

概率数据结构:用极低内存实现近似计数与集合判断

为什么需要概率数据结构 在处理海量数据流或内存受限的场景下,精确数据结构的代价往往高得难以承受。例如,一个存储1亿个64位整数的Python列表需要约3.8 GiB RAM(每个整数作为独立对象开销巨大),而改用array(l)后仅需约760 MiB。即便如此,当数据量达到十亿级别时,内存仍…

2026/7/7 8:47:20
海王IM即时通讯—单聊群聊群组全覆盖,满足多元场景需求

海王IM即时通讯—单聊群聊群组全覆盖,满足多元场景需求

海王IM即时通讯—单聊群聊群组全覆盖,满足多元场景需求 海王IM即时通讯私有化部署,指企业将聊天服务器部署在自己机房或私有云上,数据完全由企业掌握,不经过第三方平台。这种模式特别适合金融、政企等对数据安全和合规要求严苛的…

2026/7/7 8:47:20
抖音监控助手:如何轻松实现24小时自动追踪心仪博主动态

抖音监控助手:如何轻松实现24小时自动追踪心仪博主动态

抖音监控助手:如何轻松实现24小时自动追踪心仪博主动态 【免费下载链接】douyin_dynamic_push 【抖音】视频动态、直播间开播检测与推送 项目地址: https://gitcode.com/gh_mirrors/do/douyin_dynamic_push 还在为错过抖音博主的精彩直播和最新视频而烦恼吗&…

2026/7/7 8:47:20
Web安全入门实战:从零搭建合法靶场与核心漏洞手动测试指南

Web安全入门实战:从零搭建合法靶场与核心漏洞手动测试指南

1. 项目概述:为什么你需要这份“避坑指南”?如果你刚接触Web安全,或者已经看过一些教程但感觉云里雾里,总觉得哪里不对劲,那这篇文章就是为你准备的。我干了十多年安全,从渗透测试到应急响应,见…

2026/7/7 8:42:20

月新闻