• 有些网站为了避免被过度访问,会设置验证码反爬机制,如果访问次数过多就要求用户输入验证码,甚至一开始访问就要求输入验证码。验证码的类型很多,本章会讲解其中常见的图像验证码、计算题验证码、滑块验证码、滑块拼图验证码、点选验证码。
  • 设置了验证码反爬机制的网站通常不希望被爬虫过度爬取,有的网站还会经常更换验证码类型,因此,本章主要使用专门搭建的本地网页(HTML文件)来讲解如何应对验证码反爬。

注意:本章介绍的方法仅针对单纯的验证码反爬。有些网站除了验证码反爬,还会采用其他反爬手段(如针对Selenium和webdriver拦截),此时本章介绍的方法就会失效。

  • 图像验证码是最常见的验证码类型,主要分为英文验证码和中文验证码。英文验证码的内容结合了英文字母和数字(见左下图),中文验证码的内容以简体汉字为主(见右下图)。
  • 因为超级鹰的识别效果最好,且实战中应用最为有效,所以这里主要讲解使用的超级鹰识别验证码的方法。百度的文字识别接口则在2.1.3节的“补充知识点”中进行简单介绍。至于PyTesseract库,虽然免费,但是安装较为繁琐,而且识别效果很一般,所以本书不予讲解。

2.1.1 超级鹰平台注册

  • 超级鹰的官方网站为http://www.chaojiying.com/,可以在页面右上角进行注册。注册并登录后进入用户中心,按照页面右下角的提示扫码二维码绑定微信,可领域超级鹰送给用户的1000题分(题分就是积分),如下图所示。
  • 随后便可用赠送的题分在免费测试页面(https://www.chaojiying.com/demo.html)进行测试。如下图所示。读者可自行搜索一些图像验证码或者利用本书提供的HTML文件进行测试。

2.1.2 超级鹰Python接口的使用

  • 打开超级鹰的Python开发文档页面(https://www.chaojiying.com/api-14.html),单击链接下载官方提供的实例代码,如下图所示。该代码是基于Python 2 编写的,而我们现在使用的通常是Python 3,因此,需要根据页面中的说明修改代码。例如,Python 2 的print()函数没有括号,所以要在Print后加括号,此外还需要把一些不规范的缩进文件改为规范的【Tab】键缩进。不愿意自己修改代码的读者可以直接从本书的配套文件中下载本书作者修改好的代码。
  • 下载得到一个压缩包,解压后如下图所示。
  • 修改后的代码如下,读者简单浏览即可,不需要理解其含义,代码的使用方法并不难,后续会讲解。
import requests
from hashlib import md5class Chaojiying_Client(object):def __init__(self, username, password, soft_id):self.username = usernamepassword =  password.encode('utf8')self.password = md5(password).hexdigest()self.soft_id = soft_idself.base_params = {'user': self.username,'pass2': self.password,'softid': self.soft_id,}self.headers = {'Connection': 'Keep-Alive','User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)',}def PostPic(self, im, codetype):"""im: 图片字节codetype: 题目类型 参考 http://www.chaojiying.com/price.html"""params = {'codetype': codetype,}params.update(self.base_params)files = {'userfile': ('ccc.jpg', im)}r = requests.post('http://upload.chaojiying.net/Upload/Processing.php', data=params, files=files, headers=self.headers)return r.json()def ReportError(self, im_id):"""im_id:报错题目的图片ID"""params = {'id': im_id,}params.update(self.base_params)r = requests.post('http://upload.chaojiying.net/Upload/ReportError.php', data=params, headers=self.headers)return r.json()
  • 随后需要将修改好的“chaojiying.py”复制到用于识别图像验证码的代码文件所在的文件夹中,如右图所示。其中“a.png”是要用识别的图像验证码,“test.py”是用于识别图像验证码的代码文件。
  • “test.py”代码内容如下:
from chaojiying import Chaojiying_Clientdef cjy(): #使用超级鹰识别图像验证码的自定义函数chaojiying = Chaojiying_Client('超级鹰用户名', '超级鹰用户名的密码', '软件ID')  # 用户中心>>软件ID im = open('a.jpg', 'rb').read()  # 打开本地图片文件,有时WIN系统须要//code = chaojiying.PostPic(im,1902)return coderesult = cjy() #调用函数识别验证码,并将识别结果赋给变量result
print(result) #打印输出识别结果
  • 第1行代码从“chaojiying.py”文件中引用Chaojiying_Client类,这是从库中引用类的固定写法,之前也接触过,如from selenium import webdriver。
  • 第3行定义了一个cjy()函数,以方便后续调用。
  • 第4行代码需要传入超级鹰账号、密码和软件ID。账号和密码就是前面注册超级鹰时填写的账号和密码,软件ID则需要到超级鹰的用户中心去生成。如下图所示,在浏览器中打开超级鹰的用户中心,(1)单击左下方的“软件ID”链接,(2)在右侧单击“生成一个软件ID”链接,(3)然后选中并复制生成的软件ID,粘贴到代码中的响应位置即可。
  • 第5行用于打开本地的验证码图片文件,这里的“a.jpg”是一个相对路径(即代码文件所在的文件夹),可以根据实际需要更改成其他路径。

{'err_no': 0, 'err_str': 'OK', 'pic_id': '9176320570859320003', 'pic_str': '7261', 'md5': '98ec31bc733845e88d61bd3b49d52519'}
  • 不同的验证码类型需要使用不同的编号参数,具体见https://www.chaojiying.com/price.html,如下图所示。这里要识别的“a.png”是一个4位的英文验证码,查表可知1902、1004等都适用,这里使用官方推荐的1902,速度比1004快。此外,在选择时还需要注意仔细于都收费标准。

2.1.3 案例实战:英文验证码和中那位验证码识别

  • 前面用一个单独的图片文件讲解了如何使用超级鹰识别验证码,那么对于网页中的验证码又该如何操作呢?本级将使用作者自己搭建的本地网页作为处理对象,用超级鹰完成英文验证码和中文验证码的识别,实际网站的验证码识别案例可以参考1.3.1 节。

1.英文验证码识别

  • 首先要把“chaojiying.py”文件复制到编写的文件夹中。该文件中的“index.html”文件就是事先搭建好的本地网页,在浏览器中打开该文件,效果如下图所示。可以看到网页中有一个英文验证码图片、一个验证码输入框和一个“验证”按钮,地址栏中显示的则是这个本地网页的文件路径。
  • 接着来编写代码。识别网页中图像验证码的常规操作步骤如下:
    (1)用selenium库打开网页
    (2)用selenium库的screeshot()函数截取验证码图片;
    (3)用cjy()函数识别图像内容;
    (4)用Selenium库模拟输入验证码,再模拟单击“验证”按钮。
  • 根据上述步骤,先导入Selenium库并打开网页,代码如下:
from selenium import webdriver
browser = webdriver.Chrome()
url = r'D:\works\python_crawl1\《Python爬虫(进阶与进通)》代码汇总\2.验证码反爬\1.图像验证码识别\英文图像验证码\index.html'
browser.get(url) #用模拟浏览器打开网页
  • 需要注意的是,第3行代码中的网址必须是网页文件的绝对路径,虽然Python可以识别相对路径,但是浏览器只能识别绝对路径下的网页文件。
  • 然后用XPath表达式定位验证码,再用screenshot()函数保存为图片文件。用复制的XPath表达式编写出如下代码:
browser.find_element_by_xpath('//*[@id="verifyCanvas"]').screenshot('a.png') #a.png是自己命令的图片名称

注意:用screeshot()函数保存图片文件时使用的路径需与cjy()函数中打开图片文件时的使用的路径保持一致。如果在这里修改了文件路径,则要相应修改cjy()函数中的文件路径。

  • 接着定义cjy()函数,相关代码在2.1.2节已经讲过,具体如下:
from chaojiying import Chaojiying_Client
def cjy(): #使用超级鹰识别图像验证码的自定义函数chaojiying = Chaojiying_Client('超级鹰用户名', '超级鹰用户名的密码', '软件ID')  # 用户中心>>软件ID im = open('a.png', 'rb').read()  # 打开本地图片文件,有时WIN系统须要//code = chaojiying.PostPic(im,1902)['pic_str']return code
  • 有了cjy()函数后,通过如下代码即可获得识别结果:
result = cjy() #调用函数识别验证码,并将识别结果赋给变量result
  • 一旦获得识别结果,就可通过Selenium库模拟键盘和鼠标操作,输入验证码并单击“验证”按钮,完成验证,代码如下:
browser.find_element_by_xpath('//*[@id="code_input"]').send_keys(result) #模拟输入验证码
browser.find_element_by_xpath('//*[@id="my_button"]').click() #模拟单击"验证"按钮

  • 完整代码如下:
from selenium import webdriver
browser = webdriver.Chrome()from chaojiying import Chaojiying_Client
def cjy(): #使用超级鹰识别图像验证码的自定义函数chaojiying = Chaojiying_Client('超级鹰用户名', '超级鹰用户名的密码', '软件ID')  # 用户中心>>软件ID im = open('a.png', 'rb').read()  # 打开本地图片文件,有时WIN系统须要//code = chaojiying.PostPic(im,1902)['pic_str']return code#1.访问网址
url = r'D:\works\python_crawl1\《Python爬虫(进阶与进通)》代码汇总\2.验证码反爬\1.图像验证码识别\英文图像验证码\index.html'
browser.get(url) #用模拟浏览器打开网页#2. 截取验证码图片
browser.find_element_by_xpath('//*[@id="verifyCanvas"]').screenshot('a.png') #a.png是自己命令的图片名称#3.通过超级鹰识别
result = cjy() #调用函数识别验证码,并将识别结果赋给变量result
print(result) #打印输出识别结果# 4.输入验证码并完成验证
browser.find_element_by_xpath('//*[@id="code_input"]').send_keys(result) #模拟输入验证码
browser.find_element_by_xpath('//*[@id="my_button"]').click() #模拟单击"验证"按钮

技巧:每个读者保存的代码的位置可能都不一样,上述代码中绝对路径需要根据实际情况修改。因为这里是将网页文件和代码文件放在同一文件夹下,所以也可以在代码中自动获取文件所在文件的路径,再拼接网页文件的文件名,得到网页文件的绝对路径,这样就不用手动修改网页文件的绝对路径了。代码如下:

2.中文验证码识别

  • 中文验证码识别方法和英文验证码的识别方法基本一致,唯一需要修改的就是自定义函数cjy()的代码中PosPic()函数的第2个参数,将原先用于识别英文验证码的1902接口改成2004(详见https://www.chaojiying.com/price.html)。修改后的cjy()函数代码如下:
def cjy(): #使用超级鹰识别图像验证码的自定义函数chaojiying = Chaojiying_Client('超级鹰用户名', '超级鹰用户名的密码', '软件ID')  # 用户中心>>软件ID im = open('a.png', 'rb').read()  # 打开本地图片文件,有时WIN系统须要//code = chaojiying.PostPic(im,2004)['pic_str']return code
  • 总体来说,超级鹰可以识别大部分图像验证码。对于一些网页中使用的将网页文本转换成图片的反爬方式,也可以用超级鹰来识别图片,从而爬取文本。

补充知识点:基于百度接口的Python图像文字识别(OCR)

2.1 图像验证码(英文验证码、超级鹰)相关推荐

  1. python—简单数据抓取四(利用超级鹰的ocr识别图片验证码模拟登录超级鹰网站、利用百度云的ocr识别自如租房网价格图片获取到自如网的价格)

    学习目标: python学习二十四 -简单数据抓取四 学习内容: 1.利用超级鹰的ocr识别图片验证码模拟登录超级鹰网站 2.利用百度云的ocr识别自如租房网的价格图片,获取到自如网的价格数据 1.利 ...

  2. 爬虫进阶之路---处理点触验证码(使用超级鹰API接口处理;以解决12306的图片验证码为例;)

    三大图形验证码之点触验证码 打码平台 超级鹰的使用 12306自动登录 整体代码文件 12306_selenium.py 12306_selenium.py文件代码: chaojiying.py文件代 ...

  3. 针对“天眼查”选字验证调用超级鹰平台解决方案

    from selenium.webdriver import ActionChains # 动作链 from hashlib import md5 ### md5加密保护密码 import time ...

  4. 『python爬虫』26. selenium与超级鹰处理复杂验证码的处理(保姆级图文)

    目录 1. 图片选择类验证码 2. 滑块验证码 3. 滑块出错,不加载 总结 欢迎关注 『python爬虫』 专栏,持续更新中 欢迎关注 『python爬虫』 专栏,持续更新中 1. 图片选择类验证码 ...

  5. 超级鹰:selenium专门用来破解各种验证码

    目前,有相当一部分的验证码是: 英文数字 中文汉子 纯英文 纯数字 任意特殊字符 坐标选择识别 特别:对于极验3.0滑动验证码, 正在尝试看可以不用这个解决,毕竟有坐标 二.使用方法: 1. 先祖册超 ...

  6. python爬虫——利用超级鹰识别验证码并进行古诗网进行模拟登录

    目录 前言 一.超级鹰的注册 二.利用xpath解析登录页面的验证码图片 三.利用超级鹰识别获取验证码 四.模拟浏览器发送请求进行模拟登录 五.验证是否模拟登录成功 前言 本文章是利用python爬虫 ...

  7. 爬虫学习笔记(十八)—— 点触验证码:超级鹰、12306自动登录

    一.打码平台 点触验证码是一种常见的反爬手段. 解决方案有两种:一种是直接解决,这需要深度学习机器学习等图像处理技术,以大量的数据训练识别模型,最终达到模型足矣识别图片中的文字提示和应该点击的区域之间 ...

  8. python反爬虫应对之借助平台超级鹰突破网页验证码识别

    在爬虫过程中,有些网页需要登录才能获取里面的数据,在大部分的登录过程中,都会需要一个叫验证码识别,目前的网页有各种各样的验证码,有数字加字母的组合,有物品识别等等 在代码进行网页爬取过程中,如果由人为 ...

  9. Python使用网络抓包的方式,利用超级鹰平台识别验证码登录爬取古诗文网、上篇--识别验证码

    Python使用网络抓包的方式,利用超级鹰平台识别验证码登录,<爬取古诗文网>. 上篇–识别验证码 序言: 哈喽,各位小可爱们,我又来了,这次我新学习到的内容是python爬虫识别验证码. ...

  10. 2020-08-27 RPA uipath入门demo,超级鹰实现验证码自动登录,自动搜索和拉取数据到excel,robot和Orchestrator共同实现定时安排机器人执行任务。

    资源地址:https://download.csdn.net/download/u012742970/12773335 本文主要讲解uipath studio,uirobot,Orchestrator ...

最新文章

  1. Rocksdb 的一些参数调优策略
  2. 你必须尝试的20个 Python 库
  3. [转载]在线文档预览方案-Office Web Apps
  4. oracle 一致性读数量,ORACLE 一致性读原理记录
  5. [ARM异常]-ARMV8-aarch32的异常向量表介绍
  6. UI Automation
  7. poj 1061 青蛙的约会
  8. 巧妙利用channel进行golang并发式爬虫
  9. CodeForces - 1215C Swap Letters(暴力+思维+模拟)
  10. 20191215周学习总结
  11. creo不完全约束_Creo绘图1:1输出AutoCAD配置方法详解,工程图输出再不用担心尺寸乱变!...
  12. 松弛型内存模型(Relaxed memory models)的一个有趣的例子
  13. [TCP灵魂之问]TCP 的拥塞控制、慢启动、慢启动阈值、拥塞避免、快速重传和快速恢复
  14. dreamweaver cs5 注册码及防激活
  15. 巧推网站seo优化推动网站快速排名
  16. 分布式搜索引擎ElasticSearch(二)---ElasticSearch进阶使用教程
  17. 【HoloLens2之Development Console 窗口关闭】
  18. hosts文件及域名解析过程
  19. 交易撮合系统···实现得比较简陋
  20. 负数的补码和原码转换

热门文章

  1. 目标检测论文综述(一)深度卷积神经网络
  2. 邮件系统extmail搭建手册
  3. 全面了解CAN总线协议
  4. 计算机地图制图的论文,计算机地图制图实习报告.doc
  5. CHB-MIT波士顿儿童医院癫痫EEG脑电数据处理(一)
  6. VS2003安装包和方法
  7. 火狐浏览器插件学习01
  8. html弹窗乱码,javascript弹窗是乱码怎么办?
  9. 运算服务器v9型号,V9服务器
  10. 魅族计算机软件不见了,非常全面的魅族手机常见故障原因及解决办法