既然说到登录,就不能不提验证码了。现在需要验证码的登录越来越多,那么对于简单的验证码,应该如何使用爬虫来进行识别呢?
一、肉眼识别
对于一次登录就可以长时间使用的情况,只需要识别一次验证码即可。这种情况下,与其花时间开发一个自动识别验证码的程序,不如直接肉眼识别。肉眼识别验证码有两种情况,借助浏览器与不借助浏览器。
1.1. 借助浏览器
在模拟登录中讲到过Cookies,通过Cookies能实现绕过登录,从而直接访问需要登录的网站。因此,对于需要输入验证码才能进行登录的网站,可以手动在浏览器登录网站,并通过Chrome获取Cookies,然后使用Cookies来访问网站。这样就可以实现人工输入一次验证码,然后很长时间不再登录。
有一些网站的验证码是通过单击或者拖动滑块来验证的。对于这种网站,目前最简单的办法就是使用Cookies来登录,其他方式都不好用。
2.2. 不借助浏览器
对于仅仅需要识别图片的验证码,可以使用这种方式——先把验证码下载到本地,然后肉眼去识别并手动输入给爬虫。
手动输入验证码的一般流程如下。
(1)爬虫访问登录页面。
(2)分析网页源代码,获取验证码地址。
(3)下载验证码到本地。
(4)打开验证码,人眼读取内容。
(5)构造POST的数据,填入验证码。
(6)POST提交。
需要注意的是,其中的(2)、(3)、(4)、(5)、(6)步是一气呵成的,是在爬虫运行的时候做的。绝对不能先把爬虫程序关闭,肉眼识别验证码以后再重新运行。在知道了图片的网址以后,就可以使用requests将验证码下载下来,再肉眼识别。一旦验证码被识别了出来,那么剩下的工作就和一般的POST提交没有什么两样了。
如果有一百个人同时访问网站,就会有一百个不同的验证码,那么网站怎么知道谁应该输入哪个验证码呢?验证码一定和每个人的浏览器有一个一一对应的关系。这种一一对应,可能是通过Cookies来实现的,也可能是通过Session来实现的。所以,当使用浏览器访问验证码页面的时候,网站一定会往浏览器里面写一些验证信息。这就决定了在处理这个验证码识别问题的时候,一定要使用Session模块,绝对不能使用requests.get()直接访问,否则代码量会增加不少。,爬虫会提示用户去手动查看验证码,并在控制台输入给爬虫。爬虫拿到验证码以后,继续使用session将验证码信息POST给检查页面,此时Cookies也会被session自动提交。网站检测到Cookies对应的验证码和用户提交的验证码一致,于是返回验证码识别正确的信息。
二、自动打码
2.1. Python图像识别
Python的强大,在于它有非常多的第三方库。对于验证码识别,Python也有现成的库来使用。开源的OCR库pytesseract配合图像识别引擎tesseract,可以用来将图片中的文字转换为文本。
这种方式在爬虫中的应用并不多见。因为现在大部分的验证码都加上了干扰的纹理,已经很少能用单机版的图片识别方式来识别了。所以如果使用这种方式,只有两种情况:网站的验证码极其简单工整,使用大量的验证码来训练tesseract。这里仅仅使用简单的图片来进行介绍。
(1)安装tesseract
使用Windows的读者,请打开网页下载安装包:https://github.com/tesseract-ocr/tesseract/wiki/Downloads,可以找到.exe安装包。
使用Mac的读者可以通过Homebrew安装:
brew install tesseract
使用Ubuntu的读者可以直接通过apt-get安装:
sudo apt-get install tesseract-orc
(2)安装Python库
要使用tesseract来进行图像识别,需要安装两个第三方库:
pip install Pillow
pip install pytesseract
其中,Pillow是Python中专门用来处理图像的第三方库,pytesseract是专门用来操作tesseract的第三方库。
(3)tesseract的使用
tesseract的使用非常简单。
① 导入pytesseract和Pillow。
② 打开图片。
③ 识别。
通过以下代码来实现最简单的图片识别:
import pytesseract
from PIL import Image
image = Image.open('验证码.png')
code = pytesseract.image_to_string(image)
print(code)
如果使用Mac OS,并且使用Homebrew安装tesseract,那么有可能程序会报以下错误:
FileNotFoundError: [Errno2] No such file or directory: ‘tesseract’
这是因为Homebrew没有把tesseract加入到系统的环境变量的缘故。要解决这个问题,需要修改Python安装文件夹下面的lib/site-packages/pytesseract文件夹中的pytesseract.py文件,将第21行的代码:
tesseract_cmd = 'tesseract'
修改为:
tesseract_cmd = '/usr/local/bin/tesseract'
要找到这个文件,最简单的办法是在PyCharm中先使用import导入pytesseract,然后,使用Windows和Linux系统的读者按下Ctrl键并单击“pytesseract”即可;使用Mac OS系统的读者按下Command键并单击“pytesseract”即可。这样,PyCharm就会自动打开这个文件。
2.2 在线验证码识别的网站
(1)打码网站介绍
在线验证码识别的网站,简称打码网站。这些网站有一些是使用深度学习技术识别验证码,有一些是雇佣了很多人来人肉识别验证码。网站提供了接口来实现验证码识别服务。使用打码网站理论上可以识别任何使用输入方式来验证的验证码。
这种打码网站的流程一般是这样的。
① 将验证码上传到网站服务器。
② 网站服务器将验证码分发给打码工人。
③ 打码工人肉眼识别验证码并上传结果。
④ 网站将结果返回。
(2)使用在线打码
在百度或者谷歌上面搜索“验证码在线识别”,就可以找到很多提供在线打码的网站。但是由于一般这种打码网站是需要交费才能使用的,所以要注意财产安全。
(3)注意事项
打码网站可能经常使用一段时间就不能使用了,可通过搜索引擎寻找其他的打码网站。通过看打码网站的文档来学习怎么使用,根据网站的说明把打码网站的接口集成到爬虫当中。由于这种打码网站鱼龙混杂,而且小网站众多,因此在选择网站的时候,需要注意以下几点。
① 不要选择任何需要提供手机号及身份证照片的网站。
② 注册邮箱请使用小号,单独使用密码。
③ 如果要交费,注意交费地址。
④ 只使用支付宝扫二维码或者微信扫二维码支付,反复确认交费金额,不要在网站上输入密码。
⑤ 一次交费不要超过10元。
--------------------------------------
没有自由的秩序和没有秩序的自由,同样具有破坏性。
--------------------------------------