目前许多网站采用验证码来进行反爬虫!且花式越来越多!验证码最初是由几个数字的简单的图形验证码,后来加入英文字母和混淆曲线,设置还有中文字符的验证码,使得识别越来越难!
目前交互式验证码越来越多,如:极验滑动验证码需要滑动拼合滑块才可以完成验证,点触验证码需要完全点击正确结果才可以完成验证,另外还有滑动宫格验证码、计算题验证码等。
本帖涉及的地验证码:普通验证码、极验滑动验证码、点触验证码、微博宫格验证码。这些验证码识别的方式和思路各有不同,了解这些之后,就差不多啦~~~
一、图形验证码的识别
图形验证码一般是由4位字母或者数字组成。比如:中国知网的注册如下图,网址:http://my.cnki.net/elibregister/commonRegister.aspx
措施:利用OCR技术识别图形验证码,需要安装tesserocr库。
#例子:现在保存一张验证码图片,命名为code.jpg,使用tesserocr库识别该验证码。
验证码图片为:
import tesserocr from PIL import Image image=Image.open('code.jpg') res=tesserocr.image_to_text(image) #重要! print(res) #结果显示: .1960
发现识别结果和实际情况有偏差,这是因为验证码内的多余线条干扰了图片的识别。需要对验证码图片进行额外的处理,如:灰度化、二值化等。
利用Image对象的convert()方法参数传入L,可将图片转化为灰度图像;参数传入1,可将图片进行二值化处理。
image=image.convert('L') #灰度化 image=image.convert('1') #二值化
还可以指定二值化的阈值。上面的方法(传入参数1)采用的是默认的阈值127。但是不能直接二值化原图,要先进行灰度化。
image=image.convert('L') #灰度化 threshold=127 #阈值 table=[] for i in range(256): if i<threshold: table.append(0) else: table.append(1) image=image.point(table,'1') #二值化 【自己设置阈值】 此时等价于 image.convert('1') image.show() #
此时原来验证码图片中的线条已经去除,整个验证码图片变得黑白分明。这是再利用tesserocr识别即可。
import tesserocr from PIL import Image image=Image.open('code.jpg') image=image.convert('L') #灰度化 threshold=100 #设置阈值 table=[] for i in range(256): if i<threshold: table.append(0) else: table.append(1) image=image.point(table,'1') #二值化 res=tesserocr.image_to_text(image) print(res) # J96C
图片验证码的识别成功!
总结:利用tesserocr识别验证码!若是验证码图片较为简单,就可以直接识别,但是若是较为复杂(有线条的干扰),需要对验证码图片进行预处理(灰度化、二值化)来提高识别的准确度。
二、极验滑动验证码的识别--->以极验证官方后台登录为例!
【极验验证码的这块知识:参考的是崔庆才作者的《Python3-网络爬虫开发实战》】
注:实际上现在很多的网站的极验验证码都是查找不到原始的验证码(不带缺口的图片)!但是我们要掌握这种方法的思路。
其需要拖动拼合滑块才可以验证,难!!!如图:
目标:用程序来识别并通过极验验证码的验证,包括:分析识别思路、识别缺口位置、生成滑动拖动路径、模拟实现滑块拼合通过验证等步骤。
工具:使用Selenium中的Chrome动态爬取。
识别思路:首先找到一个带有极验验证的网站,如:极验官方后台,链接:https://auth.geetest.com/login/。其是先点击,再进行极验校正
,验证成功之后会出现:
。
操作步骤:(1)模拟点击验证按钮 (2)识别滑动缺口的位置 (3)模拟拖动滑块
分析步骤:
第(1)步操作最简单,我们可以直接用Selenium模拟点击按钮。
第(2)步操作识别缺口的位置比较关键,这里需要用到图像的相关处理方法。首先观察缺口的样子(见上图),缺口的四周边缘有明显的断裂边缘,边缘和边缘周围有明显的区别。我们可以实现一个边缘检测算法来找出缺口的位置。
对于极验验证码来说,我们可以利用和原图对比检测的方式来识别缺口的位置,因为在没有滑动滑块之前, 缺口并没有呈现。
获取两张图片。设定一个对比阔值,然后遍历两张图片,找出相同位置像素RGB差距超过此阔值的像素点,那么此像素点的位置就是缺口的位置。
第(3)步操作看似简单,但其中的坑比较多。极验验证码增加了机器轨迹识别,匀速移动、随机速度移动等方法都不能通过验证,只有完全模拟人的移动轨迹才可以通过验证。人的移动轨迹一般是先加速后减速,需要模拟这个过程才能成功。
1、初始化
极验的管理后台登录页面:https://account.geetest.com/login。初始化一些配置,如Selenium 对象的初始化及一些参数的配置,如下:
EMAIL = 'pansy_nuist@163.com' PASSWORD = '******************' #自己的密码 class CrackGeetest(): def __init__(self): self.url = 'https://account.geetest.com/login' self.browser = webdriver.Chrome() self.wait = WebDriverWait(self.browser, 20) self.email = EMAIL self.password = PASSWORD
2、模拟点击
实现第1步的操作, 也就是模拟点击初始的验证按钮。利用显式等待的方法来实现,如下:
def get_geetest_button(self): """ 获取初始验证按钮 :return: """ button = self.wait.until(EC.element_to_be_clickable((By.CLASS_NAME, 'geetest_radar_tip'))) return button
获取一个Web Element对象,调用它的click()方法即可模拟点击,代码如下所示:
button=