zoukankan      html  css  js  c++  java
  • 12306模拟登陆-超级鹰

    12306模拟登陆-超级鹰

    什么是超级鹰?

    就是和云打码类似的验证码识别网站,但是他能识别更复杂的图片验证码

    模拟登陆12306

    主要思路

    1.首先登陆到12306界面

    2.点击账号密码登录,到账号密码登录模块

    3.截取整张界面的图片保存到本地,并获取验证码部分的坐标

    4.在界面截图的基础上,根据获取的坐标截取验证码的图片保存到本地

    5.把图片交给超级鹰,返回结果

    6.把结果解析成想要点击的坐标

    7.输入账号密码,执行验证码点击,点击登录

    8.ok,但是有几率无法识别验证码

    from selenium import webdriver
    import chaojiying as cj
    import time
    #动作链,点击验证码
    from selenium.webdriver import ActionChains
    #图片处理,截图用
    from PIL import Image
    #实现规避检测
    from selenium.webdriver import ChromeOptions
    #12306登录url
    url="https://kyfw.12306.cn/otn/resources/login.html"
    
    #规避检测
    option = ChromeOptions()
    option.add_experimental_option('excludeSwitches', ['enable-automation'])
    
    chrome=webdriver.Chrome(executable_path="chromedriver",options=option)
    chrome.maximize_window()
    
    #发起请求
    chrome.get(url)
    time.sleep(3)
    
    #切换到账号密码登录
    #找到切换按钮
    button=chrome.find_element_by_xpath('/html/body/div[2]/div[2]/ul/li[2]/a')
    #点击切换到账号密码登录
    button.click()
    time.sleep(5)
    
    #获取验证码图片的标签对象
    code_img=chrome.find_element_by_xpath('//*[@id="J-loginImg"]')
    #获取验证码图片的左上角x,y坐标位置
    img_location=code_img.location
    #获取验证码图片的长宽
    img_size=code_img.size
    #图片左上角和右下角的坐标
    rangle=(
        int(img_location['x']), int(img_location['y']),int(img_location['x'] + img_size['width']),int(img_location['y'] + img_size['height'])
    )
    time.sleep(2)
    
    #截取整张界面的图片
    chrome.save_screenshot("12306.png")
    html_img=Image.open("12306.png")
    time.sleep(2)
    
    #设置截图后的名字
    code_img_name="code.png"
    #截取验证码部分的图片
    frame=html_img.crop(rangle)
    #保存验证码截图
    frame.save(code_img_name)
    time.sleep(2)
    
    #将图片发给超级鹰识别获取结果,zx为封装的接口
    result=cj.zx()
    
    #解决返回结果,创建点击列表
    all_location=[]
    if '|' in result['pic_str']:
        lo_list=result['pic_str'].split('|')
        for i in lo_list:
            lo_list=[]
            x=int(i.split(',')[0])
            y=int(i.split(',')[1])
            lo_list.append(x)
            lo_list.append(y)
            all_location.append(lo_list)
    else:
        lo_list = []
        x=int(result['pic_str'][0])
        y=int(result['pic_str'][1])
        lo_list.append(x)
        lo_list.append(y)
        all_location.append(lo_list)
    
    
    for i in all_location:
        x=i[0]
        y=i[1]
        ActionChains(chrome).move_to_element_with_offset(code_img,x,y).click().perform()
        time.sleep(1)
    
    #输入账号
    chrome.find_element_by_id('J-userName').send_keys("******")
    #输入密码
    chrome.find_element_by_id('J-password').send_keys('******')
    time.sleep(2)
    
    #点击登录
    chrome.find_element_by_id('J-login').click()
    time.sleep(10)
    
    chrome.quit()
    
  • 相关阅读:
    IaaS、PaaS、SaaS的简单介绍
    抓包工具F12和Fiddler的使用
    Element的el-cascader组件获取级联选中的label值
    解决C盘爆满的方法
    js-简单的加密解密函数
    使用removeBg去除图片背景
    git手动提交命令
    JS-下拉筛选的实现
    mysql根据json字段内容作为查询条件
    获取访问用户的客户端IP(适用于公网与局域网)
  • 原文地址:https://www.cnblogs.com/zx125/p/11488639.html
Copyright © 2011-2022 走看看