Python网络爬虫验证码识别

Ursula ·
更新时间:2024-09-21
· 864 次阅读

本文主要利用tesseract识别网页登陆中的验证码(从图像的角度,不是Cookie)

很多人对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 关注 私信 展开阅读全文
作者:傻灰



爬虫 验证码 验证码识别 Python

需要 登录 后方可回复, 如果你还没有账号请 注册新账号