利用Python自动抢火车票真的不难,100行代码即可完成

Posted 编程唐小宝

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用Python自动抢火车票真的不难,100行代码即可完成相关的知识,希望对你有一定的参考价值。

欢迎点击右上角关注小编,除了分享技术文章之外还有很多福利,私信学习资料可以领取包括不限于Python实战演练、PDF电子文档、面试集锦、学习资料等。

前言

去年过年的时候,有一个新闻报道:网上的那些抢票软件比如:某程、某猪…只要你加钱就会让你更快的抢到回家的车票,然而并没有什么用,如果你自己有去手动刷过票的话,就会发现,你在12306上面看到有票但是这些抢票软件并没有给你抢到票,所以那些都是假…

用Python抢票就是不停的刷新请求购票的页面,如果有票的话,就帮你点击购买,然后在半个小时内自动付款就好。12306都有固定的放票时间段的,你在那个时间段运行抢票程序,就可以轻松抢到票了!

原理:

找到相应URL,找到控件模拟登录、查询、订票操作。关键是找到控件名称,难点是起始地不是直接输入的页面值,需要在cookie中查出。

前期准备

1)12306网站用户名和密码

2)chrome浏览器及下载chromedriver

基本环境配置

相关模块:

from splinter.browser

import Browser

from time import sleep

import traceback

import time, sys

找到用户名密码控件名

确定起始地的值,方法Chrome浏览器中的“检查”功能(按F12),Network —> Cookies中找到:

还需要手动点一下的还是万恶的12306验证码(也可以使用打码平台),抢到票后确认支付就行啦。

抢票进行中

这样就抢票成功啦!

完整代码

最后

最后多说一句,小编是一名python开发工程师,这里有我自己整理了一套最新的python系统学习教程,包括从基础的python脚本到web开发、爬虫、数据分析、数据可视化、机器学习等。学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后给大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!(文末领取

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

二、Python必备开发工具

三、Python视频合集

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

四、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。(文末领读福利

五、Python练习题

检查学习结果。

六、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。 (文末领取哦

这份完整版的Python全套学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

抢火车票这个事吧,其实我也能做!(python黑科技)

又是一年,马上就要回家过年了,还没有买到票的小伙伴们是否已经像热锅上的蚂蚁了无脑的开始找黄牛了?
技术分享图片

俗话说的好,求人不如求自己,抢票这玩意,其实我觉得我也可以~
技术分享图片

来来来,直接入正题吧!
这里有两种方案,一种是基于Selenium2的自动化框架控制浏览器实现,另一种方案则是基于Python自身的爬虫package如request,urllib等来实现,本文实现第一种方案,第二种方案也在摸索中。

实现过程

一、新版12306官网主要页面网址

https://kyfw.12306.cn/otn/resources/login.html
https://kyfw.12306.cn/otn/view/index.html
https://kyfw.12306.cn/otn/leftTicket/init?linktypeid=dc

二、浏览器驱动信息

这里使用的是chrome浏览器

在此处下载
https://sites.google.com/a/chromium.org/chromedriver/downloads

三、初始化必要信息

买票必要信息,比如乘车人,来往车站,车次类型等等

# 乘客姓名
passengers_input = ‘xxx‘
passengers = passengers_input.split(",")

#乘车日期,格式为2019-01-10
from_time = ‘2019-01-31‘

# 城市cookie字典
city_list = {
    ‘sz‘:‘%u6DF1%u5733%2CSZQ‘, #深圳
    ‘zz‘:‘%u90D1%u5DDE%2CZZF‘, #郑州
    ‘gz‘:‘%u5E7F%u5DDE%2CGZQ‘, #广州
}
# 出发站
from_station = ‘%u5E7F%u5DDE%2CGZQ‘

# 终点站
to_station = ‘%u90D1%u5DDE%2CZZF‘

# 车次编号
numbers = [‘Z90‘,‘Z190‘,‘Z14‘,‘Z168‘,‘Z98‘,‘T124‘,‘T370‘]

# 座位类型
seat_type = ‘硬卧‘

#通知邮件
receiver_email = ‘[email protected]

注意:城市字典是将城市简写和城市代码之间联系起来。如果没有你想要到城市,可以在打开12306的查票页面,然后打开浏览器的开发者模式,输入对应的城市,然后查看请求信息。

技术分享图片

四、登录功能实现

登录我们需要手动登录,扫码或者输入账号都可以。登录后记录session,供后面抢票使用


def do_login(self):
    """登录功能实现,手动识别验证码进行登录"""
    self.driver.visit(self.login_url)
    sleep(1)
    # 选择登陆方式登陆
    print(‘请扫码登陆或者账号登陆……‘)
    while True:
        if self.driver.url != self.init_my_url:
            sleep(1)
        else:
            break

五、抢票功能实现

核心功能实现,通过扫描关键字来确认是否有余票,然后实现点击页面,进而走向下一步。

current_tr = self.driver.find_by_xpath(‘//tr[@datatran="‘ + number + ‘"]/preceding-sibling::tr[1]‘)
if current_tr:
    if current_tr.find_by_tag(‘td‘)[self.seat_type_index].text == ‘--‘:
        print(‘无此座位类型出售,已结束当前刷票,请重新开启!‘)
        sys.exit(1)
    else:
        # 有票,尝试预订
        print(‘刷到票了(余票数:‘ + str(current_tr.find_by_tag(‘td‘)[self.seat_type_index].text) + ‘),开始尝试预订……‘)
        current_tr.find_by_css(‘td.no-br>a‘)[0].click()
        sleep(1)
        key_value = 1
        for p in self.passengers:
            # 选择用户
            print(‘开始选择用户……‘)
            self.driver.find_by_text(p).last.click()
            # 选择座位类型
            print(‘开始选择席别……‘)
            if self.seat_type_value != 0:
                self.driver.find_by_xpath(
                    "//select[@id=‘seatType_" + str(key_value) + "‘]/option[@value=‘" + str(
                        self.seat_type_value) + "‘]").first.click()
            key_value += 1
            sleep(0.2)
            if p[-1] == ‘)‘:
                self.driver.find_by_id(‘dialog_xsertcj_ok‘).click()
        print(‘正在提交订单……‘)
        self.driver.find_by_id(‘submitOrder_id‘).click()
        sleep(2)
        print(‘正在确认订单……‘)
        self.driver.find_by_id(‘qr_submit_id‘).click()

六、抢票成功后邮件通知自己

一个很简单的功能,不过却是必要的,避免自己错过!

def send_mail(self, receiver_address, content):
    """发送邮件通知"""
    # 连接邮箱服务器信息
    host = ‘xxxx.163.com‘
    port = 25
    sender = ‘[email protected]‘  # 你的发件邮箱号码
    pwd = ‘xxxxx‘  # 第三方授权登录吗,不是登录密码!!
    # 发件信息
    receiver = receiver_address
    body = ‘<h2>温馨提醒:</h2><p>‘ + content + ‘</p>‘
    msg = MIMEText(body, ‘html‘, _charset="utf-8")
    msg[‘subject‘] = ‘抢票成功通知!‘
    msg[‘from‘] = sender
    msg[‘to‘] = receiver
    s = smtplib.SMTP(host, port)
    # 开始登陆邮箱,并发送邮件
    s.login(sender, pwd)
    s.sendmail(sender, receiver, msg.as_string())

过程演示

  • 执行代码

技术分享图片

  • 登录12306网站

技术分享图片

  • 抢票成功

技术分享图片

  • 等待支付

技术分享图片

  • 邮件通知

技术分享图片


总结:

总的来说是成功的,但还不是完全自动化的。不过相比手动抢票还是快很多的。其实网上这种代码很多,只不过因为12306网站的更新大多数不能用了,我也是在前辈们的基础上修改完成的。想要最新源码的同学可以关注的我公众号,回复抢票源码!

以上是关于利用Python自动抢火车票真的不难,100行代码即可完成的主要内容,如果未能解决你的问题,请参考以下文章

100行代码教你教务系统自动抢课!

[转]简单的Python 火车抢票程序

源码案例

python教程入门学习自动抢票之 12306 登录篇

python学习教程,12306火车票抢票系统

抢火车票这个事吧,其实我也能做!(python黑科技)