python selenium+PIL+免验证码登陆

来源:互联网 发布:上海淘宝运营助理招聘 编辑:程序博客网 时间:2024/06/07 18:38

最近在学习python的验证码处理这一块,学了点,想着做个小实践,在这里,我找了一个网址来模拟一键登录过程。
首先来放一下动图感受一下:
登录动态图
O(∩_∩)O哈哈~,当时刚做完的时候觉得好神奇的样子,小白级别,心情望请谅解~~
首先,所需工具如下:
1. Python 3.6
2. IDE Pycharm 5.0.3
3. 谷歌浏览器:47.0.1
4. Selenium PIL
5. pytesseract

如果学过一点python爬虫的童靴,在输入验证码之前肯定都是没问题的,在输入验证码这一块,我是采取了先对整个页面进行截屏,然后截取含有验证码的图片,进行识别,将识别的字母及数字插入到验证码输入那一栏。那么难点就是如果确定截取含有验证码图片的坐标,下面将来详细说明:
将截屏的图保存到本地,然后用电脑自带的附件–>画图打开,指针呈十字虚状,当鼠标在页面移动的时候,页面左下角对应的像素也一直在改变,然后将鼠标指针停留在验证码图片的左上角,此时记下页面左下角对应的像素值,即我们要截取图片的左上角的坐标,对应box=(x1,y1,x2,y2),对应x1和y1的值,如图(一),

图一

再然后将鼠标指针停留在验证码图片的右下角,此时记下页面左下角对应的像素值,即我们所要截取图片的右下角的坐标,对应box=(x1,y1,x2,y2),对应x2和y2的值,如图(二)

图二

然后对截取的图片进行识别,用pytesseract库中的image_to_string函数进行识别即可,最后附上完整代码:

# usr/bin/env/python# -*- coding:utf-8 -*-# time:2017/12/01__author__ = 'LazyGirl_81'from selenium import webdriverimport pytesseractfrom PIL import Imagedriver = webdriver.Chrome()driver.get('http://pay.hust.edu.cn')name = driver.find_element_by_id("txt_yhm")name.send_keys("M201571151")mima = driver.find_element_by_id('txt_pwd')mima.send_keys("06641X")driver.get_screenshot_as_file('image1.png')im = Image.open('image1.png')box = (1155,477,1265,527)region = im.crop(box)region.save("image2.jpg")code_text = pytesseract.image_to_string(Image.open('image2.jpg'), lang='chi_sim')code = driver.find_element_by_id("txt_yzm")code.send_keys(code_text)denglu = driver.find_element_by_id('ImageButton1')denglu.click()

因为做这个一时兴起,做了做就拿来写了,在此处也没考虑说如果验证码识别错误了之后的做法,所以这个代码是需要完善的,后续自己会补充上去,也希望路过的大神多多指教。