python--Selenium自动化登陆验证码网站
Selenium自动化登陆验证码网站
该脚本 能识别简单字母、数字的验证码
脚本思路:
1. yz_code(): 打开网页,将浏览器最大化。然后定位验证码的位置,截取验证码对应的区域,将图片保存,然后进行二值化处理,再进行文本识别。
其实这么做的原因很简单:不会将验证码图片直接进行保存,然后再识别,这样识别率会更加高。
def yz_code(): bbox = (1348, 423, 1455, 455) # 截图范围,这个取决你验证码的位置 img = ImageGrab.grab(bbox=bbox) img.save("D:\\py\\login\\image_code.jpg") # 设置路径 # img.show() img = Image.open('image_code.jpg') # PIL库加载图片 # print img.format, img.size, img.mode # 打印图片信息 img = img.convert('RGBA') # 转换为RGBA pix = img.load() # 读取为像素 for x in range(img.size[0]): # 处理上下黑边框 pix[x, 0] = pix[x, img.size[1] - 1] = (255, 255, 255, 255) for y in range(img.size[1]): # 处理左右黑边框 pix[0, y] = pix[img.size[0] - 1, y] = (255, 255, 255, 255) for y in range(img.size[1]): # 二值化处理,这个阈值为R=95,G=95,B=95 for x in range(img.size[0]): if pix[x, y][0] < 95 or pix[x, y][1] < 95 or pix[x, y][2] < 95: pix[x, y] = (0, 0, 0, 255) else: pix[x, y] = (255, 255, 255, 255) img.save("temp.jpg") # 由于tesseract限制,这里必须存到本地文件 image = Image.open('temp.jpg') signin_code = pytesseract.image_to_string(image) return signin_code print signin_code
2. login(): 进行selenium的登录操作。(这里可以看“虫师”的教程,简单,易懂,我这里就不解释了)
def login(): driver.maximize_window() time.sleep(3) code = yz_code() driver.find_element_by_id('username').clear() driver.find_element_by_id('username').send_keys('123456') # 账号 time.sleep(3) driver.find_element_by_id('password').clear() driver.find_element_by_id('password').send_keys('123456') # 密码 time.sleep(3) driver.find_element_by_id('verifyCode').send_keys(code) time.sleep(3) driver.find_element_by_id('loginform').click() time.sleep(5)
3. code_err(): 因为我登陆的这个网站,验证码错误的时候会有信息显示在界面,所以我这里就通过抓取文本信息,判断验证码是否识别正确
def code_err(): try: a = driver.find_element_by_id('status').text print a if a == '验证码不正确!': return 0 except: print u"验证码识别正确" return 1
4. 主程序
执行登陆操作,验证码识别成功,登陆成功后 则进行点击“loginbutton”的操作
验证码识别失败,则一直执行登陆操作,直至登陆成功
while 0==0: login() code_err() # 判断验证码 i = code_err() if i==1: break driver.find_element_by_xpath('//*[@id="loginButton"]').click() time.sleep(3) driver.quit()
程序源码:
# coding=utf-8 from selenium import webdriver import time import pytesseract from PIL import Image,ImageGrab import sys reload(sys) sys.setdefaultencoding('utf-8') def yz_code(): bbox = (1348, 423, 1455, 455) # 截图范围,这个取决你验证码的位置 img = ImageGrab.grab(bbox=bbox) img.save("D:\\py\\login\\image_code.jpg") # 设置路径 # img.show() img = Image.open('image_code.jpg') # PIL库加载图片 # print img.format, img.size, img.mode # 打印图片信息 img = img.convert('RGBA') # 转换为RGBA pix = img.load() # 读取为像素 for x in range(img.size[0]): # 处理上下黑边框 pix[x, 0] = pix[x, img.size[1] - 1] = (255, 255, 255, 255) for y in range(img.size[1]): # 处理左右黑边框 pix[0, y] = pix[img.size[0] - 1, y] = (255, 255, 255, 255) for y in range(img.size[1]): # 二值化处理,这个阈值为R=95,G=95,B=95 for x in range(img.size[0]): if pix[x, y][0] < 95 or pix[x, y][1] < 95 or pix[x, y][2] < 95: pix[x, y] = (0, 0, 0, 255) else: pix[x, y] = (255, 255, 255, 255) img.save("temp.jpg") # 由于tesseract限制,这里必须存到本地文件 image = Image.open('temp.jpg') signin_code = pytesseract.image_to_string(image) return signin_code print signin_code def login(): driver.maximize_window() time.sleep(3) code = yz_code() driver.find_element_by_id('username').clear() driver.find_element_by_id('username').send_keys('123456') # 账号 time.sleep(3) driver.find_element_by_id('password').clear() driver.find_element_by_id('password').send_keys('123456') # 密码 time.sleep(3) driver.find_element_by_id('verifyCode').send_keys(code) time.sleep(3) driver.find_element_by_id('loginform').click() time.sleep(5) def code_err(): try: a = driver.find_element_by_id('status').text print a if a == '验证码不正确!': return 0 except: print u"验证码识别正确" return 1 if __name__=="__main__": driver = webdriver.Chrome() driver.get("http//:www.baidu.com") while 0==0: login() code_err() # 判断验证码 i = code_err() if i==1: break driver.find_element_by_xpath('//*[@id="loginButton"]').click() time.sleep(3) driver.quit()
小弟的github: