zoukankan      html  css  js  c++  java
  • 验证码处理

    1.引入

    • 相关的门户网站在进行登录的时候,如果用户连续登录的次数超过3次或者5次的时候,就会在登录页中动态生成验证码。通过验证码达到分流和反爬的效果。

    2.概要

    • 使用云打码平台识别验证码

    3.回顾

    • session的创建方式
    • session的作用
    • proxies参数的作用
    • 高匿,透明代理的区别

    一.详情

    云打码平台处理验证码的实现流程:

    云打码平台处理验证码的实现流程:

    - 1.对携带验证码的页面数据进行抓取
    - 2.可以将页面数据中验证码进行解析,验证码图片下载到本地
    - 3.可以将验证码图片提交给三方平台进行识别,返回验证码图片上的数据值
        - 云打码平台:
            - 1.在官网中进行注册(普通用户和开发者用户)
            - 2.登录开发者用户:
                - 1.实例代码的下载(开发文档-》调用实例及最新的DLL-》PythonHTTP实例下载)
                - 2.创建一个软件:我的软件-》添加新的软件
            -3.使用示例代码中的源码文件中的代码进行修改,让其识别验证码图片中的数据值

    1.代码展示:

    #该函数就调用了打码平台的相关的接口对指定的验证码图片进行识别,返回图片上的数据值
    def getCode(codeImg):
        # 云打码平台普通用户的用户名
        username    = 'bobo328410948'
    
        # 云打码平台普通用户的密码
        password    = 'bobo328410948'                            
        
        # 软件ID,开发者分成必要参数。登录开发者后台【我的软件】获得!
        appid       = 6003                                     
    
        # 软件密钥,开发者分成必要参数。登录开发者后台【我的软件】获得!
        appkey      = '1f4b564483ae5c907a1d34f8e2f2776c'    
    
        # 验证码图片文件
        filename    = codeImg                        
    
        # 验证码类型,# 例:1004表示4位字母数字,不同类型收费不同。请准确填写,否则影响识别率。在此查询所有类型 http://www.yundama.com/price.html
        codetype    = 3000
    
        # 超时时间,秒
        timeout     = 20                                    
    
        # 检查
        if (username == 'username'):
            print('请设置好相关参数再测试')
        else:
            # 初始化
            yundama = YDMHttp(username, password, appid, appkey)
    
            # 登陆云打码
            uid = yundama.login();
            print('uid: %s' % uid)
    
            # 查询余额
            balance = yundama.balance();
            print('balance: %s' % balance)
    
            # 开始识别,图片路径,验证码类型ID,超时时间(秒),识别结果
            cid, result = yundama.decode(filename, codetype, timeout);
            print('cid: %s, result: %s' % (cid, result))
            
            return result
    View Code
    import requests
    from lxml import etree
    import json
    import time
    import re
    #1.对携带验证码的页面数据进行抓取
    url = 'https://www.douban.com/accounts/login?source=movie'
    headers = {
        'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Mobile Safari/537.36'
    }
    page_text = requests.get(url=url,headers=headers).text
    
    #2.可以将页面数据中验证码进行解析,验证码图片下载到本地
    tree = etree.HTML(page_text)
    codeImg_url = tree.xpath('//*[@id="captcha_image"]/@src')[0]
    #获取了验证码图片对应的二进制数据值
    code_img = requests.get(url=codeImg_url,headers=headers).content
    
    
    #获取capture_id
    '<img id="captcha_image" src="https://www.douban.com/misc/captcha?id=AdC4WXGyiRuVJrP9q15mqIrt:en&amp;size=s" alt="captcha" class="captcha_image">'
    c_id = re.findall('<img id="captcha_image".*?id=(.*?)&amp.*?>',page_text,re.S)[0]
    with open('./code.png','wb') as fp:
        fp.write(code_img)
    
    #获得了验证码图片上面的数据值
    codeText = getCode('./code.png')  
    print(codeText)
    #进行登录操作
    post = 'https://accounts.douban.com/login'
    data = {
        "source": "movie",
        "redir": "https://movie.douban.com/",
        "form_email": "15027900535",
        "form_password": "bobo@15027900535",
        "captcha-solution":codeText,
        "captcha-id":c_id,
        "login": "登录",
    }
    print(c_id)
    login_text = requests.post(url=post,data=data,headers=headers).text
    with open('./login.html','w',encoding='utf-8') as fp:
        fp.write(login_text)
    View Code
  • 相关阅读:
    【故障处理】ORA-12162: TNS:net service name is incorrectly specified (转)
    android studio 编程中用到的快捷键
    java时间格式串
    android Error occurred during initialization of VM Could not reserve enough space for object heap Could not create the Java virtual machine.
    linux安装vmware
    x1c 2017 安装mint18的坑——grub2
    x1c2017 8G版 win linux的取舍纠结记录
    python的try finally (还真不简单)
    kafka+docker+python
    json文件不能有注释
  • 原文地址:https://www.cnblogs.com/qicun/p/10498229.html
Copyright © 2011-2022 走看看