文档章节

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

opsonly
 opsonly
发布于 01/11 10:14
字数 1071
阅读 68
收藏 7

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

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

来来来,直接入正题吧! 这里有两种方案,一种是基于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 = 'xxxxxxxxx@163.com'

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

image.png

四、登录功能实现

登录我们需要手动登录,扫码或者输入账号都可以。登录后记录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 = 'xxxxxx@163.com'  # 你的发件邮箱号码
    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网站的更新大多数不能用了,我也是在前辈们的基础上修改完成的。想要最新源码的同学可以关注的我公众号,回复抢票源码!

© 著作权归作者所有

opsonly
粉丝 0
博文 7
码字总数 8286
作品 0
深圳
运维
私信 提问
春运渡劫!Python给我抢回家的火车票

简介:本文首发于个人公众号「视学算法」,作者阿广,一个专注于大数据、人工智能和算法的学习平台,也是一个保送中科院软件研究所直博生的自留地。人生苦短,我愿做您最忠实的技术支持伙伴!...

AI科技大本营
2018/12/28
0
0
Python实用教学:如何用Python玩转各大网站

Hi~,各位小伙伴,Python是目前编程语言中的主流语言之一,也是公认最容易入门的编程语言,因为Python语言近几年的火爆,有很多小伙伴都开始学习这门语言。 编程语言学习,最重要的是“多看代...

W3Cschool小编
2018/07/31
0
0
春运抢票靠加速包?试试这个 Python 开源项目吧

作者 | 非主流 出品 | Python大本营 又是一年春运,又到了拼手速、拼人品的时刻。 然而随着抢票软件的日益流行,拼加速包已经成为新的流行趋势。不过花钱买来的加速包真的有用吗? 《工人日报...

CSDN资讯
01/07
0
0
是程序员就用Python查12306的票

0.环境 操作系统:WindowsPython版本:3.5.2 1.前言 当你想查询一下火车票信息的时候,你还在上 12306 官网吗?或是打开你手机里的 APP?下面让我们来用 Python 写一个命令行版的火车票查看器...

上海小胖
03/09
0
0
Python3.6实现12306火车票自动抢票,附源码

Python(发音:英[?pa?θ?n],美[?pa?θɑ:n]),是一种面向对象、直译式电脑编程语言,也是一种功能强大的通用型语言,已经具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理...

猫咪编程
2018/06/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

日志相关---日志配置和过滤器

一、log4j日志简介 1.1、 Loggers 级别和介绍 Loggers组件在此系统中被分为八个级别:ALL、TRANCE、DEBUG、INFO、WARN、ERROR和FATAL、OFF。这八个级别是有顺序的, ##off表示关闭ALL < T...

spinachgit
21分钟前
1
0
六个面试题层层剖析——LongAddr原子类

并发编程面试题 (1)LongAddr的结构是怎样的? (2)当前线程应该访问Cell数组里面的哪一个Cell元素? (3)如何初始化Cell数组? (4)Cell数组如何扩容? (5)线程访问分配的Cell元素有冲...

须臾之余
22分钟前
4
0
MySQL-入门(二)

本部分主要是MySQL的常用函数和高级用法。 一、MySQL排序 排序关键字:order by 排序字段。后面写上要排序字段,排序字段可以有多个,多个采用逗号间隔,order by默认采用升序(asc)排序,可...

潜行-L
33分钟前
3
0
BAM转VCF的方法对比

1 使用GATK HaplotypeCaller #java -jar gatk.jar HaplotypeCaller --native-pair-hmm-threads 4 -R xx.fa -I xx.bam -O xx.vcf --native-pair-hmm-threads用来设置多线程,默认为4线程 2 sa......

悲催的古灵武士
41分钟前
1
0
软件架构设计原则之“KISS”的总结使用

今天聊一聊软件架构设计中的 KISS 原则。 对! 就是亲嘴的那个 “KISS”! 一定要多练习。 ... ... ... ... 作为一个程序员我是推荐理解为“亲嘴”的,可以很好的解决单身问题,但作为一个架...

Owen_Jia
44分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部