Python爬虫(四)

一、验证码反爬虫基本原理

验证码意思是:全自动区分计算机与人类的图灵测试,是一种区分用户是计算机还是人的公共全自动程序

1.验证码的作用

网站注册加上验证码,一定程度防止恶意大批量注册
网站登录加上验证码,一定程度防止恶意密码爆破
发表评论加上验证码,一定程度防止恶意灌水
网站投票加上验证码,一定程度防止恶意刷票
频繁访问或者浏览行为不正常,一般可能是遇到了爬虫,可以一定程度上防止爬虫的爬取

2.验证码反爬虫的原理

Session的基本概念:它是存在于服务端的,用于保存当前用户的会话信息,服务端是可以往Session对象里面存一些值的,比如要生成一个图形验证码,比如1234这四个数字的图形验证码。

首先客户端要显示某个验证码,这个验证码相关的信息要从服务器端来获取,比如请求了这个生成验证码的接口,要生成一个图形验证码,内容为1234这时服务端会将 1234 这四个数字保存到 Session 对象里面,然后把 1234 这个结果返回给客户端或者直接把生成好的验证码图形返回,客户端会将其呈现出来用户就能看到验证码的内容

用户看到验证码之后,会在表单里面输入验证码的内容,
点击提交按钮的时候,这些信息就会又发送给服务器,
服务器拿着提交的信息和 Session 里面保存的验证码信息后进行对比。

如果一致,代表验证码输入正确,校验成功,然后继续放行恢复正常状态
如果不一致,代表校验失败,会继续进行校验

在这里插入图片描述

3.常见验证码

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.优缺点

优点:
· 效率高:打码平台可以非常快速地处理大量验证码,通常在几秒钟> 内返回结果,极大地提高了自动化脚本的效率。
· 支持广泛:支持各种复杂的验证码类型,包括文本验证码、图像选择验证码、滑块验证码等。
· 自动化集成:打码平台通常提供 API,可以很容易地集成到自动化工具或脚本中。

缺点:
· 成本问题:打码平台通常是付费服务,识别验证码的成本可能会随着任务量的增加而增加。
· 法律和道德风险:使用打码平台来绕过验证码,特别是用于不正当的爬虫、数据采集或滥用服务的行为,可能会违反网站的使用条款,并引发法律或道德问题。
· 识别错误:虽然打码平台通常能够高效识别验证码,但也可能出现识别错误,尤其是在验证码设计得非常复杂或难以辨识的情况下。

二、深度学习处理验证码

1.滑块验证码

这种验证码交互形式比较友好,且安全性、美观度上也会更高。
如果想采用自动化的方法来绕过这种滑动验证码,关键在于:

· 找出目标缺口的位置
· 模拟人的滑动轨迹将滑块滑动到缺口处

2.目标检测

做目标检测的算法主要分为两个方向:
一阶段式两阶段式,英文分别叫做One stage和Two stage

Two Stage:算法首先生成一系列目标所在位置的候选框,再对这些框选出来的结果进行样本分类,这种算法有 R-CNN、Fast R-CNN、Faster R-CNN 等,这些算法架构相对复杂,但准确率上有优势

One Stage:不需要产生候选框,直接将目标定位和分类的问题转化为回归问题这种算法有 YOLO、SSD,这些算法准确率上不及 Two stage,但架构相对简单,检测速度更快

3.数据准备

样本数据需要带有缺口的验证码图片以及我们自己标注的缺口位置
标注的工具可以使用LabelImg,标注完会生成一系列xml文件,需要解析 xml文件,把位置的坐标和类别等转成训练模型需要的数据
初始化这个项目直接基于开源的PyTorch-YOLOV3项目来进行修改模型使用的深度学习框架为PyTorch,推荐使用GPU训练
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
总结:介绍了使用深度学习识别滑动验证码缺口的方法,包括标注、训练、测试等环节都进行了阐述

三、解析模拟登录基本原理

1.网站登录验证的实现

用户在网页表单里面输入内容,点击登录的瞬间
浏览器客户端就会向服务器发送一个登录请求
这时服务器需要处理这些信息,返回给客户端一个类似凭证的东西
客户端拿着这个“凭证”再去访问某些需要登录才能查看的页面
服务器自然就能放行
然后返回对应的内容或执行对应的操作

2.Session和Cookie

目前比较流行的实现方式有两种

  1. 基于Session + Cookie的验证
  2. 基于JWT(JSON Web Token)的验证

Session保存在服务端
Cookies保存在用户本地浏览器

比如 Cookies 里面可能只存了 Session ID 相关信息,服务器能根据 Cookies 找到对应的 Session用户登录之后,服务器会在对应的 Session 里面标记一个字段代表已登录状态或者其他信息(如角色、登录时间)等等用户每次访问网站的时候都带着 Cookies 来访问,服务器就能找到对应的 Session然后看一下 Session 里面的状态是登录状态,就可以返回对应的结果或执行某些操作

当然 Cookies 里面也可能直接存了某些凭证信息比如说用户在发起登录请求之后
服务器校验通过,返回给客户端的 Response Headers 里面可能带有 Set-Cookie 字段里面可能就包含了类似凭证的信息,这样客户端会执行 SetCookie的操作将这些信息保存到 Cookies 里面,以后再访问网页时携带这些Cookies 信息服务器拿着这里面的信息校验,自然也能实现登录状态检测了

3.JWT

JWT是为了在网络应用环境间传递声明而执行的一种基于JSON 的开放标准,实际上就是每次登录的时候通过一个 Token 字符串来校验登录状态

JWT 声明:一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息以便于从资源服务器获取资源,也可以增加一些额外的其他业务逻辑所必须的声明信息所以这个 Token 也可直接被用于认证,也可传递一些额外信息

Header:声明了 JWT 的签名算法,如 RSA、SHA256 等等
也可能包含 JWT 编号或类型等数据,然后整个信息 Base64编码即可

Payload:通常用来存放一些业务需要但不敏感的信息,如UserlD等另外它也有很多默认的字段,如 JWT签发者、JWT接受者、JWT 过期时间等等,Base64编码即可

Signature:就是一个签名,是把 Header、Payload 的信息用秘钥 secret 加密后形成的这个 secret 是保存在服务器端的,不能被轻易泄露

4.模拟登录

基于 SessionCookies 的模拟登录
如果要用爬虫实现的话,最主要的就是把 Cookies的信息维护好因为爬虫就相当于客户端浏览器,模拟好浏览器做的事情就好

1.如果已经在浏览器里面登录了自己的账号,要想用爬虫模拟的话可以直接把 Cookies 复制过来交给爬虫就行了,是最省事省力的方式如果不想有任何手工操作,可以直接使用爬虫来模拟登录过程
2.登录的过程其实多数也是一个 POST请求,用爬虫提交用户名密码等信息给服务器服务器返回的 Response Headers 里面可能带了 Set-Cookie 的字段只需要把这些 Cookies 保存下来就行了最主要的就是把这个过程中的 Cookies 维护好就行
3.也可以用一些简单的方式来实现模拟登录即把人在浏览器中手工登录的过程自动化实现比如用 Selenium 或 Pyppeteer 来驱动浏览器模拟执行一些操作如填写用户名、密码和表单提交等操作,等待登录成功之后通过 Selenium 或 Pyppeteer 获取当前浏览器的 Cookies 保存起来即可然后后续的请求可以携带 Cookies 的内容请求,同样也能实现模拟登录

基于 JWT 的真实情况也比较清晰

由于 JWT 的这个字符串就是用户访问的凭证,模拟登录只需要做到下面几步即可:模拟网站登录操作的请求,比如携带用户名和密码信息请求登录接口,获取服务器返回结果这个结果中通常包含 JWT 字符串的信息,保存下来即可
后续的请求携带 JWT 访问即可,一般情况在 JWT不过期的情况下都能正常访问和执行对应的操作携带方式多种多样,因网站而异
如果 JWT过期了,可能需要重复步骤一,重新获取 JWT3.

5.优化方案

如果爬虫要求爬取的数据量比较大或爬取速度比较快而网站又有单账号并发限制或者访问状态检测并反爬的话,可能账号就会无法访问或者面临封号,这时可以使用分流的方案来解决

四、JavaScript混淆技术

1.爬取网站的加密情形

分析某个网站的 Aiax 接口的时候,可以看到接口的一些参数也是加密的或者 Request Headers 里面也可能带有一些加密参数如果不知道这些参数的具体构造逻辑就无法直接用程序来模拟这些 Ajax 请求

翻看网站的 JavaScript 源代码,可以发现很多压缩了或者看不太懂的字符比如 JavaScript 文件名被编码JavaScript 的文件内容被压缩成几行JavaScript 变量也被修改成单个字符或者一些十六进制的字符导致我们不好轻易根据 JavaScript 找出某些接口的加密逻辑
在这里插入图片描述

2.数据保护

接口加密技术

对某些数据接口进行加密
比如说对某些 URL的一些参数加上校验码或者把一些 ID 信息进行编码使其变得难以阅读或构造
对某些接口请求加上一些 token、sign 等签名
这些请求发送到服务器时
服务器会通过客户端发来的一些请求信
息以及双方约定好的秘钥等来对当前的请求进行校验如果校验
如果校验通过,才返回对应数据结果

单纯依靠接口加密技术并不能很好地解决问题

JavaScript 代码运行于客户端
也就是它必须要在用户浏览器端加载并运行

JavaScript 代码是公开透明
也就是说浏览器可以直接获取到正在运行的JavaScript 的源码

JavaScript 压缩、混淆和加密技术

代码压缩:即去除 JavaScript 代码中的不必要的空格、换行等内容使源码都压缩为几行内容,降低代码可读性同时也能提高网站的加载速度。

代码加密:可以通过某种手段将 JavaScript 代码进行加密转成人无法阅读或者解析的代码如将代码完全抽象化加密,如 eval加密另外还有更强大的加密技术,可以直接将 JavaScript代码用 C/C++实现JavaScript 调用其编译后形成的文件来执行相应的功能如Emscripten 还有WebAssembly

3.接口加密技术

数据一般都是通过服务器提供的接口来获取的
网站或 App 可以请求某个数据接口获取到对应的数据
然后再把获取的数据展示出来
有些数据是比较宝贵或私密的
这些数据肯定是需要一定层面上的保护
所以不同接口的实现也就对应着不同的安全防护级别

完全开放的接口
没有设置任何防护
而且没有任何时空限制和频率限制
任何人只要知道了接口的调用方式就能无限制地调用
安全性非常非常低
如果接口里面包含一些重要的数据或隐私数据
就能轻易被篡改或窃取了

接口参数加密
为了提升接口的安全性,客户端会和服务端约定一种接口校验方式一般来说会使用到各种加密和编码算法如 Base64、Hex编码,MD5、AES、DES、RSA等加密
实现接口参数加密就需要用到一些加密算法客户端和服务器肯定也都有对应的 SDK实现这些加密算法如 JavaScript的crypto-js,Python的 hashlib、Crypto 等等

客户端和服务器双方约定一个 sign 用作接口的签名校验生成逻辑是客户端将 URLPath 进行 MD5 加密然后拼接上 URL的某个参数再进行 Base64 编码最后得到一个字符串 sign
这个 sign 会通过 Request URL的某个参数或 Request Headers 发送给服务器服务器接收到请求后,对 URLPath 同样进行 MD5 加密然后拼接上 URL 的某个参数
也进行 Base64 编码得到了一个 sign然后比对生成的 sign 和客户端发来的 sign 是否是一致的如果是一致的,那就返回正确的结果,否则拒绝响应

4.JavaScript压缩

JavaScript 压缩即去除 JavaScript 代码中的不必要的空格、换行等内容,或者把一些可能公用的代码进行处理实现共享,最后输出的结果都被压缩为几行内容代码可读性变得很差,同时也能提高网站加载速度

目前主流的前端开发技术大多都会利用 Webpack进行打包,Webpack 会对源代码进行编译和压缩,输出几个打包好的 JavaScript 文件。其中我们可以看到输出的 JavaScript 文件名带有一些不规则字符串,同时文件内容可能只有几行内容,变量名都是一些简单字母表示

其中就包含 JavaScript 压缩技术,比如一些公共的库输出成 bundle 文件,一些调用逻辑压缩和转义成几行代码,这些都属于 JavaScript 压缩。另外其中也包含了一些很基础的 JavaScript 混淆技术,比如把变量名、方法名替换成一些简单字符,降低代码可读性。

JavaScript 混淆完全是在 JavaScript 上面进行的处理,它的目的就是使得 JavaScript 变得难以阅读和分析,大大降低代码可读性,是一种很实用的 JavaScript 保护方案。

变量混淆
将带有含意的变量名、方法名、常量名随机变为无意义的类乱码字符串降低代码可读性,如转成单个字符或十六进制字符串
字符串混淆
将字符串阵列化集中放置、并可进行 MD5 或 Base64 加密存储使代码中不出现明文字符串这样可以避免使用全局搜索字符串的方式定位到入口点

属性加密
针对 JavaScript 对象的属性进行加密转化,隐藏代码之间的调用关系
控制流平坦化
打乱函数原有代码执行流程及函数调用关系,使代码逻变得混乱无序
僵尸代码
随机在代码中插入无用的僵尸代码、僵尸函数,进一步使代码混乱
调试保护
基于调试器特性,对当前运行环境进行检验加入一些强制调试 debugger 语句使其在调试模式下难以顺利执行 JavaScript 代码

多态变异
使 JavaScript 代码每次被调用时将代码自身即立刻自动发生变异,变化为与之前完全不同的代码即功能完全不变,只是代码形式变异,以此杜绝代码被动态分析调试
锁定域名
使 JavaScript 代码只能在指定域名下执行

现在 JavaScript 混淆主流的实现是javascript-obfuscator 这个库
利用它我们可以非常方便地实现页面的混淆
它与Webpack结合起来最终可以输出压缩和混淆后的 JavaScript 代码,使得可读性大大降低,难以逆向

五、APP爬取

随着移动互联网的发展,越来越多的企业直接开发了App
更多更全的信息都是通过 App 来展示的

Web 站点有多种渲染和反爬方式,渲染分为服务端染和客户端渲染
反爬也是多种多样
如请求头验证、WebDriver 限制、验证码、字体反爬、封禁IP、账号验证等等

1.App请求

App 的数据通信大都需要依赖独立的服务器,比如请求某个 HTTP 接口来获取数据或做登录校验等。
这种通信其实就类似 Web 中的 Ajax,客户端向服务器发起 HTTP 请求
获取到数据之后再做一些处理,数据的格式大多也是JSON、XML等
对于 App,其核心就在于找到这些数据请求到底是怎样的,比如某次 HTTP POST 请求的 URL、Headers、Data 等等

怎么知道 App 到底在运行过程中发起了什么请求呢
最有效且常见的方式就是抓包
抓包工具非常多,比如 Fiddler、Charles、mitmproxy、anyproxy等等使用这些工具抓到 HTTP 请求包,就能看到这个请求的 Method、Headers、Data 等内容

一些 App 也添加了各种反爬措施:
这个 App 的请求根本抓不到包,原因可能是 App 本身设置了不走系统代理
对一些 HTTPS 的请求,抓包失败,原因可能是系统或 App 本身设置了 SSLPining中对 HTTPS 证书进行了校验,代理软件证书校验不通过,拒绝连接
某些包即使抓到了,也发现了其中带了加密参数,比如sign、token等等,难以直接用程序模拟
为了破解一些加密参数可能需要对 App 进行逆向,逆向后发现是混淆后的代码,难以分析逻辑
一些 App为了防止逆向,本身进行了加固,需要对App进行脱壳处理才能进行后续操作
一些 App 将核心代码进行编译,形成so 库,因此可能需要对 so 库进行逆向才能了解其逻辑
一些 App 和其服务器对以上所有的流程进行了风控处理
如果发现有疑似逆向或破解或访问频率等问题,返回一些假数据或拒绝服务,导致爬虫难以进行

2.抓包

常见的抓包的工具,如Charles、Fiddler、mitmproxy等
抓包的时候在 PC端运行抓包软件,抓包软件会开启一个 HTTP代理服务器
然后手机和 PC 连在同一个局域网内,设置好抓包软件代理的IP和端口
另外 PC和手机都安装抓包软件的证书并设置信任
抓包完成之后在抓包软件中定位到具体数据包,查看其详情了解其请求 Method、URL、Headers、Data

抓不到包
一些 App 在内部实现的时候对代理加了一些校验如绕过系统代理直接连接或者检测到了使用了代理,直接拒绝连接这种情形是手机的 HTTP 客户端对系统的网络环境做了一些判断并修改了一些 HTTP 请求方式,使得数据不走代理

3.解决方法

  1. 可以将 TCP 数据包重定向到代理服务器
    比如软件 ProxyDroid 就可以实现这样的操作
  2. 通过 VPN 的方式将网络包转发给手机本地的代理服务器
    代理服务器将数据发送给服务端,获取数据之后再返回即可
    一些工具包括HttpCanary、Packet Capture、NetKeeper 等
  3. 可以考虑使用 Wireshark、Tcpdump 在更底层的协议上抓包
    比如抓取 TCP、UDP 数据包等等
    使用的时候建议直接 PC上开热点,然后直接抓取PC无线网卡的数据包
    这样 App 不管有没有做系统代理校验或者使用了非 HTTP 协议,都能抓到数据包
  4. SSL Pining,是证书绑定,只针对 HTTPS 请求
    SSL Pining 发生在下面的一些情况:
    对于 Android 7.0以上的手机,HTTPS 请求只信任系统级别证书,这会导致系统安全性增加但是由于抓包软件的证书不是系统级别证书,就不受信任了,就没法抓包了
    一些 App 里面专门写了逻辑对 SSL Pining 做了处理对 HTTPS 证书做了校验,如果发现是不在信任范围之内的,那就拒绝连接
    对于这些操作,通常的思路来解决:
    让系统信任我们的 HTTPS 证书
    绕开 HTTPS 证书的校验过程

1.如果是 App 的开发者或者把 apk 逆向出来了可以直接通过修改 AndroidManifest.xml文件,在apk 里面添加证书的信任规则
2.只需要将抓包软件的证书设置为系统区域但前提是手机必须要 ROOT,而且需要计算证书 HashCode 并对证书进行重命名

4.数据包含有加密参数

比如一个 HTTP 请求,其参数还带有 token、sign 等参数,即使抓到包了,也没法直接模拟

JEB 是一款适用于 Android 应用程序和本机机器代码的反汇编器和反编译器软件利用它可以直接将安卓的 apk反编译得到 Smali 代码、jar 文件,获取到 Java 代码

JADX 是一款安卓反编译软件,可以将apk反编译得到jar文件,得到 Java 代码

dex2jar、jd-gui这两者通常会配合使用来进行反编译,同样也可以实现 apk文件的反编译

脱壳一些 apk 可能进行了加固处理,所以在反编译之前需要进行脱壳处理如果有壳的话可以借助于 Dumpdex、FRIDA-DEXDump等工具进行脱壳

反汇编一些 apk 里面的加密可能直接写入so 格式的动态链接库里面要想破解其中的逻辑,就需要用到反汇编的一些知识,这里可以借助于IDA这个软件来进行分析

有的时候 App 还增加了风控检测,一旦 App 检测到运行环境或访问频率等信息出现异常那么 App 或服务器就可能产生防护,直接停止执行或者服务器返回假数据等都是有可能的对于这种情形,就需要真实模拟一些 App 的手工操作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嗪磕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值