Python-12306模拟自动购票

  2020临近尾声,购买车票回家也逐渐成为人们所关注的事情。所以我心中也就萌生了用程序来自动购票的想法,虽然之前看过一些人关于抢票的程序,本想直接用现成代码来尝试,但奈何12306网站有了许多改动,所以就自己尝试写一个购票程序,也正好对selenium进行回顾。

  其实模拟购票的思路也非常简单,无非就是像我们平常买票一样,进入网站,登录,选中自己出发时间和地点以及目的地,然后预定付款,现在将这种思路转换成代码实现即可。所以这里主要针对本人代码中的部分内容进行解析,先给出网址:https://kyfw.12306.cn/otn/resources/login.html
,废话不多说,上代码:

from time import sleep
from selenium import webdriver

def login():
    my_user = '我的用户名'
    my_passwords = '我的密码'
    script = 'Object.defineProperty(navigator,"webdriver",{get:() => false,});'
    bro.execute_script(script)
    sleep(0.5)
    # 点击一下使用账号密码登录
    bro.find_element_by_xpath('/html/body/div[2]/div[2]/ul/li[2]/a').click()
    bro.find_element_by_id('J-userName').send_keys(my_user)
    sleep(1)
    bro.find_element_by_id('J-password').send_keys(my_passwords)
    print(u"手动验证---")
    while True:
        if bro.current_url != url:
            print("登录成功---")
            break

def main():
    login()
    start = '%u5357%u660C%2CNCG'#出发点
    end = '%u5409%u5B89%2CVAG'#到达点
    time = '2020-12-01'
    id = '学生'
    order = 0
    #order即列车票的顺序,0则为从上至下依次点击,选择有票的列车购买
    #若是不为0,则按输入的购买
    sleep(3)
    # print(bro.current_url)
    script = 'Object.defineProperty(navigator,"webdriver",{get:() => false,});'
    bro.execute_script(script)
    bro.find_element_by_link_text('确定').click()
    bro.find_element_by_link_text("车票").click()
    bro.find_element_by_link_text("单程").click()
    sleep(3)
    url = bro.current_url
    bro.add_cookie({"name":"_jc_save_fromStation","value":start})
    bro.add_cookie({"name":"_jc_save_toStation","value":end})
    bro.add_cookie({"name":"_jc_save_fromDate","value":time})
    bro.refresh()
    if id == '学生':
        bro.find_element_by_id('sf2').click()
    else:
        bro.find_element_by_id('sf1').click()
    sleep(1)
    if order == 0:
        while True:
            if url != bro.current_url:
                break
            print("正在查询,客官莫急---")
            bro.find_element_by_id('query_ticket').click()
            try:
                sleep(1)
                for i in  bro.find_elements_by_class_name('btn72'):
                    i.click()
                    sleep(2)
            except:
                print("还未预定,请等待---")
                continue

    else:
        while True:
            if url != bro.current_url:
                break
            print("正在查询,客官莫急---")
            bro.find_element_by_id('query_ticket').click()
            try:
                sleep(1)
                bro.find_elements_by_class_name('btn72')[order-1].click()
                sleep(2)
            except:
                print("还未预定,请等待---")
                continue

    sleep(3)
    print("进入预定---")
    print("正在选择乘客---")
    bro.find_elements_by_class_name('check')[2].click()
    #默认只有自己
    bro.find_element_by_link_text('确认').click()
    print("乘客选择完成---")
    bro.find_element_by_xpath('//*[@id="seatType_1"]//option[@value="1"]').click()
    print("提交订单---")
    bro.find_element_by_link_text("提交订单").click()
    sleep(1)
    bro.find_element_by_link_text('确认').click()
    print("订单已提交---")
    print("请客官前往支付---")

if __name__=='__main__':
    option = webdriver.ChromeOptions()
    option.add_argument('disable-infobars')
    bro = webdriver.Chrome(options=option)
    bro.maximize_window()  # 浏览器全屏显示
    url = 'https://kyfw.12306.cn/otn/resources/login.html'
    bro.get('https://kyfw.12306.cn/otn/resources/login.html')
    main()



  进入12306网站的登录界面,可以看到有扫码登录和帐号登录,我们模拟自然选择帐号登录,我们用代码输入帐号和密码之后,还有两个验证步骤,一个点触验证和滑动验证,本人能力有限,对于验证暂时没有研究,所以这里还是要手动验证的

  这里值得一提的是,在滑动验证的时候,WebDriver被识别反爬虫(Chrome正受到自动化测试软件的控制),所以我在验证的时候不管怎样滑动都不能通过,一直提醒我刷新,后来搜索解决的办法,即加入下面两行代码,具体可以看这篇博客https://blog.csdn.net/weixin_43870646/article/details/105418801

script = 'Object.defineProperty(navigator,"webdriver",{get:() => false,});'
bro.execute_script(script)


start = '%u5357%u660C%2CNCG'#出发点
end = '%u5409%u5B89%2CVAG'#到达点

  这里的出发站和到达站的输入cookies值,这个需要根据自己的情况去查找,这里给出查找步骤。登录之后,我们可以看到如下界面
在这里插入图片描述

(我使用的是谷歌浏览器,按F12快捷键可检查元素),然后选择右上方的Network,在左边的界面中输入你所需要查找的出发地和目的地以及出发日,然后点击查询,会出现如下界面
在这里插入图片描述
点击红箭头所指向的位置,会出现一系列的信息,在Headers下找到Cookie这一信息
在这里插入图片描述
红箭头所指向的即代表它们的Cookies值。

  最后说明代码中一些特殊情况,针对于我自己的帐号设置,每个人的不一定相同,所以代码可自行更改。

在这里插入图片描述
对于此处的点击确定,是我登录后会出现如下界面
在这里插入图片描述
  而对于代码中最后的那个点击确定,是因为我选择了学生票,会出现提示界面
在这里插入图片描述
以及选择乘客那行代码

bro.find_elements_by_class_name('check')[2].click()

因为我的帐号中添加了其他相关人信息,我自己的选项位置在第三处,所以已下标2进行选择。所以这几处地方可根据自己情况改动代码


  当然,这些代码程序只是牢固我们的知识基础,平常尝试可以,真正买票我们最好还是手动操作,更不能用它干些“非法”的勾当(手动滑稽)!

### 回答1: 首先,在写12306自动购票代码之前,您需要了解12306购票流程,包括如何查询车次信息、如何选择座位等。 下面是一个简单的12306自动购票代码示例,帮助您了解购票流程: ```python import requests # 填写您的12306登录账号和密码 username = 'your_username' password = 'your_password' # 登录12306 login_url = 'https://kyfw.12306.cn/passport/web/login' form_data = { 'username': username, 'password': password, } response = requests.post(login_url, data=form_data) # 检查登录是否成功 if response.status_code != 200: print('登录失败') exit() # 获取登录后的cookies cookies = response.cookies # 查询车次信息 query_url = 'https://kyfw.12306.cn/otn/leftTicket/query' form_data = { 'leftTicketDTO.train_date': '2022-01-01', # 乘车日期 'leftTicketDTO.from_station': 'BJP', # 出发站 'leftTicketDTO.to_station': 'SHH', # 到达站 } response = requests.get(query_url, params=form_data, cookies=cookies) # 处理车次信息 train_list = response.json()['data']['result'] for train in train_list: # 判断是否有符合条件的车次 if train.split('|')[3] == 'G123': # 车次为G123 # 获取车次信息 secret_str = train.split('|')[0] # 加密字符串 query_left_ticket_url = train.split('|')[26] # 查询余票的url break else: print('未找到符合条件的车次') exit() # 订 ### 回答2: 12306自动购票的代码可以使用Python编写,通过模拟用户登录、查询、选择座位、提交订单等操作,完成自动购票的流程。下面是一个简单的示例代码: ```python import requests # 用户登录 def login(username, password): login_url = 'http://www.12306.cn/login' data = { 'username': username, 'password': password } response = requests.post(login_url, data=data) # 判断登录是否成功 if response.status_code == 200: print('登录成功') else: print('登录失败') # 查询车票 def search_train(from_station, to_station, date): search_url = f'http://www.12306.cn/search?from_station={from_station}&to_station={to_station}&date={date}' response = requests.get(search_url) # 处理查询结果 # TODO # 选择座位 def choose_seat(train_no, seat_type): seat_url = f'http://www.12306.cn/seat?train_no={train_no}&seat_type={seat_type}' response = requests.get(seat_url) # 处理座位信息 # TODO # 提交订单 def submit_order(train_no, seat_type): order_url = 'http://www.12306.cn/submit_order' data = { 'train_no': train_no, 'seat_type': seat_type } response = requests.post(order_url, data=data) # 判断订单是否提交成功 if response.status_code == 200: print('订单提交成功') else: print('订单提交失败') # 示例代码主函数 def main(): # 用户输入登录信息 username = input('请输入用户名:') password = input('请输入密码:') # 用户登录 login(username, password) # 用户输入查询信息 from_station = input('请输入出发地:') to_station = input('请输入目的地:') date = input('请输入出发日期:') # 查询车票 search_train(from_station, to_station, date) # 用户选择座位 train_no = input('请输入车次:') seat_type = input('请输入座位类型:') # 选择座位 choose_seat(train_no, seat_type) # 提交订单 submit_order(train_no, seat_type) # 调用主函数 if __name__ == '__main__': main() ``` 以上代码仅为示例,具体实现需要根据12306网站的接口文档进行进一步开发和调试,并根据实际运行情况进行相应的异常处理和错误处理。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值