百度安全验证深度学习解决方案

在通过百度关键词搜索进行爬虫的过程中,会遇到进入百度安全验证页面的情况。随着访问次数的的增加,进入安全验证页面的概率也随之增大,且这种情况并不能通过请求头加入 Accept 和引入随机 UA 来解决(代理是否能解决这一问题未得到充分验证,以我的尝试来看并不能有效解决)。

在尝试过上述的几种方法来反“反爬”的过程中,发现一旦可以通过安全验证,在后续的爬虫过程中,可观察时间内并不会再次进入安全验证页面。既然“堵”不适合我解决这一问题,就只有利用“疏”的思路制定解决方案。

百度安全验证页面采用拖动滑块使页面中的图片角度为正确方向来判断是否为“自动程序”在控制浏览器。相较于一般的字符识别等验证方案具有一定的难度,直观表现在没有(或者几乎没有)现有的 API 供应商在提供这样的服务。

网络上现有的、基于图像处理或计算机视觉的解决方案主要分为传统方法和深度学习方法。传统方法通过对图像进行处理、建模来建立正确方向图像和不同角度图像的映射,再通过对图像进行哈希处理判定与页面上的图像最相似的图像,从而在映射关系中获得旋转角度。这种方法形成的“关系模型”会随着图库数量的增大而不断增大,且哈希编码来查找相似图像的方法鲁棒性较差。现有的基于深度学习的方法利用在 Google Street View dataset 训练的 RotNet 来预测图片旋转角度,经试验在类街景的测试图片上识别成功率较高。但由于缺乏百度安全验证页面中采用的人像、风景等多类样本,难以运用到实际使用中。除此以外,还有其他因素导致了利用该模型难以通过安全验证。

综上,在参考现有文章的基础上,总结出以下基于深度学习的方法:

目标:

识别图片角度,推算出对应滑动距离,模拟滑动。

实现:

  1. 获得原始图片数据集:循环访问百度搜索页面从而进入百度安全验证页面,抓取图片1500张,获得大量重复图片。对这些图片进行筛选,获得不重复图片144张(在前期实验的过程中发现安全验证页面易出现重复图片,推测用于验证的图片数据集规模较);
在这里插入图片描述
  1. 制作数据集:生成各个角度的图片,每个不同的图片均有360张不同角度的照片,标记正向图,根据现有图片名称序列计算不同角度照片相对于正向图片的相对角度,重新命名从而建立数据集;
在这里插入图片描述
在这里插入图片描述
  1. 生成规则:根据滑动距离与图片旋转角度的关系形成滑动规则(按照滑动距离 $o=angle \times 360 \times b$ 的规则来预测角度是不准确的,所以通过在安全验证页面逐单位距离滑动记录角度与滑动距离的关系);
  2. 模型训练:利用神经网络(考虑模型、数据集的大小以及模型的感受野)在数据集上进行训练,直接预测需要滑动的距离。由于百度安全验证的角度并不是整数变化的,滑动距离与角度的变化也不是一一对应的,因此相对于预测角度而言,直接预测滑动距离更加准确、便捷。且滑动距离的类别相比较于而言要少(也可以考虑做成回归任务),从而使得模型的参数也更少。此外,因为模型的目的是能足够准确地预测滑动距离,从而使得自动化程序模拟验证,因此,应该使得模型尽可能多地在现有数据集上学习。综上,考虑到真实场景的验证图片与获得的图片存在一定的差异(即使是相同的图片,也会受到不同程度的噪声干扰,如水印等),不再对数据集进行训练集与测试集的划分。

性能:

推理快、预测准(普遍最多在三次验证中可通过,根据实际操作和 b 站视频来看,人为通过安全验证的难度也相对较大)

操作

python 开发可以参考 https://github.com/ShortCJL/RotateCode
java 开发可先将训练获得的模型进行转化

import torch
import torchvision
import torch.nn as nn

model = # instance of your model
model.load_state_dict(torch.load("your model.pth")["model_state_dict"])

# Switch the model to eval model
model.eval()

# An example input you would normally provide to your model's forward() method.
example = torch.rand(1, 3, 128, 128)

# Use torch.jit.trace to generate a torch.jit.ScriptModule via tracing.
traced_script_module = torch.jit.trace(model, example)

# Save the TorchScript model
traced_script_module.save("your model.pt")

之后,便可通过 DJL 加载模型并作出预测,并借助其他工具来操作浏览器实现验证(为不限制大家思路,在此不放出我的实现代码)。

代码

欢迎大家 star https://github.com/Tang1705/Baidu-Rot-Validate

About the author

Tang

Principal investigator of the National Training Program of Innovation and Entrepreneurship for Undergraduates.
Recipient of the Excellent Undergraduate Graduation Design (Thesis) of Beijing Ordinary Colleges and Universities.

Add Comment

By Tang

Tang

Principal investigator of the National Training Program of Innovation and Entrepreneurship for Undergraduates.
Recipient of the Excellent Undergraduate Graduation Design (Thesis) of Beijing Ordinary Colleges and Universities.

Get in touch

Quickly communicate covalent niche markets for maintainable sources. Collaboratively harness resource sucking experiences whereas cost effective meta-services.