首页/新闻资讯/正文
Python打造高效12306火车票查询与抢票系统,春运购票不再难

 2025年04月13日  阅读 16

摘要:实现火车票查询与抢票系统实战教程引言每年春运时,有无数游子都心系着家乡,可因为一票难求的状况而感到焦虑。中国铁路客户服务中心的官方网站,它承载着亿万旅客的购票需求。然而,在面对庞大的客流以及有限的票源时,通过手动去抢票通常会感到力不从心。今天,我们要借助这个...

实现火车票查询与抢票系统实战教程引言

每年春运时,有无数游子都心系着家乡,可因为一票难求的状况而感到焦虑。中国铁路客户服务中心的官方网站,它承载着亿万旅客的购票需求。然而,在面对庞大的客流以及有限的票源时,通过手动去抢票通常会感到力不从心。今天,我们要借助这个编程方面的利器,去打造一个能够高效进行火车票查询以及抢票的系统,以此来帮助你轻松地应对春运购票过程中遇到的难题。

一、项目背景与需求分析

项目背景

需求分析

二、技术选型与准备工作

技术选型

准备工作

三、系统设计与实现

系统架构

功能模块

代码实现

(1)余票查询模块

   import requests
   import json
使用 PrettyTable 库。
定义一个函数 query_tickets,它需要传入出发站 from_station、到达站 to_station 和日期 date 作为参数。
url 等于 "https://kyfw.12306.cn/otn/leftTicket/query" ,然后加上 "?leftTicketDTO.train_date=" 与 date 拼接 ,再加上 "&leftTicketDTO.from_station=" 与 from_station 拼接 ,接着加上 "&leftTicketDTO.to_station=" 与 to_station 拼接 ,最后加上 "&purpose_codes=ADULT" 。
       response = requests.get(url)
使用 response.text 并将其解析为 JSON 数据,得到的结果赋值给 result 。
获取结果中的数据部分,再从数据部分获取结果
   def display_tickets(tickets):
table 拥有['车次', '出发站', '到达站', '出发时间', '到达时间', '一等座', '二等座']这些列名。
       for ticket in tickets:
           info = ticket.split('|')
table 向其中添加一行,该行包含的元素分别为 info[3]、info[6]、info[7]、info[8]、info[9]、info[31]、info[30]
       print(table)
   if __name__ == '__main__':
       from_station = '深圳'
       to_station = '北京'
       date = '2024-01-23'
通过 from_station、to_station 和 date 来查询获取 tickets
       display_tickets(tickets)

(2)抢票模块

火车票查询12306免费_火车票查询12306时刻查询_12306火车票查询

使用 selenium 库中的 webdriver 模块。
在 selenium.webdriver.common.by 模块中导入 By 类。
从 selenium 的 webdriver 中的 common 模块的 keys 里导入 Keys
   import time
如果要定义一个名为 login 的函数,它接受两个参数,分别是 username 和 password 。
driver 打开了 'https://kyfw.12306.cn/otn/login/init' 这个链接。
然后该元素发送输入值 username。
driver 找到具有 ID 为 'password' 的元素,然后向该元素发送密码(password)。
通过 ID 为 'loginSub' 的元素,驱动程序找到该元素并点击它。
       time.sleep(5)
函数名为 buy_ticket,它接收 from_station 作为出发站,to_station 作为到达站,date 作为日期,train_no 作为车次。
driver 获取 'https://kyfw.12306.cn/otn/leftTicket/init' 这个链接
然后该元素发送输入内容 from_station 。
driver 找到 ID 为 'toStationText' 的元素,然后向其发送输入内容 to_station
然后将该元素清空。
driver 找到具有 ID 为“train_date”的元素,然后向其发送键值 date 。
driver 找到具有 ID 为“query_ticket”的元素并点击它。
       time.sleep(3)
driver 找到通过 XPath 定位的元素,该元素包含文本内容为 train_no 的 a 标签,然后点击这个 a 标签。
       time.sleep(3)
然后点击该元素。
       time.sleep(3)
driver 去查找具有指定 ID('qr_submit_id')的元素,然后点击该元素。
   if __name__ == '__main__':
       driver = webdriver.Chrome()
       username = 'your_username'
       password = 'your_password'
       from_station = '深圳'
       to_station = '北京'
       date = '2024-01-23'
       train_no = 'G101'
       login(username, password)

12306火车票查询_火车票查询12306免费_火车票查询12306时刻查询

从某个车站购买车票,前往另一个车站,在特定日期,乘坐特定车次的车票,即 buy_ticket(from_station, to_station, date, train_no)

(3)智能候补模块

   def smart_houbu():
       # 逻辑实现略
       pass

(4)通知模块

   import smtplib
邮件的 MIME 文本部分是 MIMEText 。
定义一个函数用于发送邮件,函数名为 send_email,该函数接收三个参数,分别是主题 subject、内容 content 和收件人邮箱 to_email。
       msg = MIMEText(content)
       msg['Subject'] = subject
       msg['From'] = 'your_email'
       msg['To'] = to_email
服务器 = smtplib.SMTP('smtp.your_email.com', 587)
       server.starttls()
服务器执行登录操作,使用的邮箱是“your_email”,使用的密码是“your_password”。
服务器发送邮件,发送对象为“your_email”,接收对象为 to_email,邮件内容为 msg.as_string()
       server.quit()
   if __name__ == '__main__':
调用 send_email 函数,传入参数“抢票成功通知”“您已成功抢到车票!”以及“recipient_email”,用于发送相关通知。

四、系统测试与优化

功能测试

性能优化

稳定性提升

五、总结与展望

本教程让我们成功打造了一个基于的火车票查询与抢票系统。这个系统有自动查询的功能,能智能抢票,还能通过邮件通知。它极大提升了购票效率与成功率。未来,我们能够进一步对系统进行优化,增添多账号管理、自动打码验证等更多实用功能,让系统更完善且更强大。

希望这个系统能在春运期间助力你顺利抢到回家的车票,以便与家人团聚。若你有任何问题或建议,欢迎在评论区留言进行交流。

参考文献

本文提供的代码只是个示例,实际使用时要依据网站的最新状况进行调整。同时要遵守相关的法律法规,并且要合理地使用抢票工具。

版权声明:本文为 “博览广文网” 原创文章,转载请附上原文出处链接及本声明;

原文链接:http://wen.bjhwtx.com/post/20069.html

标签:

博览广文网

博览广文网为所有文学爱好者、新闻爱好者、关注生活多方面内容的观众朋友提供多方位的内容呈现、提升阅读空间、填充碎片时间,开阔读者的视野、增长见识、了解民生、一个让您不出户尽知天下事的网站平台!
热门标签
关于我们
广文舒阅网—让天下读者有家可归!这里汇聚了各类优质文化信息,无论是全球热点、历史故事,还是实用百科、趣味探索,您都能轻松获取。我们希望用阅读点亮您的世界,让每一次浏览都充满收获和乐趣。
导航栏A标题
广文舒阅网
扫码关注
联系方式
全国服务热线:0755-88186625
Q Q:8705332
Email:admin@lanyu.com
地址:深圳市福田区海雅缤纷国际大厦5层501
Copyright 深圳市蓝宇科技有限公司 版权所有 备案号:京ICP备20013102号-1