基于selenium自动登录12306和查票

使用selenium首先需要下载一个和浏览器配对的驱动并把该驱动和写的py文件放在同一个文件夹下

然后导入模块  from selenium import webdriver 实例化一个浏览器对象,我这里是最新版的Edge浏览器

# usr/bin/env python
# -*- coding:utf-8 -*-
#导入库
from selenium import webdriver
from time import sleep
from selenium.webdriver import ActionChains
from selenium.webdriver.common.keys import Keys

from msedge.selenium_tools import EdgeOptions
#from msedge.selenium_tools import Edge

if __name__ == '__main__':
    #输入查询时间
    tf = 'xx' #可以input自动输入
    tt = 'xx' #可以input自动输入
    td = input('请输入日期,例如2021杠01杠01:')


    useName = input('输入用户账号:')
    password = input('输入用户密码:')

    option = EdgeOptions()
    option.add_experimental_option('excludeSwitches', ['enable-automation'])

    #实例化一个浏览器对象
    bro = webdriver.Edge('./msedgedriver.exe')

因为是初次尝试所以写的比较粗糙,不过应该可以得到想要的

#一个判断方法
    def qd_pd(sr):
        qd_text = bro.find_element_by_class_name(sr).text
        if qd_text == '确定' :
            bro.find_element_by_class_name(sr).click()

    #对登录页面发送请求
    bro.get('https://kyfw.12306.cn/otn/resources/login.html')

    #改变浏览器标识 伪装
    script = 'Object.defineProperty(navigator, "webdriver", {get: () => false,});'
    bro.execute_script(script)

    #输入账号密码 点击登录
    j = bro.find_element_by_id('J-userName')
    j.send_keys(useName)
    k = bro.find_element_by_id('J-password')
    k.send_keys(password)
    jk = bro.find_element_by_id('J-login')
    jk.click()
    sleep(4)

    #使用动作链进行滑块验证
    def Ation():
        nc = bro.find_element_by_id('nc_1_n1z')
        ation = ActionChains(bro)
        ation.click_and_hold(nc)
        ation.move_by_offset(300,0)
        ation.perform()
        ation.release()
        sleep(2)

    Ation()
    #检验滑块验证是否通过
    try:
        while True :
            if bro.find_element_by_class_name('nc-lang-cnt').text :
                bro.find_element_by_id('nc_1_refresh1').click()
                sleep(4)
                Ation()

    except:
        #判定是否有提示
        sleep(2)
        qd_pd('btn-primary')
    finally:
        #进入车票预定界面
        sleep(1.5)
        bro.find_element_by_id('link_for_ticket').click()

        sleep(3)
        bro.find_element_by_id('qd_closeDefaultWarningWindowDialog_id').click()
        #交互输入出发地
        f = bro.find_element_by_id('fromStationText')
        f.click()
        f.send_keys(tf)
        f.send_keys(Keys.ENTER)
        sleep(0.5)
        #交互输入目的地
        t = bro.find_element_by_id('toStationText')
        t.click()
        t.send_keys(tt)
        t.send_keys(Keys.ENTER)
        sleep(0.5)
        #交互输入日期
        d = bro.find_element_by_id('train_date')
        d.clear()
        d.send_keys(td)
        sleep(0.5)
        #点击查询
        bro.find_element_by_id('query_ticket').click()

        #判断是否需要中转
        sleep(3)
        if bro.find_element_by_id('no_filter_ticket_2').text:
            href =bro.find_elements_by_xpath('//*[@id="no_filter_ticket_2"]/p/a')[0].click()
            bro.find_element_by_id('_a_search_btn').click()

        #停三分钟关闭浏览器
        sleep(180)
        bro.quit()

大家在尝试的时候可以把input输入换成定值,省时间

后续会把它好好修一下,分享就先到这里

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿木wh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值