Python实战之12306抢票

实战:12306抢票

注意:代码运行之后,需要手动使用12306APP扫码登录

代码如下:

import csv
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import Select
from selenium.common.exceptions import NoSuchElementException, ElementNotVisibleException# 为什么需要把driver放在外面作为全局变量?
# 因为如果放在里面,driver将会随着对象的销毁而被销毁
# 而我们的train的对象是放在main函数中执行的,只要main函数运行完成后,里面所有的变量将被销毁
service = Service('D:\chromedriver\chromedriver.exe')
driver = webdriver.Chrome(service=service)class train(object):# 登录界面的urllogin_url = "https://kyfw.12306.cn/otn/resources/login.html"# 个人界面的urlpersonal_url = "https://kyfw.12306.cn/otn/view/index.html"# 选择地点时间界面的urlleft_tickets = "https://kyfw.12306.cn/otn/leftTicket/init?"# 提交订单界面的urlconfirm_url = "https://kyfw.12306.cn/otn/confirmPassenger/initDc"def __init__(self, from_station, to_station, time_data, train_number, name):self.from_station = from_stationself.to_station = to_stationself.time_data = time_dataself.train_number = train_numberself.name = nameself.select_number = None# 初始化站点所对应的代号self.station_codes = {}self.init_station_code()# 先抓取所有站点的代号并保存在.csv文件中def init_station_code(self):with open("station.csv", 'r', encoding='GBK') as fp:reader = csv.DictReader(fp)for line in reader:name = line['name']code = line['code']# 获取站点的代号self.station_codes[name] = codedef login(self):driver.get(self.login_url)# 进入登录界面后用手机扫码登录,等待url变成个人中心的url,判断是否登陆成功WebDriverWait(driver, 100).until(EC.url_to_be(self.personal_url))def search_ticket(self):driver.get(self.left_tickets)# 起始站的代号设置from_station_input = driver.find_element(by=By.ID, value="fromStation")from_station_code = self.station_codes[self.from_station]driver.execute_script("arguments[0].value='%s'" % from_station_code, from_station_input)# 终点站的代号设置to_station_input = driver.find_element(by=By.ID, value="toStation")to_station_code = self.station_codes[self.to_station]driver.execute_script("arguments[0].value='%s'" % to_station_code, to_station_input)# 设置时间train_date_input = driver.find_element(by=By.ID, value="train_date")driver.execute_script("arguments[0].value='%s'" % self.time_data, train_date_input)# 执行查询操作search_btn = driver.find_element(by=By.ID, value="query_ticket")search_btn.click()# 解析车次信息WebDriverWait(driver, 1000).until(EC.presence_of_element_located((By.XPATH, "//tbody[@id='queryLeftTable']/tr")))train_trs = driver.find_elements(by=By.XPATH, value="//tbody[@id='queryLeftTable']/tr[not(@datatran)]")# 定义一个变量,当选取到所需的座位时使变量变成Truesearched = False# 当提取进入界面的时候还不可以预定车票,这时候就要一直循环,知道点击预定车票后退出循环while 1:# 获得所有车票的信息for train_tr in train_trs:infos = train_tr.text.replace("\n", " ").split(" ")number = infos[0]# 从所有车票信息中选取自己所要的车票if number in self.train_number:seat_types = self.train_number[number]for seat_type in seat_types:# 选取座位if seat_type == "O":count = infos[9]if count.isdigit() or count == "有":searched = Truebreakelif seat_type == "M":count = infos[8]if count.isdigit() or count == "有":searched = Truebreak# 找到车票后执行点击操作if searched:self.select_number = numberorder_btn = train_tr.find_element(by=By.XPATH, value=".//a[@class='btn72']")order_btn.click()# 找到车票预定后退出returndef confirm_passengers(self):# 显式等待进入提交订单的url及乘客标签显示WebDriverWait(driver, 1000).until(EC.url_contains(self.confirm_url))WebDriverWait(driver, 1000).until(EC.presence_of_element_located((By.XPATH, "//ul[@id='normal_passenger_id']/li/label")))# 确认需要购票的乘客passenger_labels = driver.find_elements(by=By.XPATH, value="//ul[@id='normal_passenger_id']/li/label")for passenger_label in passenger_labels:name = passenger_label.textif name == self.name:passenger_label.click()# 确认需要购买的席位信息(因为所在html段里含有select属性,所以需要使用Select)seat_select = Select(driver.find_element(by=By.ID, value="seatType_1"))seat_types = self.train_number[self.select_number]for seat_type in seat_types:try:seat_select.select_by_value(seat_type)except NoSuchElementException:continueelse:break# 等待提交按钮可以点击WebDriverWait(driver, 1000).until(EC.element_to_be_clickable((By.ID, "submitOrder_id")))# 点击提交订单submit_btn = driver.find_element(by=By.ID, value="submitOrder_id")submit_btn.click()# 判断对话框出现及确认按钮可以点击WebDriverWait(driver, 1000).until(EC.presence_of_element_located((By.CLASS_NAME, "dhtmlx_window_active")))WebDriverWait(driver, 1000).until(EC.element_to_be_clickable((By.ID, "qr_submit_id")))# 执行点击操作submit_btn = driver.find_element(by=By.ID, value="qr_submit_id")# 有时候会出现点击一次没反应的情况,这时候我们需要循环点击,直到退出点击所在对话框为止while submit_btn:try:submit_btn.click()submit_btn = driver.find_element(by=By.ID, value="qr_submit_id")except ElementNotVisibleException:breakdef run(self):# 1.登录self.login()# 2.车票余票查询self.search_ticket()# 3.确认乘客及车次信息self.confirm_passengers()def main():fromstation = input("请输入起始站:")tostation = input("请输入终点站:")time_train = input("请输入订购车票时间(如2022-03-16):")person = input("请输入购票人姓名:")# 传参:起始站、终点站、时间、车次及所需座位(O为二等座、M为一等座)、购票人姓名# 在spider里面手动更改自己所需的车次及座位类别spider = train(fromstation, tostation, time_train, {"D7137": ["O", "M"]}, person)spider.run()if __name__ == '__main__':main()

end 点个关注不迷路~
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/37965.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python实现12306全自动抢票

这个脚本目前只能刷一趟车的,人数可以是多个,支持选取作为类型等。 实现思路是splinter.browser模拟浏览器登陆和操作,由于12306的验证码不好自动识别,所以,验证码需要用户进行手动识别,并进行登陆操作&am…

小年到了,回家抢票太难,用Python做个脚本12306自动查票以及自动购票....

今天就是小年了,听说还有人买不到票?不要慌,今天咱们来用Python做一个自动查票抢票的脚本,24小时抢票,谁抢的过你!源码包已打包文件夹获取方式:点击这里【 Python全套资料】 即可获取。 准备工作…

C++写的12306抢票软件

写在前面的话 每年逢年过节,一票难求读者肯定不陌生。这篇文章,我们带领读者从零实现一款12306刷票软件,其核心原理还是通过发送http请求模拟登录12306网站的购票的过程,最后买到票。 郑重申明一下:这里介绍的技术仅供…

Python抢票神器

又到了一年一度的抢票大战,本来就辛苦劳累了一年,想着可以早点订到票跟家里人团聚。所以,许多人宁愿多花些钱去找黄牛买票。 但今年各种抢票软件的横行,还有官方出的加速包,导致连黄牛都不敢保证能买到票。你无奈的只能…

chatgpt赋能python:如何利用Python抢票

如何利用Python抢票 Python是一种非常流行的编程语言,可以轻松编写自动化工具。如果你想要在抢票热潮中获得胜利,这篇文章将向你展示如何使用Python编写程序来自动抢票。 抢票原理 在开始编写程序之前,我们需要了解如何抢票。抢票的原理是…

python写一个简单的12306抢票

引言 每逢过年就到了12306抢票高峰期,自己总想研究一下12306购票的流程,虽然网上已经很多资料,但是总比不过自己的亲身体会,于是便琢磨着写一个抢票软件,本人比较熟悉python,所以软件是用python写的。 使…

Python3.6实现12306火车票自动抢票(内含源码)

最近在学Python,刚好过完年啦!大家应该都需要买高铁票继续去当打工人了吧!所以用Python写了这个12306抢票脚本,分享出来,与大家共同交流和学习,有不对的地方,请大家多多指正。话不多说&#xff…

12306抢票软件实现(二)

近期好多人私信我,能不能需要分享完整代码。为了帮助大家,我以及将代码整理和教学视频我已经上传了CSDN,欢迎私信交流,共同学习共同进步:代码及视频下载地址 求给五星好评,谢谢啦 前面已经介绍了实现登录1…

用 Python 代码自动抢火车票

市场上很多火车票抢票软件大家应该非常熟悉,但很少有人研究具体是怎么实现的,所以觉得很神秘,其实很简单。下面使用Python模拟抢票程序,给大家揭秘抢票到底是怎么回事。 该代码仅供参考,主要用于大家沟通交流&#xff…

python最新抢票脚本

📋 个人简介 💖 作者简介:大家好,我是阿牛,全栈领域优质创作者。😜🎉 支持我:点赞👍收藏⭐️留言📝📣 系列专栏:python网络爬虫&…

手把手教你用python一键抢12306火车票(附代码)

哈喽,哈喽~,一年一度的抢火车票大战正式拉开序幕… 然饿大多数人碰到的是这种情况:当你满心期待摩拳擦掌准备抢票的时候,你会发现一票难求!想回趟家真难! 那么作为程序猿的你,当然要用程序猿的…

chatgpt赋能python:Python怎么抢票?

Python怎么抢票? Python是一种伟大的编程语言,因为它可以使我们的生活更加便利。有10年python编程经验的工程师会告诉你,利用Python编程可以轻松地抢到大热节目或演出的票。本文将介绍使用Python编写抢票机器人的方法。 概述 抢票机器人是…

chatgpt赋能python:Python自动抢票:让你的购票经历更加简单便捷!

Python自动抢票:让你的购票经历更加简单便捷! 随着互联网的发展,越来越多的人选择在网上购买火车、飞机等交通工具的票。但是,一些火爆的车次、航班往往在开售后仅仅几秒钟内就被抢完,让很多想出行的人非常苦恼。在这…

基于微信小程序的餐厅点餐软件设计及开发

目 录 摘要 I Abstract II 1 前言 1 1.1 选题背景 1 1.2 研究的目的和意义 1 2 相关技术简介 3 2.1 系统的实现架构 3 2.2 系统使用的技术 3 2.2.1 Eclipse 3 2.2.2 Java 4 2.2.3 MySQL简介 5 2.2.4 微信小程序简介 6 2.3 系统使用的开发环境 6 3 系统需求分析 7 3.1 功能需求 …

餐饮行业移动管理系统—Pad点餐系统

餐饮行业移动管理系统—Pad点餐系统 员工可通过PC端查询或管理饭店信息,即使更新信息,客户可以进行方便快捷的点菜操作。 功能要求: PC端功能:管理菜谱,餐厅,员工,订单信息;服务端…

基于Android移动终端的微型餐饮管理系统的设计与实现2-侧滑菜单

上周发了《 基于Android移动终端的微型餐饮管理系统的设计与实现》第一章,虽然是个简介,但是居然上了首页推荐,还有朋友评论了。写了这么久CSDN,还是第一次有人评论我的文章,真是受宠若惊,长期以来,我一直都以为,我玩的是CSDN单机版。当然,这也说明,我过去写的东西都…

安卓移动开发技术--微信界面设计

1.内容:请根据课程实现App门户界面框架设计,至少包含4个tab页,能实现tab页之间的点击切换; 2.技术:使用布局和分段,对控件进行点击监听 实现界面展示: 一.界面布局分析 1.先对button.xml界面…

移动开发--类vx界面

一、开发目标 创建一个类似vx的界面,具有vx、通讯录、发现、我 四个tab,可通过点击实现切换 二、代码解析 写4个tab,用作vx 、通讯录、发现、我四个界面 一个top.xml 一个bottom.xml 一个framelayout作为容器 mainactivity如下&#x…

【餐厅点餐平台|四】UI设计+效果展示

餐厅点餐平台导航 【餐厅点餐平台|一】项目描述需求分析 https://blog.csdn.net/weixin_46291251/article/details/126414430 【餐厅点餐平台|二】总体设计 https://blog.csdn.net/weixin_46291251/article/details/126422811 【餐厅点餐平台&#xff5…

【餐饮】智慧餐厅原型模板,餐饮APP,餐饮后台管理系统,Axure设计餐饮APP

软件版本:Axure 8.0(兼容9和10) 作品介绍: 作品包括用户端、员工端以及商户管理(后台管理) 客户端: 外卖点餐:菜品列表、菜品详情、确认订单、地址管理、修改电话、支付订单 堂食点…