python中selenium(模拟登陆)+pytesseract(自动识别验证码)应用例子之查询住房公积金

这里以查询深圳住房公积金为例(http://gjj.sz.gov.cn/fzgn/zfcq/

from selenium import webdriver  # 模拟浏览器操作
from PIL import Image # 图像处理
import time
import pytesseract  # 验证码识别
# 加载等待时用到
from selenium.webdriver.common.by import By 
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 获取公积金余额信息,输入:电脑号,身份证号
def getInfo(computerID,IDnumber):
    '''
    1.页面请求
    '''
    # http://gjj.sz.gov.cn/fzgn/zfcq/   经查看左边原网址iframe标签发现输入框嵌入了下面的地址
    url = "http://app.szzfgjj.com:7001/pages/sj_yecx.jsp"  
    browser = webdriver.Firefox()
    browser.get(url)
    browser.maximize_window()  # 最大化
    #print(browser.page_source)
    # 等待加载完成
    #time.sleep(1)
    # 显示等待5s,等待元素加载(等某个条件发生后再继续执行后续代码)
    # 显示等待和隐式等待区别:https://blog.csdn.net/cyjs1988/article/details/76033180
    try:
        locator = (By.ID,"rad_1")
        WebDriverWait(browser,5).until(EC.presence_of_element_located(locator))
    except: # 超时则提示加载失败,浏览器退出并返回
        print("load fail") 
        browser.quit()
        return
    '''
    2.输入信息
    '''
    # 选中个人社保电脑号按钮   
    browser.find_element_by_id("rad_1").click()
    # 输入社保电脑号
    ComputerNumber_input = browser.find_element_by_id("accnum1")
    ComputerNumber_input.send_keys(computerID)
    # 获取身份证输入框
    IDNumber_input = browser.find_element_by_id("certinum1")
    # 输入身份证号码
    IDNumber_input.send_keys(IDnumber)
    '''
    3.自动识别验证码处理
    '''
    # 找到验证码位置
    VerifyCode = browser.find_element_by_id("imgyzm")
    location = VerifyCode.location
    # 获取验证码的size
    size = VerifyCode.size
    #写成我们需要截取的位置坐标 ,这里获得(x,y)为矩形左下角的坐标,(x+width,y+height)为对应右上角的坐标
    rangle=(int(location['x']),int(location['y']),int(location['x']+size['width']),int(location['y']+size['height'])) 
    #print(rangle)
    # 先保存整个网页截图
    name = "fullpage.png"
    browser.save_screenshot(name)
    # 通过PIL中的crop剪切图片
    image = Image.open(name)
    codeArea = image.crop(rangle) # 使用Image的crop函数(对图片进行剪切处理),从截图中再次截取我们需要的区域  
    codeArea.save("code_raw.png")  # 保存截取的验证码图片
    # 对图片进行二值化处理(尴尬的是这里不做二值化处理,在下面经过放大处理后依然可以正确识别,权当研究下)
    out = ImageProcess("code_raw.png")
    # 获取图片大小
    x,y = out.size
    #print(x,y)  # 60 20
    # 放大图片(经测试这里不放大,没法识别,原图size有点小)
    resize_img = out.resize((x*2,y*2))   #print(transform.rescale(img, 2).shape)   #放大为原来图片大小的2倍
    #print(reimg.size) (120, 40)
    resize_img.save("code_erzhihua.png")
    result = pytesseract.image_to_string(resize_img,lang = "eng")
    print("result",result)
    # 输入验证码
    browser.find_element_by_id("verify").send_keys(result)
    '''
    4.查询
    '''
    # 点击查询按钮
    browser.find_element_by_id("but_2").click()
    # 以下打印不出结果,待进一步研究
    #time.sleep(2)
    #elements = browser.find_element_by_class_name("form_yecx_out")
    #print(elements.text)
    # 关闭此页面
    #browser.close()
    # 退出浏览器
    #browser.quit()


# 对图片进行简单的二值化处理
def ImageProcess(image):
    image = Image.open(image)
    image = image.convert("L")  # 灰色模式
    table = []
    threshold = 140
    for i in range(256):
        if i < threshold:
            table.append(0)
        else:
            table.append(1)
    return image.point(table,"1") # Image.point()方法操作像素数据


getInfo("你的电脑号","你的身份证号")

 

reference:

https://blog.csdn.net/dcba2014/article/details/78969658
http://hankerzheng.com/blog/chenge-the-size-of-pic-by-python-pil
https://blog.csdn.net/kethur/article/details/79992539

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值