Python+Chrome自动识别验证码
验证码故名思意,一般用在登陆或确认等需要验证操作人身份的环节,用来区分真人操作和自动操作、防止误操作等,其本意是好的,但在许多自动化场景中验证码就成了阻碍效率提升的拦路虎。
识别验证码的方式很多,其背后的影像识别算法后续有机会我们再去深究,目前早有前者帮我们做好了验证码识别接口,我们只需要按照开发样例调用识别接口即可。
使用现成得轮子减少工作量
阿里云提供了几个服务商的验证码识别接口,简单验证码的识别近乎于免费,我们来用其中的一个试试使用效果。
阿里云的API已经提供了代码示例,按理说我们经过简单的调试即可使用。
API传入验证码图片或Base64后的编码、验证码类型后返回json格式的识别结果,验证码类型好办,验证码图片对于爬虫也不困难,准备好验证码直接调试即可,这里用python做示例。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 import urllib, urllib2, sys
import ssl
host = 'https://jisuyzmsb.market.alicloudapi.com'
path = '/captcha/type'
method = 'POST'
appcode = '你自己的AppCode'
querys = ''
bodys = {}
url = host + path
request = urllib2.Request(url) #Python2
request.add_header('Authorization', 'APPCODE ' + appcode)
ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE
response = urllib2.urlopen(request, context=ctx)
content = response.read()
if (content):
print(content)
使用事前申请好的鉴权代码和示例代码一次性就可以识别成功,接口返回了识别状态和验证码。
但如果是用selenium和Chrome模拟浏览器功能去自动化运行程序的话,获取验证码图片是个难题,Chrome并不支持直接获取验证码的图片,selenium因为是浏览器层面的模拟也无法将验证码另存为图片,那么只好去截图和裁剪了,好在全页面截图和获取坐标点不困难。
1
2
3
4
5
6
7
8
9
10 from selenium import webdriver
import selenium
element = BotSession.find_element_by_xpath('//*[@id="identify"]')
left = int(element.location['x']*1.5)#根据缩放确定倍数
top = int(element.location['y']*1.5)#要留意win10得自动缩放和DPI调整
right = int(element.location['x']*1.5 + element.size['width']*1.5)
bottom = int(element.location['y']*1.5 + element.size['height']*1.5)
from PIL import Image#需要pip install PIL
im = Image.open(DataFolds + '/test.png')
im = im.crop((left, top, right, bottom))
截图和裁剪之后就可以直接转换调用api识别了,完整的代码如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 def CodeDetect(Filepath) :
import base64
with open(Filepath,"rb") as f:
# b64encode编码
base64_data = base64.b64encode(f.read())
import urllib, sys
import ssl
from urllib import request
host = 'https://jisuyzmsb.market.alicloudapi.com'
path = '/captcha/recognize'
method = 'POST'
appcode = 'Code'
querys = 'type=en4'
bodys = {}
url = host + path + '?' + querys
bodys['pic'] = base64_data
post_data = urllib.parse.urlencode(bodys).encode("utf-8")
request = urllib.request.Request(url, post_data)
request.add_header('Authorization', 'APPCODE ' + appcode)
request.add_header('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8')
ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE
response = urllib.request.urlopen(request, context=ctx)
content = response.read()
if (content):
return(content)
好了,这样就可以每天自动从各类报表系统内拉取数据,调用计划任务刷新SQL数据库生成报表发送到邮箱了。上班打开电脑冲杯咖啡的功夫,上午的日报就做好了,欧耶!
本文遵守署名-非营利性使用-相同方式共享协议,转载请保留本段:冰丝带雨 » Python+Chrome自动识别验证码