Python-12306模拟自动购票!快过年了,学起来啊!

344 阅读4分钟

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

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

PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取

python免费学习资料以及群交流解答点击即可加入

from time import sleepfrom selenium import webdriverdef 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("登录成功---")            breakdef 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正受到自动化测试软件的控制),所以我在验证的时候不管怎样滑动都不能通过,一直提醒我刷新,后来搜索解决的办法,即加入下面两行代码,具体可以看这篇博客blog.csdn.net/weixin_4387…

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进行选择。所以这几处地方可根据自己情况改动代码。   当然,这些代码程序只是牢固我们的知识基础,平常尝试可以,真正买票我们最好还是手动操作,更不能用它干些“非法”的勾当(手动滑稽)!