python爬虫反反爬:搞定CSS反爬加密

Selenium多线程爬虫实战:绕过复杂反爬与MongoDB数据存储 在数据采集领域,反爬机制是开发者面临的核心挑战之一。其原理通常涉及请求参数加密、行为指纹检测和动态内容加载,旨在识别和拦截自动化脚本。为了高效、稳定地获取数据,技术选型至关重要。Selenium通过模拟真实浏览器环境,能够有效绕过前端加密和动态令牌验证,从根本上规避复杂的逆向工程。结合多线程并发技术,可以显著提升模拟操作的数据采集效率,弥补其单线程速度的不足。在数据存储层面,面对结构灵活、嵌套关系复杂的网页内容(如论坛帖子和评论),MongoDB的文档模型提供了比传统关系型数据库更自然的适配能力,支持灵活的 阅读详情

0 惯性嘚瑟

刚开始搞爬虫的时候听到有人说爬虫是一场攻坚战,听的时候也没感觉到特别,但是经过了一段时间的练习之后,深以为然,每个网站不一样,每次爬取都是重新开始,所以,爬之前谁都不敢说会有什么结果。

      前两天,应几个小朋友的邀请,动心思玩了一下大众点评的数据爬虫,早就听说大众点评的反爬方式不一般,貌似是难倒了一片英雄好汉,当然也成就了网上的一众文章,专门讲解如何爬取大众点评的数据,笔者一边阅读这些文章寻找大众点评的破解思路,一边为大众点评的程序员小哥哥们鸣不平,辛辛苦苦写好的加密方式,你们这些爬虫写手们这是闹哪样?破解也就算了,还发到网上去,还发这么多~    

       笔者在阅读完这些文章之后,自信心瞬间爆棚,有如此多的老师,还有爬不了的网站,于是,笔者信誓旦旦的开始了爬大众点评之旅,结果,一上手就被收拾了,各个大佬们给出的爬虫方案中竟然有手动构建对照表的过程,拜托,如果我想手动,还要爬虫做什么?别说手动,半自动都不行。

       大家看到这里或许头上有些雾水了,什么手动?什么半自动?还对照表?大佬,你这是什么梗?再不解释一些我就要弃剧了,葛优都拉不回来~

        

      大家先不要着急,静一静~,对照表后面会讲,这里只需要知道我遇到困难了,就可以了,不过咨询了几个大佬之后,好在解决了,革命的路上虽有羁绊,终归还是有同志的~

       好,现在开始入正题,点评的程序员哥哥请不要寄刀片:

1 基础环节

 大众点评的数据爬虫开始还是很正常的,各个题目、菜单基本上都可以搞下来:

       代码如下:

#!/usr/bin/env python
 import requests
 from lxml import etree
 
 header = {"Accept":"application/json, text/javascript",
           "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8",
           "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36",
           "Cookie":"cy=1; cye=shanghai; _lxsdk_cuid=16ca41d3344c8-050eb4ac8f1741-4d045769-1fa400-16ca41d3345c8; _lxsdk=16ca41d3344c8-050eb4ac8f1741-4d045769-1fa400-16ca41d3345c8; _hc.v=38ae2e43-608f-1198-11ff-38a36dc160a4.1566121473; _lxsdk_s=16ce7f63e0d-91a-867-5a%7C%7C20; s_ViewType=10"
           }
 url = 'http://www.dianping.com/beijing/ch10/g34060o2'
 response = requests.get(url, headers=header)
 data = etree.HTML(response.text)
 title = data.xpath('//*[@id="shop-all-list"]/ul/li[1]/div[2]/div[1]/a/@title')
 print(title)

        爬取的结果为:

            

       按照常规的套路,爬虫可以说是写成了。但是,现在的网站大多使用了反爬,一方面担心自己的服务器会被爬虫搞的超负荷,另一方面也为了保护自己的数据不被其他人获取。 

        

        大众点评就是众多带反爬的网站中的佼佼者,使用了比较高级的反爬手法,他们把页面上的关键数字隐藏了起来,增加了爬虫难度,不信~你看:

2 CSS加密

       我们用如下字段爬取商店的评论数:

data = etree.HTML(response.text)
 title = data.xpath('//*[@id="shop-all-list"]/ul/li[1]/div[2]/div[2]/a[1]/b/svgmtsi[1]/text()')
 print(title)

       结果得到的却是如下字段:

       一看傻了,这是什么鬼?

       我们紧接着审查了网站数据,看到的内容却是:

       这是什么鬼?评论数呢?

 

        查看了网站的源代码:

       发现原来显示点评数的字段显示成了:

       这是为什么呢?

       好在网上的大神们给出了解答,这就是CSS加密。

       接下来我们就介绍如何破解CSS加密:

       我们把源代码上加密的部分取下来观察一下:

     <svgmtsi>&#xf784;</svgmtsi>

       我们发现了网上一直在讨论的svgmtsi标签,这个标签是矢量图的标签,基本上意思就是显示在这里的文字是一个矢量图,解析这个矢量图需要到另外一个地方找一个对照表,通过对照表将编码内容翻译成人类可以识别的数字。


       那么,对照表在哪里呢?

       我们先记录下标签中的class值:shopNum(为什么记录,先不要着急,后面会讲到),然后在源代码中查找svg,我们发现了如下内容: 

       大宝藏被挖掘了。

       这好像是个链接,我们点击一下,发现页面跳转到了一个全新的水月洞天:


        这真是个伟大的发现,他预示着我们的爬虫找到了门路,我们在这个页面上查找刚才class中的值shopNum,然后,我们看到了如下内容:   

url("//s3plus.meituan.net/v1/mss_73a511b8f91f43d0bdae92584ea6330b/font/bc2c52b3.woff");}

.shopNum{font-family: 'PingFangSC-Regular-shopNum';}@font-face{font-family:

"PingFangSC-Regular-reviewTag";

src:url("//s3plus.meituan.net/v1/mss_73a511b8f91f43d0bdae92584ea6330b/font/07758223.eot");

      在这段代码中距离shopNum最近的地方,我们找到一个woff文件。

      你没有猜错,这个woff文件就是我们的对照表。

      同样的思路,这是一个网址,我们可以把他下载下来,把这个网址复制到浏览器的地址栏中,点回车,会跳出如下快乐的界面。


       下载完成后,我们在浏览器中打开woff的翻译工具:

        http://fontstore.baidu.com/static/editor/index.html

       我们把&#xf784;前面的&#x去掉并替换成uni,后面的;去掉,得到字段为:unif784。

        秘密揭晓了:

       是不是很眼熟?

       是不是很惊喜?

       是不是很意外?

       恭喜你,第一步成功了~

       这个编码在woff文件中对应的值为7。

       就是我们要找的亲人~

3 woff文件处理

       事情到这里其实就可以画个句号了,因为接下来的思路就变的非常简单了,我们用上面的通用爬虫下载下网站上所有编码和对应的class值,然后根据class值找到对应的woff文件,再在woff文件中确定编码对应的数字或汉字就可以。

      但是,当我们扩充这一思路的时候却遇到了两个问题:

1)如何读取出woff文件中的数字,大众点评有多个woff文件,怎么对照读取呢?难不成要一个个写出来?根据前面网站里的文章来讲,对的,你猜的很准,这就是我文章一开始写的半自动,崩溃了吧,好在笔者找到了新的方法,取代了半自动的问题,这个新的方法就是OCR识别,后面我会仔细讲解。

2)页面的编码是变动的,你没有看错,&#xf784;这个值是会变的,好在这个事件没有发生在大众点评中,但是汽车之家、猫眼等网站使用的CSS加密会随页面的刷新发生变动,有没有惊到你?

如果你只需要大众点评,第二个问题几乎可以不用考虑了,但是笔者认为要做一个有理想的爬虫,尽量多的获取知识点才是正确的,所以,笔者研究了汽车之家、猫眼、天眼等几个用CSS加密的网站,找到了一个通用的方法,下面我们来介绍一下这个通用方法。

先看一下猫眼网站上编码的动态效果:

如图:

      我们先找到一个加密编码,把他复制出来,看到的编码如下:

      然后我们刷新一下页面,再看源码:

       不管你惊不惊,反正我是惊到了~

       针对这一变化,笔者心中产生了一个疑惑,如果说编码会变,那浏览器是怎么获取到准确的值的呢?说明一定存在一个统一的方法供浏览器调用,于是,笔者重新研究了编码的调用方式,惊奇的发现了其中的秘密:

       我们以如下两个编码来揭露这个今天大幂幂:

       &#xf0d5; -->unif0d5

       &#xe765;-->unie765

       这两个字段都是表示数字中的1,那他们有什么规律呢?

       我们首先解码woff文件成xml格式:

from fontTools.ttLib import TTFont
 font = TTFont('e765.woff')
 font.saveXML('e765.xml')

      在pycharm中我们打开xml文件:

 

      找到unie765所在的位置:

 

       这一串代码是字形坐标,浏览器就是根据这个字形坐标翻译出我们能够识别的汉字:1。

       同样的思路,我们再去解析unif0d5的值,得到如下图:


我们惊奇的发现,这两个竟然一样,是不是所有的值对应的字形坐标都是唯一的呢,答案是肯定的,变化的只是上图name中的编码,坐标与数字之间是一对一的,所以,我们的思路来了,我们只需要找到编码所对应的字形坐标,然后想办法解析出这个字形坐标所对应的数字就可以了。

4 完整思路

       问题展示基本上清楚了,我们接下来看一下怎么自动化解决上面两个问题:

       首先展示一下思路:


       这是在excel里面画的,大家可以只关注内容,忽略掉背景线。

       解释一下上面的思路:

       首先:我们从页面上获取到文字编码和woff文件,注意,这里的字形编码和woff文件一定要一起获取,因为每个编码对应一个woff文件,一旦刷新页面,编码在woff文件中的对应关系就会变化,找不到对应的字形坐标。

data = etree.HTML(response.text)
title = data.xpath('//*[@id="shop-all-list"]/ul/li[1]/div[2]/div[2]/a[1]/b/svgmtsi[1]/text()')
print(title)

       其次:我们把字形编码转化成uni开头的编码,并获取到woff文件中的字形坐标。

from fontTools.ttLib import TTFont
font = TTFont('f0d5.woff')
coordinate = font['glyf']['uniF0D5'].coordinates
print(coordinate)

       第三:用matplotlib解析这一坐标,并保存成图片。

#!/usr/bin/env python
 # _*_ UTF-8 _*_
from fontTools.ttLib import TTFont
import matplotlib.pyplot as plt
font = TTFont('f0d5.woff')
coordinate = font['glyf']['uniF0D5'].coordinates
coordinate = list(coordinate)
fig, ax = plt.subplots()
x = [i[0] for i in coordinate]
y = [i[1] for i in coordinate]
plt.fill(x, y, color="k", alpha=1)
# 取消边框
for key, spine in ax.spines.items():
     if key == 'right' or key == 'top' or key == 'bottom' or key == 'left':
         spine.set_visible(False)
plt.plot(x, y)
# 取消坐标:
plt.axis('off')
plt.savefig('uniF0D5.png')
plt.show()

       通过上面的解析,我们可以得到1的图片:

      

       这个1好难看,不过好在解析出来了~

       第四:使用OCR解析这个数字:

# 图片转化成string:
try:
   from PIL import Image
except ImportError:
   import Image
import pytesseract
captcha = Image.open(r'uniF0D5.png')
print(captcha)
result = pytesseract.image_to_string(captcha, lang='eng', config='--psm 6 --oem 3 -c tessedit_char_whitelist=0123456789').strip()
print(result)

        自此,我们的文字就可以直接识别出来了,我们就再也不需要用半自动的小米加步枪了,我们可以直接使用冲锋枪了


      不过需要注意的是使用OCR解码文字需要一定的时间,耗时还是比较长的,如果经常使用这一思路,建议可以构建一个“字形坐标:文字”的数据库表,下次使用时解析出字形坐标,直接到数据库里匹配对应的文字就可以了。

介绍一篇OCR的文章吧,可以了解一下如何解析文字:

http://www.inimei.cn/archives/770.html

-本文完-

Selenium动态网页爬虫实战:从环境搭建到反反爬策略 网络爬虫是自动化获取互联网公开数据的关键技术,其核心原理是模拟客户端向服务器发送请求并解析响应。对于静态网页,传统的请求-解析模式效率很高。然而,随着Web 2.0技术的发展,大量网站采用JavaScript动态渲染内容,数据在初始HTML中并不存在,这给传统爬虫带来了挑战。此时,浏览器自动化工具的价值便凸显出来,它能够驱动真实浏览器执行JavaScript,完整渲染页面后再提取数据,从而有效解决动态内容抓取难题。Selenium作为主流的浏览器自动化工具,在Python爬虫生态中扮演着重要角色,尤其适用于 阅读详情

相关推荐

Playwright实战:高效爬取Shopee动态数据,破解前端反爬策略

在数据采集领域,面对现代网站普遍采用的前端渲染和动态加载技术,传统的静态HTML解析方法往往失效。其核心原理在于,网站通过JavaScript在客户端动态生成内容,导致直接请求的页面源码中缺失关键数据。Playwright作为一款强大的浏览器自动化工具,其技术价值在于能够完整模拟真实浏览器环境,执行所有JavaScript并等待数据渲染完成,从而直接获取到最终呈现在用户面前的结构化信息。在电商数据分析、价格监控、市场研究等应用场景中,这尤其重要。例如,在爬取Shopee这类东南亚主流电商平台时,商品价格、销

weixin_33928137的博客 394

实现CSS在线美化(格式化)、压缩、加密、解密、混淆工具-toolfk程序员工具网

本文要推荐的[ToolFk]是一款程序员经常使用的线上免费测试工具箱,ToolFk 特色是专注于程序员日常的开发工具,不用安装任何软件,只要把内容贴上按一个执行按钮,就能获取到想要的内容结果。ToolFk还支持BarCode条形码在线生成、QueryList采集器、PHP代码在线运行、PHP混淆、加密、解密、Python代码在线运行、JavaScript在线运行、YAML格式化...

无涯教程 5576

泛微OA与金蝶云星空深度集成实战:审批与表单双场景解析

本文深入解析泛微OA与金蝶云星空的深度集成实战,聚焦审批流程与表单对接两大核心场景。通过具体案例,详细阐述了如何实现业务数据与审批流程的自动联动,打破数据孤岛,提升企业运营效率与数据一致性,并分享了接口设计、安全策略及实战避坑指南。

4k5l6j7h8的博客 466

【Python】逆向爬虫-----常见的加密方法

一、MD5加密 MD5加密是一种被广泛使用的线性散列算法,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整的一致性。且MD5加密之后产生的是一个固定长度(32位或16位)的数据。若要破解MD5加密,需要找到MD5加密的基础源码,然后进行逆向。 二、DES/AES加密 DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的算法。该加密算法是一种对称加密方式,其加密运算、解密运算需要使用的是同样的密钥(一组字符串)即可。

CNSamRol的博客 3975

Unity AR涂涂乐实战:用户上传图片秒变3D模型新皮肤(附完整代码)

本文详细介绍了如何在Unity AR应用中实现用户上传图片动态生成3D模型皮肤的功能,重点讲解了动态创建材质球的技术方案和性能优化策略。通过完整的代码示例,开发者可以学习到多源图片处理、移动端内存管理以及AR场景适配等核心技巧,快速打造高性能的儿童教育类AR应用。

weixin_31509753的博客 370

WorkBuddy 实战:从聊天窗口到 AI 工作台,打造个人自动化助理

大模型时代,对话式 AI 常被当作高级搜索框,难以沉淀为生产力。其根源在于上下文断裂——每次对话都从零开始。AI Agent 的核心原理是通过状态保持、工具调用与流程复用,将临时交互固化为可重复的协作机制。WorkBuddy 作为个人 AI 工作台,以 Agent + Skill + 工作流架构解决该问题:Skill 封装操作手册,工作区沉淀知识上下文,自定义指令约束输出风格。这种设计让周报生成、会议纪要、文档初稿、专利检索辅助等重复劳动实现流程化自动产出。掌握 WorkBuddy 怎么用,关键在于从自己重

weixin_33834910的博客 335

python网页爬虫循环获取_Python爬虫之找出网页中加密内容的(入门篇)

从哪儿说起呢很多时候我们都需要去爬取一些网页上的内容,如果运气好是明文内容,那就相对简单了如果是加密后的内容呢?相信很多人都遇到过这种情况,如果你还没解决的话,快看看这文章吧假的开始目标地址:http://dir.scmor.com/google/需要内容:谷歌镜像地址我需要的内容,就是标记处的URL链接真的开始第一步:先手动查看链接的内容1第一步:先手动查看链接的内容一共八个网址,其中第一个的地...

weixin_39986741的博客 1605

173、NPU的编译器开发:开源社区贡献指南

本文分享了在NPU编译器开源社区贡献的经验心得。作者通过实际案例(如卷积维度错误、NaN输出等)阐述了NPU编译器开发的特殊性:硬件迭代快、边界条件复杂、厂商代码不可全信。提出有价值的贡献应聚焦硬件适配测试、性能剖析工具和反模式文档三类内容。强调用实测数据沟通、主动承担维护责任、保持代码通用性等社区协作技巧,并建议通过RFC提前沟通、附硬件实测数据等方式提高PR通过率。最后指出,NPU编译器开发是与聪明人共同填坑的过程,鼓励开发者提交"有诚意的代码"而非完美代码。

m0_50546716的博客 35

Python爬虫(四)

介绍了使用深度学习识别滑动验证码缺口的方法,包括。

qq_52947665的博客 1878

用Virtuoso和Abstract完成gds2lef

需要用到的工具有virtuoso和abstract。 数模混合的项目通常需要模拟完成模块设计,把接去数字的pin打上label(text),数字的floorplan才能正式开始。 如果只需要简单的数字PR boundary和pin点位置,那么只使用virtuoso就够了,还想把模拟版图都转成lef就要用到abstract工具。 1.PR boundary+pin 1)在virtuoso中打开layout a) Gui操作: Create->P&R Objects->

m0_61544122的博客 8743

YOLO系列算法改进 | Head改进篇 | 融合Detect_LSCD轻量共享卷积检测头 | 轻量化设计破解计算瓶颈,增强复杂场景目标感知能力

YOLO系列算法改进 | Head改进篇 | 融合Detect_LSCD轻量共享卷积检测头 | 轻量化设计破解计算瓶颈,增强复杂场景目标感知能力 (以YOLO26最新目标检测模型为基础,融合Detect_LSCD检测头进行改进)

2502_91881744的博客 704

深度解析:用Python爬虫逆向破解加密数据!

大家好!我是敢敢,关注我,收看每期的编程干货。本期文章将带你详细地逆向解析某查查加密数据的构造逻辑,Follow me~

xiaoganbuaiuk的博客 3万+

Open-Sora代码详细解读(1):解读DiT结构

目前开源的DiT视频生成模型不是很多,Open-Sora是开发者生态最好的一个,涵盖了DiT、时空DiT、3D VAE、Rectified Flow、因果卷积等Diffusion视频生成的经典知识点。本篇博客从Open-Sora的代码出发,深入解读背后的原理。

沉迷单车的追风少年 2264

小白如何学习Python爬虫?

另外还有…关于APP、智能化、运维相关的内容我们就不展开说了。至此,爬虫涵盖的一些知识点也就差不多了,梳理一下计算机网络、编程基础、前端开发、后端开发、App 开发与逆向、网络安全、数据库、运维、机器学习都涵盖到了。这里给大家分享一份Python全套学习资料,包括学习路线、软件、源码、视频、面试题等等,都是我自己学习时整理的,希望可以对正在学习或者想要学习Python的朋友有帮助!有需要的可以点击免费领取~,都已经上传至csdn官方账号,扫描下方官方二维码获取,保证100%免费!!!

weixin_72959097的博客 2378

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

想认真学爬虫,我应该怎么入门?

5k字我们把爬虫聊明白!想要学好爬虫没那么简单,首先知识点方面就涉及到了:计算机网络、编程基础、前端开发、后端开发、APP开发与逆向、网络安全、数据库、运维、机器学习、数据分析等各个方向的内容。就像一张大网把现在一些主流的技术栈都连接到了一起,因为涵盖的方向多,所以学起来也比较零散,很多初学者搞不懂要学习什么知识,学习过程中遇到反爬也不知道该用什么方法来解决,今天小编给大家做一些归纳和总结。另外还有…关于APP、智能化、运维相关的内容我们就不展开说了。

2301_82000445的博客 1558

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

想学Python爬虫,如何计划?

另外还有...关于APP、智能化、运维相关的内容我们就不展开说了。至此,爬虫涵盖的一些知识点也就差不多了,梳理一下计算机网络、编程基础、前端开发、后端开发、App 开发与逆向、网络安全、数据库、运维、机器学习都涵盖到了。就想写个爬虫,我到底要学多少东西啊?_ITPUB博客。

黑马程序员官方博客 817

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Python Selenium自动登录脚本实战:从环境搭建到反爬处理

Web自动化是提升开发与运维效率的核心技术,其原理是通过程序模拟用户操作浏览器,实现网页交互的自动化。在数据采集、系统测试和日常任务自动化等场景中,自动登录往往是第一个关键步骤。Python凭借其简洁语法和丰富生态,结合Selenium这一成熟的浏览器自动化工具,成为实现该功能的流行方案。通过元素定位、模拟点击输入和智能等待策略,可以构建健壮的登录流程。然而,实际应用中常需应对验证码、动态加载等反爬机制,这要求脚本具备错误处理和状态验证能力。本文聚焦于Python Selenium自动登录的工程实践,详细解

weixin_30410119的博客 339

Python爬虫进阶:Yi-Coder-1.5B智能解析与反反爬策略

本文介绍了如何在星图GPU平台上自动化部署【ollama】Yi-Coder-1.5B镜像,赋能Python爬虫进阶开发。该轻量级代码理解模型可智能解析混淆JS、逆向加密逻辑与WebAssembly行为,典型应用于电商网站反反爬策略制定与动态参数生成,显著提升数据采集效率与鲁棒性。

weixin_35516624的博客 633
上一篇: 读者福利,单独赠书啦!这次的书你肯定喜欢!
下一篇: 你还在为 TCP 重传、滑动窗口、流量控制、拥塞控制发愁吗?看完图解就不愁了...
编程IT圈
博客等级 码龄6年 1130粉丝 544原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值