简单抢铁路票代码-selenium
简单12306抢票代码
- 利用selenium进行抢票
- 知识点selenium
- ‘stations.csv’ 文件,就是目前你铁路开设的站点和他们代码信息,通过代码将站点信息传送给网页,文件链接,提取码:je47
- 初始化站点:因为出发点和目的地的值是有固定选项的,而传的值value是有独特的代码,所以我们要找到全部代码,能满足将中文输入的地址,返回相应的代码,同时该标签是hidden类型,不能直接用send_keys()
- 但是selenium速度慢,如果追求速度更快的话还是找到动态网页的接口更好
import csv
from selenium import webdriver
import time
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.support.ui import Selectdriver = webdriver.Chrome()# 面向对象来实现 哪一个方面需要补充了 复习了 总结了 踏踏实实
# 类是一个创建对象的对象 希望必须做一些事情 不做这个类就创建不成功 0 - 1 1 -2 1 -100
class TrainSpider(object):login_url = 'https://kyfw.12306.cn/otn/resources/login.html' # 登录的urlpersonal_url = 'https://kyfw.12306.cn/otn/view/index.html' # 个人中心的urlleft_ticket_url = 'https://kyfw.12306.cn/otn/leftTicket/init?linktypeid=dc' # 车次以及余票查询confirm_passenger_url = 'https://kyfw.12306.cn/otn/confirmPassenger/initDc' # 乘客信息def __init__(self,from_station,to_station,train_data,trains,passengers):''':param from_station: 出发地:param to_station: 目的地:param train_data: 出发日期:param trains: 车次以及席位 {"G69":['O','M']}:param passengers: 乘客 ['结衣','张三']'''self.from_station = from_stationself.to_station = to_stationself.train_data = train_dataself.trains = trainsself.passengers = passengersself.selected_number = Noneself. station_codes = {}self.init_station_code()# 初始化站点的方法def init_station_code(self):with open('stations.csv', 'r', encoding='utf-8') as file_obj:reader = csv.DictReader(file_obj)for line in reader:name = line['name']code = line['code']self.station_codes[name] = codedef login(self):driver.get(self.login_url)# 登录也是一个耗时的操作WebDriverWait(driver, 1000).until(EC.url_contains(self.personal_url))print('登录成功!')def search_left_ticket(self):# 取消弹框driver.get(self.left_ticket_url)driver.implicitly_wait(3)driver.find_element_by_id('gb_closeDefaultWarningWindowDialog_id').click()# 设置出发地 type="hidden" ,所以要用execute_script执行传值,1 先找到标签 2 在获取值 3 把值设置进去# 选择框的标签<input id="fromStation" type="hidden" value="BJP" name="leftTicketDTO.from_station"> from_station_input = driver.find_element_by_id('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_id('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_id('train_date')driver.execute_script('arguments[0].value="%s"' % self.train_data, train_date_input)time.sleep(3)# 点击查询(查票)search_btn = driver.find_element_by_id('query_ticket')# 按钮不能够被点击driver.execute_script('arguments[0].click()', search_btn)# 解析车次信息WebDriverWait(driver, 1000).until(EC.presence_of_element_located((By.XPATH,'//tbody[@id="queryLeftTable"]/tr')))# 获取车次列表 过滤没有用的tr标签 datatran 右键xpath也可以train_trs = driver.find_elements_by_xpath('//tbody[@id="queryLeftTable"]/tr[not(@datatran)]')is_searched = Falsefor train_tr in train_trs:# 今天这个BUG 我们是通过try语句解决的 问题是没有退出循序 继续点击预定了# try:infos = train_tr.text.replace('\n',' ').split(' ')# print(infos)number = infos[0] # 车次# 判断if number in self.trains:seat_types = self.trains[number] # 根据字典的key来获取票for seat_type in seat_types:if seat_type == 'O':count = infos[9] # 二等座if count == '有' or count.isdigit():# 点击预定is_searched = Truebreakelif seat_type == 'M':count = infos[8] # 一等座if count == '有' or count.isdigit():is_searched = Truebreakif is_searched:time.sleep(2)self.selected_number = numberorder_btn = train_tr.find_element_by_xpath(".//a[@class='btn72']")order_btn.click()break# except:# passdef confirm_passengers(self):WebDriverWait(driver, 1000).until(EC.url_contains(self.confirm_passenger_url))# 我这次先注释# WebDriverWait(driver, 1000).until(# EC.presence_of_element_located((By.XPATH,"//ul[@id='normal_passenger_id']/li/label"))# )# time.sleep(3)# 确认需要购票的乘客passenger_labels = driver.find_elements_by_xpath("//ul[@id='normal_passenger_id']/li/label")for passenger_label in passenger_labels:name = passenger_label.textprint(name)if name in self.passengers:passenger_label.click()# 确认购买的席位 Select下拉框选择# 这里选择座位类型的标签是select,先设置Select()对象seat_select = Select(driver.find_element_by_id('seatType_1')) # self.trains就是{"G485":['O','M']},seat_types就是['O','M']seat_types = self.trains[self.selected_number] for seat_type in seat_types:try:# 根据要选择的的座位类型在下拉框是否可以选择seat_select.select_by_value(seat_type)except NoSuchElementException:continueelse:break# 提交订单submit_btn = driver.find_element_by_id('submitOrder_id')submit_btn.click()# 核对信息dhtmlx_window_active 等待核对信息窗口加载出来即可WebDriverWait(driver, 1000).until(EC.presence_of_element_located((By.CLASS_NAME, 'dhtmlx_window_active')))# 点击按钮# time.sleep(3)s_btn = driver.find_element_by_id('qr_submit_id')s_btn.click()# 封装了我们基本的功能def run(self):# 登录self.login()# 车次以及余票查询self.search_left_ticket()# 确认乘客信息self.confirm_passengers()def main():spider = TrainSpider('北京','长沙','2021-05-26',{"G485":['O','M']},['张三'])spider.run()# 日期格式需要注意2021-05-19## 出发地与目的地都必须按照规定的有的站点填写## O是二等座,M是一等座,9是商务座,另外1是硬座,2是软座,3是硬卧,4是软卧,6 高级软卧,列表的顺序就是购票选择的顺序if __name__ == '__main__':main()
简单抢铁路票代码-selenium相关推荐
- python抢票代码_GitHub标星超12K,抢票神器大更新,支持候补
掐指一算,距离国庆黄金周还有半个月的时间!你出行的车票都抢到了吗? 图片来自 pexels 根据国务院办公厅发布的关于 2019 年部分节假日安排的通知,国庆放假安排是:10 月 1 日至 7 日. ...
- python学习:12306火车票抢票代码公开揭秘
火车票抢票代码公开揭秘 市场上很多火车票抢票软件大家应该非常熟悉,但很少有人研究具体是怎么实现的,所以觉得很神秘,其实很简单.下面使用Python模拟抢票程序,给大家揭秘抢票到底是怎么回事. 该代码仅 ...
- 12306 抢票 python + selenium + chrome (二) 基础准备的软件和材料
我使用的 vmware 14 + ubuntu 16 + PyCharm 开发环境 12306抢票 python+selenium+chrome 实现一 12306抢票 python+selen ...
- 还没抢到票吗?实测两款 GitHub 开源抢票插件,所有坑我们都帮你踩过了
点击上方 Java后端,选择 设为星标 优质文章,及时送达 晓查 郭一璞 发自 凹非寺 量子位 报道 | 公众号 QbitAI 今天,已经可以抢过完年回来的火车票了. 如果你对自己手速和市面上的各种& ...
- 【python】为啥别人都能抢到票?因为他有这个抢票程序
前言 嗨喽,大家好呀~这里是爱看美女的茜茜呐 在我们抢票得时候,总因手速不够错失良票 那么有什么办法提升我们抢到票得概率呢? 于是,我就想到了用python自动抢呀~代码不比我手速快多了 下面就给大家 ...
- 手把手教你用python抢票_又没抢到票?手把手教你用python抢票回家过年…
原标题:又没抢到票?手把手教你用python抢票回家过年- 最近朋友圈刷屏:我又没抢到票!哭! 憋急,教程在此,有人愿意尝试吗? 先看看如何快速查看剩余火车票? 作者 protream 原文:http ...
- 12306候补购票功能怎么用?抢票软件依旧能抢到票
实际上,铁道部开发的铁路售票及订单系统的使用及推广,已经缓解了不少购票者的压力.而为了迎合互联网的快速发展,铁路客票系统多次升级.不过,目前存在的购票人数上涨.恶意抢票及占票及屯票的现象仍然很严重,很 ...
- python12306买票_利用python代码写的12306订票代码
本文实例讲述了python代码写的12306订票代码,分享给大家供大家参考. 具体实现方法如下: import datetime import json import re import sys im ...
- 投票功能+代码+java_JSP实现的简单Web投票程序代码
这篇文章主要介绍了JSP实现的简单Web投票程序代码,较为详细的分析了JSP实现投票功能的具体步骤与相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下 本文实例讲述了JSP实现的简单Web投票程序. ...
最新文章
- 组合特征(三)tfidf(word+article+length)
- 启动图一键生成工具_一键即运行!清华团队推出图深度学习工具包CogDL v0.1
- 一定要多角度看事物 | 今日最佳
- Leetcode--90. 子集Ⅱ
- 思维 || Make It Equal
- 形式多样!APP引导页设计灵感
- autotools归纳
- 凸优化第八章几何问题 8.5 中心
- 如何制作Win10启动U盘启动盘iso镜像文件
- csdn官网(csdn官网免费下载)
- onenote2016下载地址
- vue emoji编辑器
- Smartbi报表工具二次开发和集成能力怎么样?
- word中快速确认字体颜色的方法
- vscode——记单词插件Qwerty Learner
- 全国各地土特产一览表
- JAVA EE:1~5章选择题
- Win10任务栏显示窗口不折叠的设置方法
- iPhone开发初探
- “三下乡”暑期社会实践|机器人教育进社区(二)