美文网首页爬虫
二十行代码!实现网站的验证码自动识别

二十行代码!实现网站的验证码自动识别

作者: 程序里的小仙女 | 来源:发表于2019-06-15 12:07 被阅读0次

    一.
    自己去chaojiying官网注册一个账号,购买相关的产品.

    爬虫时候,自动识别需要登录的验证码,并实现自动登录,第一步使用超级鹰识别出网站的验证码

    #!/usr/bin/env python
    # coding:utf-8
    
    import requests
    from hashlib import md5
    
    class Chaojiying_Client(object):
    
        def __init__(self, username, password, soft_id):
            self.username = username
            password =  password.encode('utf8')
            self.password = md5(password).hexdigest()
            self.soft_id = soft_id
            self.base_params = {
                'user': self.username,
                'pass2': self.password,
                'softid': self.soft_id,
            }
            self.headers = {
                'Connection': 'Keep-Alive',
                'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)',
            }
    
        def PostPic(self, im, codetype):
            """
            im: 图片字节
            codetype: 题目类型 参考 http://www.chaojiying.com/price.html
            """
            params = {
                'codetype': codetype,
            }
            params.update(self.base_params)
            files = {'userfile': ('ccc.jpg', im)}
            r = requests.post('http://upload.chaojiying.net/Upload/Processing.php', data=params, files=files, headers=self.headers)
            return r.json()
    
        def ReportError(self, im_id):
            """
            im_id:报错题目的图片ID
            """
            params = {
                'id': im_id,
            }
            params.update(self.base_params)
            r = requests.post('http://upload.chaojiying.net/Upload/ReportError.php', data=params, headers=self.headers)
            return r.json()
    
    def main1(name):
        chaojiying = Chaojiying_Client("这里输入超级鹰的账号和密码,还有服务型号")  # 用户中心>>软件ID 生成一个替换 96001
        im = open(name, 'rb').read()  # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
        return  chaojiying.PostPic(im, 1902)  # 1902 验证码类型  官方网站>>价格体系 3.4+版 print 后要加()
    
    
    if __name__ == '__main__':
        chaojiying = Chaojiying_Client('这里输入超级鹰的账号和密码,还有服务型号')  #用户中心>>软件ID 生成一个替换 96001
        im = open('a1.jpg', 'rb').read()         #本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
        print(chaojiying.PostPic(im, 1902))  #1902 验证码类型  官方网站>>价格体系 3.4+版 print 后要加()
    
    
    

    二.图片识别py程序
    步骤:
    1.打开chrome浏览器实现截图,这里使用到了

    screenhot = browser.get_screenshot_as_png()
    

    2.保存图片(这里可以使用两种方法)
    第一种是:with open 'wb'二进制格式写入
    第二种是: 使用pillow, 在PIL库中的Img.open方法


    image.png

    3.以上保存的是页面的整个屏幕截图,下一步是从大图中抠出小验证码,思路是确定验证码整个div的横纵坐标,得到验证码框.

    image.png
    1. 使用超级鹰进行图片识别:
      这里的main1方法是调用超级鹰里面定义的main1
        result = main1('crop.png')
        print(result)
    

    最后识别结果如下:


    image.png

    5.模拟登录
    browser.close()

    源码如下:仅供参考

    from io import BytesIO
    from  selenium import webdriver
    from selenium.webdriver.support.wait import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.common.by import By
    
    from PIL import Image
    
    from chaojiying import main1
    
    
    def main():
        # 打开浏览器chrome实现截图
        url = 'http://bm.e21cn.com/log/login.aspx'
        browser = webdriver.Chrome()
        wait = WebDriverWait(browser, 10)
        browser.get(url)
    
        #由于屏幕分辨率太小,导致截图不到验证码,需要拖拽屏幕
    
        # browser.execute_script('window.scrollTo(1000,2000)')
    
        screenhot = browser.get_screenshot_as_png()
        print(screenhot)
        # 1.保存大图 (使用with open)
        # with open('login_screen.png', 'wb') as f:
        #     f.write(screenhot)
    
        # 2.保存大使图(使用pillow)
        img = Image.open(BytesIO(screenhot))
        img.save('login1_screen.png')
    
    
        #再确定验证码的横纵坐标,再从大图中抠出小验证码
        input = wait.until(
            EC.presence_of_element_located((By.CSS_SELECTOR, '#imgCheckCode'))
        )
        location = input.location
    
        size = input.size
        #保存图片中x:578  y:196
        # location中 x:748 y:
        left = location['x']
    
        left_bottom = location['y']
        right = location['x'] + size['width']
        right_bottom = location['y'] + size['height']
        capchta = img.crop((left, left_bottom, right, right_bottom))
        capchta.save('crop.png')
        # print(capchta)
    
        #使用超级鹰进行图片识别
        result = main1('crop.png')
        print(result)
    
    
    
        #模拟登录
        browser.close()
    
    
    
    if __name__ == '__main__':
        main()
    
    
    
    

    ---部分代码转载来自超级鹰官网,时注明超级鹰文档,仅供技术交流:

    相关文章

      网友评论

        本文标题:二十行代码!实现网站的验证码自动识别

        本文链接:https://www.haomeiwen.com/subject/jixbfctx.html