Python爬虫面对CSS偏移反爬机制时该如何还原真实文本?

大辰姑娘_7670

大辰姑娘_7670

2026-10-12

728人浏览

原创

必须结合css偏移值重新排序文本节点,而非依赖dom顺序;先定位逻辑字段容器,提取子节点的left/transform值并转为数值坐标,按x升序(或多行分组后排序)重组字符,动态场景需用selenium执行js实时获取偏移。

python爬虫面对css偏移反爬机制时该如何还原真实文本?

直接用 BeautifulSoup 或 lxml 解析 HTML 拿到的文本是乱序或覆盖后的结果,必须结合 CSS 偏移值重新排序——这不是字符替换问题,而是视觉层与 DOM 层的错位。

怎么定位被偏移的真实文本节点

关键不是找“哪个标签里有文字”,而是找“哪组标签共同构成一个逻辑字段”。比如价格、电话、评分这类数值型数据,常被拆成多个 <b></b> 或 <span></span>,每个子节点只含 1 个字符,靠 left、top 或 transform 定位。

  • 先用浏览器开发者工具选中目标区域(如价格容器),右键 → “Edit as HTML”,观察内部嵌套结构:是否有多层 <b></b> + <i></i>?是否有重复 class 名(如 char-0、char-1)?
  • 检查这些子节点的 computed styles,重点关注 left(单位通常是 px)、transform: translateX(...)、z-index 和 visibility。注意:有些站点用 opacity: 0 隐藏干扰层,但元素仍存在 DOM 中
  • 排除伪元素干扰:::before 和 ::after 的 content 属性可能插入干扰字符,需在 Elements 面板中勾选 “Show user agent shadow DOM” 并展开伪元素查看

如何提取并还原偏移顺序

不能靠肉眼数位置,得把 CSS 偏移值转为可排序的数值坐标,再按视觉流(从左到右/从上到下)重组。

python 查询技能
python 查询技能

查询客流数据,输出JSON格式,可直接导入Bitable等可视化工具

下载
  • 用 selenium 获取每个子节点的 location 和 size:elem.location_once_scrolled_into_view 确保可见,再调用 elem.location(返回 {'x': xx, 'y': yy})和 elem.size
  • 对同一逻辑字段下的所有子节点,统一按 x 坐标升序排列;若存在多行(如 y 值差 > 字高 1.5 倍),则先分组再每组内排序
  • 避免硬编码像素阈值:用 elem.rect 获取完整边界框,比单纯 location 更稳定;若页面缩放或字体渲染差异大,优先用 transform 中的数值(如 translateX(-64px) 直接取 -64)
  • 示例逻辑:
    chars = []<br>for elem in driver.find_elements(By.CSS_SELECTOR, '.price-container b'):<br>    style = elem.get_attribute('style')<br>    left_match = re.search(r'left:\s*(-?\d+)px', style)<br>    if left_match:<br>        chars.append((int(left_match.group(1)), elem.text.strip()))<br>chars.sort(key=lambda x: x[0])<br>real_text = ''.join(c[1] for c in chars)

动态偏移和随机化怎么应对

很多站点每次刷新都重置 left 值或打乱节点顺序,静态规则会失效。此时必须放弃“解析一次建映射表”的思路,改用运行时实时计算。

  • 别依赖节点顺序:DOM 中 <b>1</b><b>2</b><b>3</b> 不代表视觉就是 123,得完全以 CSS 偏移为准
  • 警惕 JS 动态注入:有些偏移值由 JS 计算后写入 style,用 requests 拿到的 HTML 里没有真实值,必须用 selenium 或 playwright 执行 JS 后再取
  • 若偏移量来自内联 JS 变量(如 window.offsetMap = {a: -32, b: 0, ...}),可用 driver.execute_script("return window.offsetMap") 提前读取,再映射到对应节点
  • 性能提示:selenium 获取每个节点样式是慢操作,尽量用单次 find_elements + 批量 get_attribute('style'),别循环调用 get_attribute 多次

最易忽略的一点:偏移还原后还要校验语义合理性。比如还原出的“电话”含字母、“价格”带中文逗号,大概率排序逻辑有偏差——这时候得回头检查是否漏了隐藏层、是否误把 z-index 更高的干扰节点纳入排序。真实场景里,视觉还原只是第一步,逻辑校验才是兜底防线。

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1711

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

4324

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1689

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

25217

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3067

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3087

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1163

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

596

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2403

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Sass 教程
Sass 教程

共14课时 | 1.5万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 5.9万人学习

CSS教程
CSS教程

共754课时 | 96.9万人学习