有问有答丨点评字体反爬虫中混淆定位暗坑

1,123 阅读3分钟

事情很直接,我来分享一下。在技术群里有朋友提出了这么一个问题和需求:

上面的一连串截图就是事情的大致经过,我来整理一下。群友 Ares 遇到的问题是在面对大众点评字体爬时不知道如何确定被混淆文字的位置,且混淆位置是随机的。当你遇到下图的代码时:

被混淆的是后面 3 位,前 2 位数字没被混淆。但换一个页面情形又不一样了,这就是困扰他的原因。群友 Rua 提出的正则是一个解决的办法,我觉得思路很好。这里我尝试了另一种解决的办法,和正则同样有效且效果稳定。我捋出了这些情况:

  1. 这个 id 为 reviewCount 的 span 标签下有不定长的字符串
  2. 字符串会被混淆,且混淆的个数不定
  3. 混淆字符在字符串中的位置不定
  4. 最后几个字是固定的—— 条评论
  5. 混淆字符被 d 标签包裹着

如果我在工作中面对这个问题,我来编写代码会怎么处理呢?

  1. 我认为要定位到 id 为 reviewCount 的 span 标签
  2. 然后想办法拿到 span 标签下的文字
  3. 接着去除 HTML 标签、空格和换行符得到纯文本

假设用 x 来代替被混淆的字符,以上图为例,这时候我得到的应该是 11xxx。现在我需要在字符串 11xxx 中找到 xxx 的位置即可。按照群友 Ares 的理解,得到的 11xxx 有可能是 1xx1x 或者 x1x1x,遂很难判断位置在哪。

这里我用一个取巧的方式:强制类型转换

既然 11xxx 的原身是数字,那么我是不是可以用强制转换的方式判断字符是否为数字呢?

即能转换的就是数字,不能转换的就是其它字符,这样我只需要记录下不能转换字符的下标就可以了。离成功只有一步,那就是编码。现在我们来整理一下用到的知识点或者技术点

  1. 解析文本 —— 文本解析器,例如 Parsel
  2. 定位 —— 路径查找语法,XPATH 或者 CSS 选择器语法
  3. 抽取文字 —— XPATH 或者 CSS 选择器语法中的 text 函数
  4. 去除噪声(HTML 标签、空格和换行符)—— DOM 操作器,例如 lxml;stirp 函数;
  5. 强制类型转换 —— 内置类型转换,例如 int
  6. 错误处理 —— 异常捕获和处理,try except
  7. 判断位置且记录 —— for 循环和容器(例如列表)

我就不一步步分析了,伸手党是不存在的,请用手敲,完整代码如下:

经过几个页面的测试,确认没有问题。

如果你喜欢这样的文章,请在评论区留言告诉我。同时为韦世东的新书 《Python3 反爬虫原理与绕过实战》 加油打 Call,图灵 5 折活动 现价 44.5