用Python抢过年回家火车票

一、需要的模块

pip install splinter

二、下载浏览器的驱动(chrome或者火狐都可以)

chrome浏览器驱动下载地址:http://chromedriver.storage.googleapis.com/index.html
Firefox浏览器驱动下载地址,请点击https://github.com/mozilla/geckodriver/releases
备注:
1、根据下载的自己的电脑系统选择下载包,我的windows就用win32了,这边我直接用的火狐的,因为chrome驱动太多了,我也不知道哪一个版本(建议从最新的一个个试)。
将下载好的驱动解压到PATH路径目录下,当然也可以给这个驱动程序弄个环境变量。
2、我这边通过爬虫将chrome所有的驱动版本已经下载好了,也有firefox驱动
https://pan.baidu.com/s/1bqUVvrx

三、测试
1、利用百度搜索一些东西

#!/usr/bin/env python
#-*- coding:utf-8 -*-

from splinter.browser import Browser
#b = Browser(driver_name="chrome")
b = Browser(driver_name="firefox")
b.visit("http://www.baidu.com") 

这里写图片描述

2、输入一些像搜索的内容
这里写图片描述
由上可以发现,该输入框的name=wd,通过fill似乎只能通过name填充

在输入框搜索 360,当然也可以输入中文,但是最好指定Unicode编码,如u”你好”
代码如下:

b.fill("wd","360")

这里写图片描述

但是,如果多次搜索,我们还是需要点击”百度一下”的
百度搜索栏的value=”百度一下”,id=”su”,所以需要把这个按钮提取出来

button = b.find_by_value(u"百度一下")
或者
button = b.find_by_id(u"su")

#点击
button.click()

我们找找页面里有没有我想找的东西吧,比如找找有没有这个地址”splinter.cobrateam.info”

b.is_text_present("splinter.cobrateam.info")  #如果该页面存在,则返回True,反之亦然
b.quit()      #退出

四、购票程序思路讲解
1、手动登陆,能通过下面的代码填充表单,但是我跳不过验证码,还是等手动选择验证码的。

#!/usr/bin/env python
#-*- coding:utf-8 -*-

from splinter.browser import Browser
url = "https://kyfw.12306.cn/otn/leftTicket/init"
#b = Browser(driver_name="chrome")
b = Browser(driver_name="firefox")
b.visit(url)
b.find_by_text(u"登录").click()
b.fill("loginUserDTO.user_name","xxxx")
b.fill("userDTO.password","xxxx")

2、第二部选择出发地点日期等
通过cookies选择出发地点,日期及目的地,这些数据需要自己去copy
这里写图片描述

3、添加出发地,出发日期,目的地

b.cookies.add({"_jc_save_fromStation":u"%u4E0A%u6D77%2CSHH"})
b.cookies.add({"_jc_save_fromDate":u"2018-02-08"})  
b.cookies.add({u'_jc_save_toStation':u"%u77F3%u5BB6%u5E84%2CSJP"})

备注:如果是修改的话,还是调用add方法,如果传入的字典key值已存在则替换
比如,将目的地改为其他地方xxxx,如下即可
b.cookies.add({u’_jc_save_toStation’:’xxxxxx’})

4、查看现在的cookies值

{u'BIGipServerotn': u'1406730506.50210.0000',
 u'JSESSIONID': u'4674AFC0B20A054C12A6F652093F31D6',
 u'__NRF': u'95D48FC2E0E15920BFB61C7A330FF2AE',
 u'_jc_save_fromDate': u'2018-02-08',
 u'_jc_save_fromStation': u'%u4E0A%u6D77%2CSHH',
 u'_jc_save_toStation': u'%u77F3%u5BB6%u5E84%2CSJP',
 u'current_captcha_type': u'Z'}

5、cookies已经准备完毕,reload一下,开始查询

b.reload()
b.find_by_text(u"查询").click()

到这一步我们得确认的是,自己已经登录了。一切准备就绪了,就可以刷票了。

6、选择要预定的火车车次
这里写图片描述
从我自己坐的火车线路来看,一共11趟,我只想做高铁,那么我的预订在第9个,索引值为8。

b.find_by_text(u"预订")[8].click()

7、选择乘客
这里写图片描述

b.find_by_text(u"你的姓名")[1].click()

五、购买火车票完整代码

#!/usr/bin/env python
#-*- coding:utf-8 -*-
from splinter.browser import Browser
from time import sleep
cookie_value = {
        '上海':u"%u4E0A%u6D77%2CSHH",
        '砀山':u"%u7800%u5C71%2CDKH",
        '石家庄北':u"%u77F3%u5BB6%u5E84%2CSJP",
        '广州':u'%u5E7F%u5DDE%2CGZQ',
        '东莞东':u'%u4E1C%u839E%u4E1C%2CDMQ',
        '营山':u'%u8425%u5C71%2CNUW'
}
class buy_ticket_proc(object):
    driver_name = ''
    executable_path = ''
    #12306的账号和密码
    username = "xxxxxxx"
    passwd = "xxxxxxx"
    # cookies值和乘车日期
    starts = cookie_value['上海']
    ends = cookie_value['石家庄北']
    dtime = u"2018-02-08"
    # 车次,选择第几趟,0则从上之下依次点击
    #order = 0
    order = [9,11]
    ###乘客名
    users = [u"xxx",u"xxx"]
    ##席位
    xb = u"二等座"
    pz = u"成人票"

    """购票网址"""
    login_url = "https://kyfw.12306.cn/otn/login/init"
    ticket_url = "https://kyfw.12306.cn/otn/leftTicket/init"
    initmy_url = "https://kyfw.12306.cn/otn/index/initMy12306"
    buy = "https://kyfw.12306.cn/otn/confirmPassenger/initDc"

    def __init__(self):
        self.driver_name = 'firefox'
        self.executable_path = r'E:\Mysql\mysql-5.6\bin\geckodriver'   #这个路径自己指定,只有系统可以找到即可

    def login(self):
        self.driver.visit(self.login_url)
        self.driver.fill("loginUserDTO.user_name", self.username)
        self.driver.fill("userDTO.password", self.passwd)
        print("等待验证码,自行输入...")
        while True:
            if self.driver.url != self.initmy_url:
                pass
            else:
                break

    def start(self):
        self.driver = Browser(driver_name=self.driver_name, executable_path=self.executable_path)
        self.login()
        self.driver.visit(self.ticket_url)
        try:
            print("购票页面开始...")
            self.driver.cookies.add({"_jc_save_fromStation": self.starts})
            self.driver.cookies.add({"_jc_save_toStation": self.ends})
            self.driver.cookies.add({"_jc_save_fromDate": self.dtime})
            self.driver.reload()
            count = 0
            if len(self.order) != 0:
                while self.driver.url == self.ticket_url:
                    self.driver.find_by_text(u"查询").click()
                    count += 1
                    print("循环点击查询... 第 %s 次" % count)
                    sleep(1)
                    try:
                        for i in self.order:
                            self.driver.find_by_text(u"预订")[ i - 1].click()
                    except Exception as e:
                        print("还没开始预订")
                        continue
            else:
                while self.driver.url == self.ticket_url:
                    self.driver.find_by_text(u"查询").click()
                    count += 1
                    print("循环点击查询... 第 %s 次" % count)
                    try:
                        for i in self.driver.find_by_text(u"预订"):
                            i.click()
                    except Exception as e:
                        print("还没开始预订 %s" % count)
                        continue
            print("开始预订...")
            sleep(1)
            print('开始选择用户...')
            for user in self.users:
                self.driver.find_by_text(user).last.click()
            print("提交订单...")
            self.driver.find_by_id('submitOrder_id').click()

            print("确认选座...")
            self.driver.find_by_id('qr_submit_id').click()
        except Exception as e:
            print(e)
if __name__ == '__main__':
    ticket = buy_ticket_proc()
    ticket.start()
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值