12306模拟登陆-超级鹰

Posted zx125

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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()

以上是关于12306模拟登陆-超级鹰的主要内容,如果未能解决你的问题,请参考以下文章

基于selenium实现12306模拟登陆

最新验证码识别模拟登陆B站

使用selenium 和图片验证码识别 对12306的模拟登录+12306查询车次

最新selenium+验证码识别模拟登陆B站

小爬爬4:12306自动登录&&pyppeteer基本使用

利用Python与selenium自动化模拟登陆12306官网!