基于python3+selenium实现自动枪火车票

什么介绍啊,背景啊我就省了,我只知道我需要一个能帮我抢到火车票的东西。那我刚学了python能不能实现呢?百度找资料并总结,我初步写出了如下代码:

from selenium import webdriver
import time
from selenium.webdriver.common.action_chains import ActionChains

def main():
    
    login_text()
    search_ticket()
    book_ticket()

def login_text():
    d.get(url)
    d.implicitly_wait(30)
    #登陆账号
    username_ele = d.find_element_by_id('username')
    username_ele.clear()
    username_ele.send_keys(username)
    #登陆密码
    pwd_ele = d.find_element_by_id('password')
    pwd_ele.clear()
    pwd_ele.send_keys(pwd)

    while True:     #手动进行图片验证,并登录
        curpage_url = d.current_url
        if curpage_url != url:
            if curpage_url[:-1] != url:
                print('.......登陆成功........')
                break
        else:
            time.sleep(3)
            print('--------->等待用户进行图片验证')

def search_ticket():

    d.find_element_by_link_text('车票预订').click()
    time.sleep(3)
    #输入出发地
    d.add_cookie({"name": "_jc_save_fromStation","value": '%u6DF1%u5733%2CSZQ'}) #深圳
    #选择目的地
    d.add_cookie({"name": "_jc_save_toStation", "value": '%u8861%u9633%2CHYQ'}) #衡阳 
    #  %u5E7F%u5DDE%u5357%2CIZQ(广州南)   %u8861%u9633%2CHYQ(衡阳)  %u6DF1%u5733%2CSZQ(深圳)

    #选择出发日期
    d.add_cookie({"name": "_jc_save_fromDate", "value": '2018-02-06'})
    d.refresh()

def book_ticket():
    query_time = 0
    time_begin = time.time()
    #循环查询
    while True:
        time.sleep(1)
        search_btn = d.find_element_by_link_text('查询')
        search_btn.click()

        #扫描查询结果
        try:
            d.implicitly_wait(10)
            #深圳到广州南G1010的PATH:('//*[@id="ZE_6i000G10100C"])  深圳到衡阳G822:('//*[@id="ZE_6i0000G8220H"]')
            ticket_ele = d.find_element_by_xpath('//*[@id="ZE_6i0000G8220H"]')   #所抢车次对应的座位等级的xpath
            ticket_info = ticket_ele.text
        except:
            search_btn.click()
            d.implicitly_wait(5)
            ticket_ele = d.find_element_by_xpath('//*[@id="ZE_6i0000G8220H"]')
            ticket_info = ticket_ele.text
            print('可能您的xpath选择错误')

        if ticket_info == '无' or ticket_info == '*':
            query_time += 1
            cur_time = time.time()
            print('第%d次查询,用时%s秒'%(query_time,cur_time - time_begin))
        else:
            d.find_element_by_xpath('/html/body/div[6]/div[7]/table/tbody/tr[135]/td[13]/a').click()
            break

    cust_url = 'https://kyfw.12306.cn/otn/confirmPassenger/initDc'
    while True:
        if (d.current_url == cust_url):
            print('页面跳至选择乘客信息 成功')
            break
        else:
            time.sleep(1)
            print('等待页面跳转')

    while True:
        try:
            d.find_element_by_xpath('//*[@id="normalPassenger_0"]').click()   #_0是联系人列表里的第一个 ,依此类推
            break
        except:
            print('等待常用联系人列表')

#提交订单
    d.find_element_by_xpath('//*[@id="submitOrder_id"]').click()

#确认订票信息
    while True:
        try:
            d.switch_to.frame(d.find_element_by_xpath('/html/body/iframe[2]')) 
            print
            d.find_element_by_xpath('//*[@id="qr_submit_id"]')
            print('pass')
        except:
            print('请手动选座和点击确认信息')
            time.sleep(5)
            break

if __name__ == '__main__':
    d = webdriver.Chrome()
    url = 'https://kyfw.12306.cn/otn/login/init'
    username= 'xxxxxxxxx'(想拿我的帐号去测试?别想了,用你自己的吧)
    pwd = 'xxxxxxxx'
    main()
本人参考的文章:https://www.jianshu.com/p/dce3ab7af452

还需要进一步改进的地方,需要进行配置的有: 浏览器,username,pwd,出发地和目的地的cookies,出发日期, 所抢车次对应的座位等级的xpath,联系人的选择,还需添加打印日志功能,和发送邮件功能

我会继续更新自己的学习的东西。

你可能感兴趣的:(selenium自动化)