当前位置: 首页 > 科技观察

拒绝反爬虫!教你获取爬虫验证码

时间:2023-03-22 12:44:38 科技观察

本文转载自微信公众号《书仓宝库》,作者赵国胜、王健。转载本文请联系数据仓库宝贝图书馆公众号。目前很多网站都采取各种措施来防止爬虫,其中之一就是使用验证码。随着科技的发展,验证码的花样越来越多。验证码最初是由几个数字组成的简单图形验证码,后来加入了英文字母和迷惑曲线。有些网站可能还会看到汉字的验证码,这会增加识别的难度。使用验证码可以防止应用程序或网站被恶意注册和攻击。对于网站和APP来说,大量的无效注册、重复注册,甚至恶意攻击都是非常麻烦的。使用验证码可以大大减少这些恶意操作。验证码变得越来越复杂,爬虫的工作也越来越难。有时我们必须通过验证码的验证才能访问页面(如图1所示)。图1验证码界面目前主流的四种验证码分别是输入验证码、滑动验证码、宫格验证码和点击图形验证。下面分别解释一下他们的解决方案。4种验证码的解决方案01输入验证码该类验证码主要是用户输入图片中的字母、数字、汉字等进行验证,如图2所示。图2输入型验证码解决方案:这是最简单的验证码,只要你识别里面的内容,然后在输入框里填入即可。这种识别技术叫做OCR,这里推荐使用Python的第三方库tesserocr。tesserocr和pytesseract是Python的OCR识别库,其实是对Tesseract的一层PythonAPI封装。pytesseract是Google的Tesseract-OCR引擎包装器;所以他们的核心是Tesseract。对于没有后台影响的验证码,可以直接通过这个库来识别。但是对于背景嘈杂的验证码,直接识别的识别率会很低。遇到这样的验证码,需要先对图像进行灰度化,然后二值化,再进行识别,这样识别率会大大提高。提升。02滑动验证码这个是把可选的片段直线滑动到正确的位置,如图3图3滑动验证码的解决方法:对于这种验证码,稍微复杂一点,但是有相应的解决方案。我们直接想到的就是模拟人拖动验证码的行为,点击按钮,然后看到空隙的位置,最后将拼图拖到空隙处完成验证。第1步:单击按钮。图中的刘海和拼图在不点击按钮时不会出现,只有在点击按钮后才会出现,这为我们提供了刘海在哪里找的灵感。第2步:拖动到槽口。我们知道拼图要拖到空隙处,但是这个距离怎么用数值表示呢?通过第一步观察到的现象,我们可以找到缺口的位置。这里我们可以比较两张图片的像素点,设置一个参考值。如果某个位置的差异超过了参考值,那么我们就找到了两张图片不同的位置。当然,我们从拼图的右边开始。从侧面开始,从左到右,找到第一个不同的位置时结束。这个时候位置应该是gap的左边,所以我们可以用selenium拖到这个位置。这里还有个问题,这两张图片怎么自动保存呢?我们可以先找到这个标签,然后得到它的位置和大小,然后top=int(location['y']),bottom=int(location['y']+size['height']),left=int(location['x'])andright=int(location['x']+size['width']),然后截图,最后cut填入图片中这四个位置即可。具体使用可以查看selenium文档,点击按钮前切图,点击后切图。最后,拖动的时候需要模拟人的行为,先加速再减速。因为这种验证码有行为特征检测,人是不可能做到匀速的,否则会判断是机器拖,所以不会通过验证。03工格验证码如图4所示,验证码对于爬虫来说难度比较大,而且每次出现都不一样,即使出现一样,拖拽顺序也不一样。但是,我们发现不同验证码的数量是有限的。这里我们使用模板匹配的方式,将所有出现的验证码都保存下来,然后挑出不同的验证码,按照拖拽的顺序命名。让我们将它们从左到右,从上到下设置为1、2、3、4。上图中的滑动顺序是4→3→2→1,所以我们命名为4_3_2_1.png。当验证码出现时,用我们保存的图片一张一张枚举,与出现的像素点进行比较。方法参见“滑动验证码”部分。如果匹配,则拖动顺序为4→3→2→1。然后用selenium模拟一下。图4工格验证码04基于点击的图文验证及图标选择1)图文验证:提醒用户点击图片中相同文字的位置进行验证。2)图标选择:给定一组图片,根据需要点击其中一张或多张。借用识别一切的困难来阻止机器。这两个原理类似,只是一个是给文字,点击图片中的文字,一个是给图片,点击一张内容相同的图片。这两种方法都没有特别好的方法,只能借助第三方的识别接口来识别相同的内容。推荐一个方法,发送验证码,会返回对应的点击坐标,然后用selenium模拟点击。OCR验证码图片OCR(OpticalCharacterRecognition,光学字符识别)是指电子设备??(如扫描仪或数码相机)检查打印在纸上的字符,通过检测明暗图案确定其形状,然后利用字符识别method将图形翻译成计算机文本的过程,下面介绍利用这种图像识别技术输入验证码的方法。验证码识别的基本步骤:1)预处理2)灰度化3)二值化4)去噪5)分割6)识别使用pytesseract之前,必须安装Tesseract-OCR,因为pytesserat依赖于Tesseract-OCR,如果if不能使用未安装。首先使用pytesseract将彩色图像转换为灰度图像。#使用路径导入图片im=Image.open(imgimgName)#使用字节流导入图片#im=Image.open(io.BytesIO(b))#转换为灰度图imgry=im.convert('L')#保存图片imgry.save('gray-'+imgName)得到的灰度图如图5所示图5.灰度图对得到的图像进行二值化处理,将图像处理成黑白图像,有利于到后续的图像处理和识别。#二值化,采用阈值分割的方法,阈值为分割点Threshold=140Table=[]Forjinrange(256):Ifj=90%~95%)。2)从每个分组的字符中获得一张最佳图像。所以,到目前为止我们已经生成了一个像素图像库。我们将其转换为像素矩阵,并将位图字形转换为数字点阵JSON文件。9识别算法最后是获取任何新验证码图像的算法:使用相同的算法来最小化新图像中不必要的噪声因素。对于新验证码图片中的每个字符,强制与生成的JSON文件的像素矩阵进行匹配,根据对应的黑色像素匹配计算相似度。如果一个像素点是黑色的,它在图像中的位置正好是待破解的验证码,并且这个像素点在字形库中的骨架图像/位图中的相同位置,计数加1。骨架图像中的黑色像素,计算匹配率,选择匹配率最高的字符作为识别结果的字符。最终结果如图16所示,若获取到的字符为Z5M3MQ,则验证码识别成功。图16识别结果