Python:基于Python爬虫技术的抢票程序及其实现

article/2025/8/22 9:04:35

临近放假,相信我们每天都在群聊里或者朋友圈看到一些帮忙抢火车票的信息。看到朋友们抢回家的车票这么辛(bei)苦(can),结合圈里一些前辈的指点,抱着学习的心态用Python做了一个简单的自动化抢票程序,抢到票之后通过绑定的邮箱(比如QQ)发通知。下面分享主要内容:

版本号 Python 3.6.5

编译器 PyCharm PRO 2018.1

浏览器 Google Chrome 71.0.3

在这里插入图片描述

首先,我们用到一个Splinter库:

相信做自动化测试、自动化爬虫的朋友都知道Selenium工具,它可以把人为驱动行为转化为机器执行,Splinter的药效跟它是一样的。我们可以进去cmd后用 pip install splinter

这个命令来安装。

然后,开始使劲地码:

在这里插入图片描述

1. 定义自动购票的类(初始化属性)

class Buy_Tickets(object):# 定义实例属性,初始化def __init__(self, username, passwd, order, passengers, dtime, starts, ends):self.username = usernameself.passwd = passwdself.order = order # 车次,0代表所有车次self.passengers = passengers # 乘客名self.starts = starts # 起始地和终点self.ends = endsself.dtime = dtime # 日期self.login_url = 'https://kyfw.12306.cn/otn/login/init'self.initMy_url = 'https://kyfw.12306.cn/otn/view/index.html'self.ticket_url = 'https://kyfw.12306.cn/otn/leftTicket/init'self.driver_name = 'chrome'self.executable_path = 'C:\python\chromedriver.exe'

2. 实现登录功能

def login(self):self.driver.visit(self.login_url)self.driver.fill('loginUserDTO.user_name', self.username)# sleep(1)self.driver.fill('userDTO.password', self.passwd)# sleep(1)print('请输入验证码...')while True:if self.driver.url != self.initMy_url:sleep(1)else:break

3. 实现购票功能

def start_buy(self):self.driver = Browser(driver_name=self.driver_name, executable_path=self.executable_path)# 窗口大小的操作self.driver.driver.set_window_size(1200, 700)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 = 0if self.order != 0:while self.driver.url == self.ticket_url:self.driver.find_by_text('查询').click()count += 1print('第%d次点击查询...' % count)try:self.driver.find_by_text('预订')[self.order - 1].click()sleep(1.5)except Exception as e:print(e)print('预订失败...')continue

在这里插入图片描述

4. 邮箱通知付款

def sendMail(self, mail_title, mail_content):my_sender = 'xxx@qq.com' # 发件人邮箱账号my_user = 'xxxx@qq.com' # 收件人邮箱账号try:'''发送邮件'''msg = MIMEText(mail_content, "plain", 'utf-8') # 发送邮件内容msg["Subject"] = Header(mail_title, 'utf-8') # 发送邮件主题/标题msg["From"] = formataddr(['Bruce pk', my_sender]) # 邮件发送方msg["To"] = formataddr(['brucepk', my_user]) # 邮件接收方s = smtplib.SMTP("smtp.qq.com", 25) # 邮箱的传输协议,端口默认25s.login(my_sender, 'xxxxx') # 登录邮箱,这里的第二个参数为qq邮箱授权码,不要填你的登录密码s.sendmail(my_sender, [my_user, ], msg.as_string()) # 发送方,接收方,发送消息s.quit() # 退出邮箱print("抢票通知邮件发送成功!")except Exception:print("邮件发送失败~~")

还有,网络不好或者12306的服务器不稳定的时候,就会卡住,针对这种情况,系统会重复查询:

else:while self.driver.url == self.ticket_url:self.driver.find_by_text('查询').click()count += 1print('第%d次点击查询...' % count)try:for i in self.driver.find_by_text('预订'):i.click()sleep(1)except Exception as e:print(e)print('预订失败...')continueprint('开始预订...')sleep(1)print('开始选择用户...')for p in self.passengers:self.driver.find_by_text(p).last.click()sleep(0.5)if p[-1] == ')':self.driver.find_by_id('dialog_xsertcj_ok').click()sleep(3)print('提交订单...')self.driver.find_by_id('submitOrder_id').click()sleep(5)print('确认选座...')self.driver.find_by_id('qr_submit_id').click()print('预订成功...')sleep(5)self.sendMail(mail_title, mail_content)except Exception as e:print(e)

关于Python技术储备

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

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

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

二、学习软件

工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。

三、入门学习视频

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

四、实战案例

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

五、面试资料

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


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


http://chatgpt.dhexx.cn/article/JwyYQYEx.shtml

相关文章

想去看演唱却总是抢不到票?教你用Python制作一个自动抢票脚本

前言 嗨喽!大家好,这里是魔王!! 大麦网,是中国综合类现场娱乐票务营销平台,业务覆盖演唱会、 话剧、音乐剧、体育赛事等领域。 但是因为票数有限,还有黄牛们不能丢了饭碗,所以导致…

大麦演唱会为什么总抢不到票?抢票完整教程、详细步骤

文章目录 1.在浏览器上安装脚本管理器 1.登录网址Tampermonkey • Home 2.选择对应浏览器的版本,并安装。 这里以edge浏览器作为示范​编辑 2.在油猴脚本管理器中搜索脚本 2.1注意右上角的更新,点击获取新脚本。 2.2 在此页面搜索“大麦抢票” 3.安…

程序员的我是如何抢票的(Python)

马上就要回家过年了,你的票买好了吗。 虽然我不用抢票,但是还是研究了一下怎么抢票。 程序员嘛,就是要对一切问题进行解构,探索原理本质,寻找规律,将其自动化。。。 好了,言归正传,开…

12306 抢票系列之只要搞定RAIL_DEVICEID的来源,从此抢票不再掉线(上)

郑重声明: 本文仅供学习使用,禁止用于非法用途,否则后果自负,如有侵权,烦请告知删除,谢谢合作! 开篇明义 本文针对自主开发的抢票脚本在抢票过程中常常遇到的请求无效等问题,简单分析了 12306 网站的前端加密算法,更准确的说,是探究 RAIL_DEVICEID 的生成过程. 因为该 cookie…

技术宅---我的网上抢火车票攻略

写在前面 写这篇文章的起因是今天在12306上买火车票时,被这牛逼的网站给震撼到了,靠,牛叉得让人无语的用户体验啊。就讲讲我是如何利用一个小工具做辅助,幸运地抢到了回家的卧铺票的。希望能给有需要的兄弟们做个参考。 回顾下我今…

初学者怎么学java编程 ,小白们看过来吧

推荐一个java《学习》交流 群523401738每天晚上都有一个Java技术学习课,会有老师分享干货,帮助大家分析解答问题 一、java分为三大方向: CS架构(java se)。BS架构(java web)。java手机开发(java me&#…

自学 Java 怎么入门?

自学会碰到的问题 自学可以省不少的钱, 可是自学会碰到很多问题。 我再自学的过程中找到了一个Java自学的网站(Java全栈工程师 | 以实例驱动学习 | how2j.cn),试图解决一些自学中会碰到的问题。 1. 框架、思路、原理 一下子涌进来太多,弄不明…

Java 技术新手入门

Java 技术新手入门 什么是 Java 技术?Java 技术为什么重要?什么是 Java 组件技术?Java 技术如何与 Web 服务联系起来?如何提高 Java 编程技巧?Java 编程人员可以使用哪些 IBM 工具和产品? developerWorks J…

java基础编程入门教程,2022最新

Java学习到什么程度可以找第一份工作自己买了本Java从入门到精通。以为可以很快地学完,非CS专业。现在我想说所有系列的从入门到精通都是垃圾,一年多来,我每天白天看视频,晚上敲代码到凌晨,我是一个很倔的人,我认为天下没有任何东西是人类学不会的,所以我就付出高三一样的时间去…

新手小白入门编程第3讲 JAVA入门案例

1 HelloWorld案例 1.1 工作空间设置 工作空间就是一个文件夹,用来保存我们所有的开发文件和代码等等. 工作空间也是可以切换的,但是切换了工作空间,我们对于eclipse的设置就重置了. 后续我们自己写的代码可以去这个位置找到.可以如下图,选择工作空间的存放目录 1.2 eclipse…

Java编程学习入门、Java语言学习、Java入门必看

一、初识Java 1.生活中的程序: 从起床到教室上课的过程 穿衣打扮》起床》洗漱》出宿舍》》吃早餐》到教室 按照特定的顺序去完成某一件事的过程我们叫做生活中的程序 2.计算机中的程序: 一组有序指令的集合,需要和计算机交流就要使用计算机语言,ja…

关于1970年之前的时间要怎么转换成时间戳啊 负数要怎么处理

在这里有的人可能有疑问? 大家都知道java时间戳是从1970年1月1日0时0分0秒开始计算的,那么假如1960年的时间戳应该是多少呢? 下面是答案,负数,通过负数一样可以转化成正常的时间 年月日。 -3026880001960-05-30 00:00

moment.JS时间戳转换总是1970年问题

把时间戳 ✖1000 即可解决 例子moment(date * 1000).format(‘YYYY-MM-DD’); 还可以这样

mysql查询1970年以后出生的人_阴阳五行分析:1970年出生的人是什么命?

农历1970年出生的人属狗,此年出生的人不应好高骛远,把握当下幸福的生活。我们常说“听天由命”,所谓的命运早就已经刻画在了你的五行中,五行算命也就有迹可循。 那么,本期一起来看看1970年出生的人是什么命&#xff1f…

mysql 日期 1970_Mysql中处理1970年前的日期(unixtime为负数的情况)负数时间戳格式化...

客户扔过来一个bug,说是一个系统中对42岁以上的人的统计不正确,而41岁以下的人没有问题。眼睛瞟了一下托盘区里的日期,2012年3月26日,嗯,今年42岁的话,那么应该就是出生在1970年左右,马上就把问…

C语言里的fabs()和sqrt()的含义

fabs()其实是指绝对值&#xff0c;例如fabs(a)就是指a的绝对值&#xff0c;在程序中使用的时候需要包含头文件<math.h>。而sqrt()是指开根号&#xff0c;例如sqrt(a)就是指根号a。 举个例子&#xff1a; 假如从键盘任意输入a&#xff0c;b&#xff0c;e的值&#xff0c;编…

求绝对值指针c语言,C语言实现abs和fabs绝对值

C语言 abs() 函数用于求整数的绝对值。 头文件&#xff1a;math.h 或者 stdlib.h 语法/原型&#xff1a; int abs(int n); n 表示要求绝对值的数。 返回值&#xff1a;参数的绝对值。 【实例1】使用 abs() 函数求整数 3 和 -4 的绝对值。 #include #include int main() { int a…

c语言中fabs是什么意思,c语言fabs是什么意思_后端开发

C语言sqrt函数的用法_后端开发 C语言中sqrt函数用于计算一个非负实数的平方根&#xff0c;使用时需要在头部引入math.h文件&#xff0c;用法示例&#xff1a;sqrt(25)&#xff0c;程序将返回5。 c语言fabs是什么意思&#xff1f; fabs函数是一个求绝对值的函数&#xff0c;求出…

c语言中fabs是什么意思,c语言fabs是什么意思

c语言fabs是什么意思&#xff1f; fabs函数是一个求绝对值的函数&#xff0c;求出x的绝对值&#xff0c;和数学上的概念相同&#xff0c;函数原型是extern float fabs(float x)&#xff0c;用法是#include 。 推荐学习&#xff1a;c语言视频教程 fabs()函数的声明&#xff1a;d…

c语言fabs函数的返回值,fabs()函数

fabs函数是一个求绝对值的函数&#xff0c;求出x的绝对值&#xff0c;和数学上的概念相同&#xff0c;函数原型是extern float fabs(float x)&#xff0c;用法是#include 。 C语言中fabs()函数&#xff1a; (1)描述&#xff1a;C库函数double fabs(double x) &#xff0c;返回浮…