上一篇介绍了使用python模拟登陆网站,但是登陆的网站都是直接输入账号及密码进行登陆,现在很多网站为了加强用户安全性和提高反爬虫机制都会有包括字符、图片、手机验证等等各式各样的验证码。图片验证码就是其中一种,而且识别难度越来越大,人为都比较难识别。本篇我们简单介绍一下使用python登陆带弱图片验证码的网站。

图片验证码

一般都通过加干扰线、粘连或扭曲等方式来增加强度。

登陆

我们选择一个政务网站(图片验证码的强度较低)。

点击个人用户登录

访问网站首页以后我们发现需要先点击个人用户登陆,且元素没有name、id登标识不好获取,所以我们直接执行里面的onClick方法

# 新建selenium浏览器对象,后面是geckodriver.exe下载后本地路径

browser = webdriver.Firefox()

url = 'http://xxx.gov.cn/'

# 浏览器访问登录页面

browser.get(url)

# 等待3s用于加载脚本文件

browser.implicitly_wait(3)

# 点击个人登陆

browser.execute_script('showpersonlogin();')

获取图片验证码

我们可以通过save_screenshot截图,然后找到验证码元素,获取元素位置然后在截图的基础上裁剪出验证码。

# 找到图片验证码元素

img = browser.find_element_by_id('imgCode')

location = img.location

size = img.size

left = location['x']

top = location['y']

right = left + size['width']

bottom = top + size['height']

# 按照验证码的长宽,切割验证码

image_obj = loginPage.crop((left, top, right, bottom))

image_obj.save('code.png')

识别并登陆

由于该网站的验证码比较简单可以直接用pytesseract模块的image_to_string方法

orcCode = pytesseract.image_to_string('code.png')

# 输入用户名

username = browser.find_element_by_id('personaccount')

username.send_keys('账号')

# 输入密码

password = browser.find_element_by_id('personpassword')

password.send_keys('密码')

# 输入验证码

code = browser.find_element_by_id('captcha1')

code.send_keys(orcCode)

# 执行登录

browser.execute_script('personlogin();')

# 关闭浏览器

# browser.quit()

识别较复杂验证码算法

网上找的算法,先将图片转为灰度图,然后进行二值化处理(将图像上的像素点的灰度值设置为0或255。如灰度大于等于阈值的像素,用255表示。否则为0。),再去噪(8邻域降噪,判断8个邻域的黑色数量个数)。

ocrImage.py:

import pytesseract

from PIL import Image

from collections import defaultdict

# 获取图片中像素点数量最多的像素

def get_threshold(image):

pixel_dict = defaultdict(int)

# 像素及该像素出现次数的字典

rows, cols = image.size

for i in range(rows):

for j in range(cols):

pixel = image.getpixel((i, j))

pixel_dict[pixel] += 1

count_max = max(pixel_dict.values()) # 获取像素出现出多的次数

pixel_dict_reverse = {v: k for k, v in pixel_dict.items()}

threshold = pixel_dict_reverse[count_max] # 获取出现次数最多的像素点

return threshold

# 按照阈值进行二值化处理

# threshold: 像素阈值

def get_bin_table(threshold):

# 获取灰度转二值的映射table

table = []

for i in range(256):

rate = 0.1 # 在threshold的适当范围内进行处理

if threshold * (1 - rate) <= i <= threshold * (1 + rate):

table.append(1)

else:

table.append(0)

return table

# 去掉二值化处理后的图片中的噪声点

def cut_noise(image):

rows, cols = image.size # 图片的宽度和高度

change_pos = [] # 记录噪声点位置

# 遍历图片中的每个点,除掉边缘

for i in range(1, rows - 1):

for j in range(1, cols - 1):

# pixel_set用来记录该店附近的黑色像素的数量

pixel_set = []

# 取该点的邻域为以该点为中心的九宫格

for m in range(i - 1, i + 2):

for n in range(j - 1, j + 2):

if image.getpixel((m, n)) != 1: # 1为白色,0位黑色

pixel_set.append(image.getpixel((m, n)))

# 如果该位置的九宫内的黑色数量小于等于4,则判断为噪声

if len(pixel_set) <= 4:

change_pos.append((i, j))

# 对相应位置进行像素修改,将噪声处的像素置为1(白色)

for pos in change_pos:

image.putpixel(pos, 1)

return image # 返回修改后的图片

# 识别图片中的数字加字母

# 传入参数为图片路径,返回结果为:识别结果

def ocr_img(img_path):

image = Image.open(img_path) # 打开图片文件

imgry = image.convert('L') # 转化为灰度图

# 获取图片中的出现次数最多的像素,即为该图片的背景

max_pixel = get_threshold(imgry)

# 将图片进行二值化处理

table = get_bin_table(threshold=max_pixel)

out = imgry.point(table, '1')

# 去掉图片中的噪声(孤立点)

out = cut_noise(out)

# 仅识别图片中的数字

# text = pytesseract.image_to_string(out, config='digits')

# 识别图片中的数字和字母

text = pytesseract.image_to_string(out)

# 去掉识别结果中的特殊字符

exclude_char_list = ' .:\\|\'\"?![],()~@#$%^&*_+-={};<>/¥'

text = ''.join([x for x in text if x not in exclude_char_list])

return text

ocrImage.ocr_img('data/0021.png')

其他

针对不同的图片验证码用的方法不尽相同,cv2模块也提供了很多图片的处理方法可以用于识别图片验证码。

如使用cv2的腐蚀和碰撞方法就可以对图片进行简单的处理。

干扰条件较多、识别难度大的则需要依靠机器学习来完成。

以上就是用python登录带弱图片验证码的网站的详细内容,更多关于python 登录图片验证码的网站的资料请关注脚本之家其它相关文章!

python 登陆网站图片验证,用python登录带弱图片验证码的网站相关推荐

  1. 交叉验证python代码_交叉验证以及python代码实现

    这篇文章介绍的内容是关交叉验证以及python代码实现 ,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 模型选择的两种方法:正则化(典型方法).交叉验证. 这里介绍交叉验证及其pyth ...

  2. PHP抓取远程图片教程(包含不带后缀图片)

    之前做微信登录开发时候,发现微信头像图片没有后缀名,传统的图片抓取方式不奏效,需要特殊的抓取处理.所以,后来将各种情况结合起来,封装成一个类,分享出来. 创建项目 作为演示,我们在www根目录创建项目 ...

  3. Python计算谷歌身份验证器(google authenticator)的验证码

    公司的上班时间是弹性的,每天上满8小时即可下班.楼主这种懒人基本都是每天卡点下班,需要根据早上的打卡时间推算8小时.但登录OA查询打卡时间又要填谷歌身份验证码(运维大哥搞的很严), 所以自己用PyQt ...

  4. php gd图片验证,php笔记之GD库图片创建/简单验证码

    燕十八 公益PHP培训 课堂地址:YY频道88354001 学习社区:www.zixue.it php画图:比如说验证码,缩略图,加水印都要用到GD库,所以要开启gd2库,才能用 首先找到php.in ...

  5. 使用C#登录带验证码的网站

    我在上一篇文章中已经讲解了一般网站的登录原来和C#的登录实现,很多人问到对于使用了验证码的网站该怎么办,这里我就讲讲验证码的原理和对应的登录方法. 验证码的由来 几年前,大部分网站.论坛之类的是没有验 ...

  6. python爬取12306列车信息自动抢票并自动识别验证码(二)selenium登录验证篇

    项目前言 自学python差不多有一年半载了,这两天利用在甲方公司搬砖空闲之余写了个小项目--[12306-tiebanggg-master]注:本项目仅供学习研究,如若侵犯到贵公司权益请联系我第一时 ...

  7. python网站自动答题_python自动登录网站答题-女性时尚流行美容健康娱乐mv-ida网...

    女性时尚流行美容健康娱乐mv-ida网 mvida时尚娱乐网 首页 美容 护肤 化妆技巧 发型 服饰 健康 情感 美体 美食 娱乐 明星八卦 首页  > 高级搜索 cookie实现 自动 登录 ...

  8. python批量读取图片gps位置_某少儿不宜网站图片拍摄位置分析,Python批量读取图片GPS位置!...

    原标题:某少儿不宜网站图片拍摄位置分析,Python批量读取图片GPS位置! 1. python读取图片exif属性中的GPS信息 智能手机或平板如果在拍照时开启定位服务,照片中就会记录拍照位置信息和 ...

  9. python验证账号密码登录

    python小程序:一段利用循环实现的验证账号密码登录的程序 init_usrname = input("请输入初始用户名:") init_password = input(&qu ...

最新文章

  1. python subprocess库 终端命令行命令
  2. 一口气看完 45 个寄存器,CPU 核心技术大揭秘
  3. 转:微服务设计、拆分原则
  4. 【OpenCV 例程200篇】71. 连续函数的取样
  5. 本地调试微信程序ngrok
  6. 望图知意-Yahoo VS 3721
  7. 测试是浪费时间,我的程序肯定没问题
  8. 怎样把两个HTML合一起,将两个 PDF 页面合并在一起
  9. 五、鼎捷T100生产管理之报工
  10. Eclipse安装反编译工具Eclipse Class Decompiler:实现不下载源码,查看源文件
  11. 3d渲染是显示计算机内存不足,win10系统使用3d渲染图片出现内存不足如何解决
  12. 无悔入华夏怎么一直显示服务器,无悔入华夏快速通关攻略
  13. 高等代数 线性映射(第9章)4 约当标准型与相抵标准形
  14. mac配置iOS开发环境
  15. 可信验证与TPCM技术
  16. 江浙沪的java春招实习综合面经
  17. org.apache.avro.file.DataFileWriter$AppendWriteException: org.apache.avro.UnresolvedUnionException:
  18. Android关键知识点详解
  19. 从全职高手开始的系统_全职高手之系统小说
  20. 买三种文具编程C语言,C语言程序设计实验的个人物品管理系统程序(33页)-原创力文档...

热门文章

  1. Android 高德地图 自定义Location小蓝点
  2. asp.net 调试 无法显示该网页
  3. EVE-NG物理机启动报错
  4. php搞笑证件,什么软件可以制作搞笑证件,多种搞笑证件制作
  5. 开源开放 | 多模态地球科学知识图谱GAKG
  6. C++--数值的整数次方
  7. Android 10 11 删除本地照片方法
  8. EPICS记录参考--sub-Array记录(subArray)
  9. c语言海报,C语言 竞选海报
  10. uniapp中唤醒支付宝,微信进行支付并返回app