python 搭建火车票抢票神器

眼看马上就要到春运了,相信很多朋友又到了发挥各种神通开始刷票了,今天我们就用python 来写一个类似360 抢票的小工具,能自己灵活配置,可以比360抢票更灵活。

现如今购票官网上最让人头疼的就是那个反人类的识别图片认证了,这里我们为了省事,没做得那么高端来进行图片识别,有兴趣的朋友可以网上查找相关资料用一些黑科技来实现。我们这里使用python 的splinter 包来实现,splinter包可以帮我们直接操作浏览器,说白了就是设置好一系列的浏览器点击操作,这个过程比我们使用一些urllib 包去爬取、设置cookie 等方便了很多。具体的包的安装过程就不再描述了,可以上度娘上去谷歌一下。好了我们直接看简单的代码实现。代码环境python2.7 + ipython ( jupyter notebook )

#coding=utf8
from splinter.browser import Browser
import time,pandas,json
import numpy as np
from selenium.webdriver.common.keys import Keys

from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"
driver = webdriver.Chrome(executable_path='/usr/local/bin/chromedriver')
driver.get("https://kyfw.12306.cn/otn/leftTicket/init")
driver.find_element_by_id("fromStationText").click()
driver.find_element_by_xpath(".//*[@id='ul_list1']/li[1]").click()
driver.find_element_by_id("toStationText").click()
driver.find_element_by_xpath(".//*[@id='ul_list1']/li[5]").click()
driver.find_element_by_id("avail_ticket").send_keys(Keys.SPACE)

上面的代码段我们先导入了相关的引用的包,webdriver.Chrome 指定了启动谷歌浏览器的驱动,当然如果是火狐浏览器的话得下载对应的火狐浏览器驱动, 执行到 driver.get 我们已经打开了12306的购票首页,接下来的一些find_element 就是在查找对应的始发站和终点站,这个不是关键我们可以人工输入,另外先别着急,我们先还得再来一下"人工智能"人工填写一下登录的账号和密码以及那个反人类的图片识别,登录以后就可以开始代码自动刷票了。下面就开始附上刷票代码:(其实很简单,找到对应的空间,点击即可)

ticket=0
ticket_type=3
#指定车次:
candidate_train={"Z1":1,"Z53":1}
#指定车票类型: 此处我们只选择二等座,卧铺,和有座三种类型。
#ticket_style={}
while ticket<1:
    try:
        driver.find_element_by_id("query_ticket").click()
        time.sleep(3)
        trains=driver.find_elements_by_xpath('//*[@id="queryLeftTable"]/tr')
        array = []
        for train in trains:
            tds = train.find_elements_by_tag_name("td")
            #print len(tds)
            if len(tds)!= 0:
                train_info=tds[0].text.split("\n")
                train_info.append(tds[3].text)
                train_info.append(tds[7].text)
                train_info.append(tds[9].text)
                array.append(train_info)
        ticket=1
    except Exception as e:
        ticket=1
        print e
        pass 
if len(array)>0:
    df = pandas.DataFrame(array)
    df.columns = pandas.Series(["车次","始发站","达到","出发时间","到达时间","历时","是否当日","二等座","硬卧","硬座"])
    df 

这里我们先来执行一下看看搜索到的结果如下:

python 搭建火车票抢票神器_第1张图片
WechatIMG6.jpeg

然后代码中在ipython 中解析出来打印的结果为:

python 搭建火车票抢票神器_第2张图片
WechatIMGpandas.jpeg

忽略打印信息我们真正开始刷票,这里我们举例来看只刷Z53 和Z1 两个车次:(刷票效果)

1516012047001.gif
ticket=0
#指定车次:
candidate_train={"Z1":1,"Z53":1}
#指定车票类型: 此处我们只选择二等座,卧铺,和有座三种类型。
#ticket_style={}
while ticket<1:
    try:
        driver.find_element_by_id("query_ticket").click()
        time.sleep(3)
        trains=driver.find_elements_by_xpath('//*[@id="queryLeftTable"]/tr')
        array = []
        for train in trains:
            tds = train.find_elements_by_tag_name("td")
            #print len(tds)
            if len(tds)!= 0:
                train_info=tds[0].text.split("\n")
                train_info.append(tds[3].text)
                train_info.append(tds[7].text)
                train_info.append(tds[9].text) 
                array.append(train_info)
            #判断车次是否在候选的车次里面
            if candidate_train.has_key(train_info[0]):
                #判断是否有需要的座位类别
                if (tds[3].text !="--" and tds[3].text!=u"无") or ( tds[7].text !="--" and tds[7].text!=u"无") or (tds[9].text !="--" and tds[9].text!=u"无"):
                    tds[12].click()
                    ticket = ticket + 1 
    except Exception as e:
        ticket=ticket+1
        print e
        pass 

由于上面刷到的Z53 还有一张硬座票,所以程序就会跳出自动循环,点击了购票跳转到购票页面,这里跳转的时候要保证用户在刷票之前登录了12306,否则会导致调转不到订票页面。跳转到订票页面之后,会让用户选择对应的乘车人信息,这里我们假设就勾选第一个乘车人,对应代码为:

if driver.current_url ==u'https://kyfw.12306.cn/otn/confirmPassenger/initDc':
    driver.find_element_by_id("normalPassenger_0").send_keys(Keys.SPACE)
    driver.find_element_by_id("submitOrder_id").click()
    driver.find_element_by_id("qr_submit_id").click()

这样如果上面的流程正常的话,那么你喜欢的票票就应该正常抢到手了,当然如果最后一步确认购票的时候出现什么“网络繁忙,出票失败”之类的那就只能重启再刷了 ̄□ ̄||

python 搭建火车票抢票神器_第3张图片
WechatIMG22.jpeg

好了抢票小工具就介绍到这里,这里只是小功能的实现,并不是专业的抢票工具,可能不会写python 的朋友会看不懂。不过没关系,这里咱们有专业的抢票团队,千兆高速网络帮你抢票,可以加群一起讨论:希望大家都能在春运期间顺利抢到回家的票,新年快乐!

python 搭建火车票抢票神器_第4张图片
WechatIMG二维码.jpeg

你可能感兴趣的:(python 搭建火车票抢票神器)