很多人对CAPTCHA(验证码)很熟悉,但是很少有人知道其含义:全自动区分计算机和人类的图灵测试。通俗的讲就是是一种区分人和人工智能程序的方法。很多的网页都设置了验证码,常见的就是由“字母数字”组成的图片,如下:
本文的代码是利用selenium模拟浏览器的运行,识别登陆界面的验证码,分割验证码的区域然后识别验证码(光学字符识别)。
# -*- coding: utf-8 -*-
"""
Created on Sun Apr 26 17:42:23 2020
@author: dell
"""
import re # 用于正则
from PIL import Image # 用于打开图片和对图片处理
import tesserocr
import pytesseract # 用于图片转文字
from selenium import webdriver # 用于打开网站
import time # 代码运行停顿
import requests
def get_pictures():
try:
driver = webdriver.Chrome()
driver.get('https:XXXXXXXXXXXX/')
driver.refresh() #刷新页面
driver.maximize_window() #浏览器最大化
# time.sleep(10)
except:
print("HaHa!")
driver.close()
find_element = driver.find_element_by_css_selector
driver.save_screenshot('C:/Users/dell/Desktop/shot/pictures.png')
img = find_element('#verifyCanvas')
page_snap_obj = Image.open('C:/Users/dell/Desktop/shot/pictures.png')
location = img.location
size = img.size # 获取验证码的大小参数
print(location, size)
left = location['x']
top = location['y']
right = left + size['width']
bottom = top + size['height']
image_obj = page_snap_obj.crop((left, top, right, bottom)) # 按照验证码的长宽,切割验证码
image_obj.show() # 打开切割后的完整验证码
driver.close() # 处理完验证码后关闭浏览器
return image_obj
def processing_image():
image_obj = get_pictures() # 获取验证码
img = image_obj.convert("L") # 转灰度
img.show()
pixdata = img.load()
w, h = img.size
threshold = 160
#160, 140,
# 遍历所有像素,大于阈值的为黑色
for y in range(h):
for x in range(w):
if pixdata[x, y] < threshold:
pixdata[x, y] = 0
else:
pixdata[x, y] = 255
img.show()
# return img.point(pixdata, '1')
return img
return img
def image_str():
image = processing_image()
pytesseract.pytesseract.tesseract_cmd = "D:/Anaconda/Tesseract-OCR/tesseract.exe" # 设置pyteseract路径
result = pytesseract.image_to_string(image) # 图片转文字
return result
if __name__ == '__main__':
yanzheng_code = image_str().replace(" ", "")
print(yanzheng_code)
# params = {'userName': 'XXXXX', 'password': 'XXXXXX', 'yanzhengs': yanzheng_code}
# session=requests.Session()
# r = session.get('https://osdds.nsoas.org.cn/#/', headers=head)
# image = Image.open(r'C:\Users\dell\Desktop\shot\code.png')
# print(tesserocr.image_to_text(image))
下图是 灰度+二值化 后的验证码,是最终我们需要的图片格式。
输出的结果有时并不太理想,图片中的字母或数字发生了倾斜重合,是一种干扰,会降低识别的准确性,但是多试几次,一定会有命中的次数。
runfile('C:/Users/dell/Desktop/shot/verify_final.py', wdir='C:/Users/dell/Desktop/shot')
{'x': 1041, 'y': 334} {'height': 45, 'width': 130}
6BBK
如有疑问,欢迎留言哦!
傻灰
原创文章 17获赞 44访问量 3074
关注
私信
展开阅读全文