zoukankan      html  css  js  c++  java
  • 【转】Python OCR识别图片验证码

    转载自:博客

    对于某些网站登录的时候,往往需要输入验证码才能实现登录。如果要爬虫这类网站,往往总会比这个验证码导致无法爬取数据。以下介绍一种比较折中的方法,也是比较可行的方法: 
    实现思想: 
    1、通过截图获取验证码图片,为什么要截图,有的人会说,可以通过验证码图片的链接爬取下来,再用OCR识别就可以了,理论上这个方法是可行的,但是当你用这方法的时候,会发觉下载的图片和你实际页面的图片里面的内容是不一样的。 
    2、截图图片后,通过OCR识别,返回验证码内容,完成登录。

    代码:

    #保存图片,通过显示器xy坐标,这里值得注意的是,如果每个显示器的分辨率是不一样的,(332,415,385,440)这个坐标会随时改动。
    from PIL import ImageGrab
    addr='E:\OCR\bb.png'
    im = ImageGrab.grab((332,415,385,440))
    im.save(addr,'png')

    OCR识别,尽管上OCR识别有一定的准确率,但这个是可以通过ocr开发提高识别准确率的。

    import pytesser3
    print (pytesser3.image_file_to_string('bb.png'))

    运行: 
    下载图片: 
    这里写图片描述
    OCR识别: 
    这里写图片描述

    定义一个简单登录方法:

    from PIL import ImageGrab
    import pytesser3
    from selenium import webdriver
    
    def loginSys(loginName,password):
        driver=webdriver.Ie()  
        driver.get(url)
        driver.implicitly_wait(60)
        LoginTitle=driver.title
    
        while 1:
            result=driver.title
            if LoginTitle==result:
                #截图
                addr='E:\OCR\bb.png'
                im = ImageGrab.grab((332,415,385,440))
                im.save(addr,'png')
                #OCR
                Code=pytesser3.image_file_to_string('bb.png')
                print (pytesser3.image_file_to_string('bb.png'))
                #自动登录,find_element_by_id自行修改
                driver.switch_to.frame('loginFormFrame')
                driver.find_element_by_id('id_loginName').send_keys(loginName)
                driver.find_element_by_id('id_password').send_keys(password)
                driver.find_element_by_id('id_certCode').send_keys(Code)
                driver.implicitly_wait(10)
                driver.find_element_by_xpath('//img[@onclick="doLogin();"]').click()
                driver.implicitly_wait(10)
                driver.switch_to.default_content()
            else:
                break
        #cookies传递,用于request爬取数据        
        cook=driver.get_cookies()
        cookies[cook[0]['name']]=cook[0]['value']

    解释:这里用了selenium做一个自动化登录的,这里会有疑问,为何不用requests,或者scrapy直接做后台登录。 
    原因如下:首先我们找到登录 
    这里写图片描述
    这是一张图片,而且图片触发是一个js,再看js 
    js代码很长,大部分都是做检测功能。 
    这里写图片描述 
    如图所示,可以看到,这个登录是用get方法实现的,但是str是做了加密处理。 
    我用过python的Base64解密,但解密出来的结果不一样。 
    所以只能用到上述的方法。

  • 相关阅读:
    队列

    Oracle 12c新特性之——TABLE ACCESS BY INDEX ROWID BATCHED
    连续三月涨势明显,PostgreSQL 将崛起?
    Oracle物理DG自动切换——Dataguard Broker配置
    MSSQL索引视图(indexed view)之简述及使用
    连续三月涨势明显,PostgreSQL 将崛起?
    Scheduler & Task & Worker & Thread & Request & Session & Connection of SQL Server
    MSSQL内存架构及管理
    MSSQL数据库后台进程(线程)
  • 原文地址:https://www.cnblogs.com/chenyang920/p/8068126.html
Copyright © 2011-2022 走看看