Python爬⾍之验证码处理
1、了解常见验证码
在⽇常⽣活与⼯作中,在进⾏各类设计个⼈账户安全的操作时,往往需要填写各种验证码来进⾏验证,短信、语⾳、⽂字、问答、图⽚、拖拽、旋转腾挪、拼图接图...千奇百怪,各种各样,种类繁多,花样迭起!
就拿奇葩验证码⿐祖的12306来说,如今我们在12306中可以碰到各种有趣,各种类型的验证码的原因,要归功于为抢票事业做出巨⼤贡献的——黄⽜们,它的“进化史”就是⼀部不断与黄⽜和抢票软件“⽃智⽃勇”的历史。
⽬前我们常见的验证码,⽆⾮就是⽂本、图像以及⾳频这三⼤类。
⽽当⽂本验证码仍容易被机器“击破”时,图像验证码就应运⽽⽣了。通常是会提供⼀些物体、动物、植物、⼈、风景之类的图像,让我们选择正确的图像进⾏标记。这就是以12306为⾸的图像验证码了,但是这个还不算后来图像验证码⼜增加了新的玩法,⽐如旋转图⽚,⽐如拼图以及宫格,⽬的还是为了对抗爬⾍这些机器。
接下来是⾳频验证码,这种相⽐前两种数量相对要⼩⼀些,主要是会给我们⼀段录⾳,⾥⾯有随机的单词或数字,有的会加⼀些噪⾳,我们基于录⾳输⼊其中听到的单词或数字,或者把它读出来。从安全性上来说,声⾳验证码⽐⽂本和图像等级要提升⼀个层级,因为机器想要听
录⾳并分辨,这个难度会⾮常⼤。
⼿动输⼊(input) 这种⽅法仅限于登录⼀次就可持续使⽤的情况
图像识别引擎解析 使⽤光学识别引擎处理图⽚中的数据,⽬前常⽤于图⽚数据提取,较少⽤于验证码处理
打码平台 爬⾍常⽤的验证码解决⽅案
3、图像识别引擎
OCR,即Optical Character Recognition,光学字符识别,是指通过扫描字符,然后通过其形状将其翻译成电⼦⽂本的过程,对应图形验证码来说,它们都是⼀些不规则的字符,这些字符是由字符稍加扭曲变换得到的内容,我们可以使⽤OCR技术来讲其转化为电⼦⽂本,然后将结果提取交给服务器,便可以达到⾃动识别验证码的过程
tesserocr与pytesseract是Python的⼀个OCR识别库,但其实是对tesseract做的⼀层Python API封装,pytesseract是Google的Tesseract-OCR引擎包装器;所以它们的核⼼是tesseract,因此在安装tesserocr之前,我们需要先安装tesseract。
图⽚识别引擎环境的安装
1、引擎的安装
mac环境下直接执⾏命令
brew install --with-training-tools tesseract
windows环境下的安装 可以通过exe安装包安装,下载地址可以从GitHub项⽬中的wiki到。安装完成后记得将Tesseract 执⾏⽂件的⽬录加⼊到PATH中,⽅便后续调⽤。
linux环境下的安装
sudo apt-get install tesseract-ocr
2
2、Python库的安装
# PIL⽤于打开图⽚⽂件
pip/pip3 install pillow
# pytesseract模块⽤于从图⽚中解析数据
pip/pip3 install pytesseract
本次案例我们使⽤图⽚识别引擎识别验证码登陆古诗⽂⽹
通过分析我们发现验证码点击刷新的链接是:
所以我们请求10次本链接获取10张图⽚,进⾏图⽚识别
import time
from PIL import Image
爬虫软件 app
import pytesseract
import requests
headers = {
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36" }
image_url = '/RandCode.ashx'
# 下载验证码图⽚
session = requests.Session()  # 使⽤session是为了保证验证码的请求和登陆请求信息⼀致
for i in range(10):
r = (image_url, headers=headers)
with open('images/code'+str(i)+'.jpg', 'wb') as fp:
fp.t)
time.sleep(10)
print('下载完成第'+str(i)+'张!')
system什么意思
# 依次识别并保存到⽂件中
# 进⾏⼆值处理
def erzhihua(image, threshold):
''':type image:Image.Image'''
image = vert('L')
iso的osi协议是哪七层
table = []
for i in range(256):advanced的汉语意思是
if i < threshold:
table.append(0)
else:
table.append(1)display标签属性
return image.point(table, '1')
# 对刚才保存的10张图⽚进⾏识别
for i in range(10):
im = Image.open('images/code' + str(i) + '.jpg')
im = erzhihua(im, 127)
im.show()
result = pytesseract.image_to_string(im, lang='eng')
print(result)
毕业设计模板网站但是很遗憾10次或者更多次数才能打码成功⼀次。
4、打码平台

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。