简单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相关推荐

  1. python抢票代码_GitHub标星超12K,抢票神器大更新,支持候补

    掐指一算,距离国庆黄金周还有半个月的时间!你出行的车票都抢到了吗? 图片来自 pexels 根据国务院办公厅发布的关于 2019 年部分节假日安排的通知,国庆放假安排是:10 月 1 日至 7 日. ...

  2. python学习:12306火车票抢票代码公开揭秘

    火车票抢票代码公开揭秘 市场上很多火车票抢票软件大家应该非常熟悉,但很少有人研究具体是怎么实现的,所以觉得很神秘,其实很简单.下面使用Python模拟抢票程序,给大家揭秘抢票到底是怎么回事. 该代码仅 ...

  3. 12306 抢票 python + selenium + chrome (二) 基础准备的软件和材料

    我使用的 vmware 14 + ubuntu 16  +  PyCharm  开发环境 12306抢票 python+selenium+chrome 实现一 12306抢票 python+selen ...

  4. 还没抢到票吗?实测两款 GitHub 开源抢票插件,所有坑我们都帮你踩过了

    点击上方 Java后端,选择 设为星标 优质文章,及时送达 晓查 郭一璞 发自 凹非寺 量子位 报道 | 公众号 QbitAI 今天,已经可以抢过完年回来的火车票了. 如果你对自己手速和市面上的各种& ...

  5. 【python】为啥别人都能抢到票?因为他有这个抢票程序

    前言 嗨喽,大家好呀~这里是爱看美女的茜茜呐 在我们抢票得时候,总因手速不够错失良票 那么有什么办法提升我们抢到票得概率呢? 于是,我就想到了用python自动抢呀~代码不比我手速快多了 下面就给大家 ...

  6. 手把手教你用python抢票_又没抢到票?手把手教你用python抢票回家过年…

    原标题:又没抢到票?手把手教你用python抢票回家过年- 最近朋友圈刷屏:我又没抢到票!哭! 憋急,教程在此,有人愿意尝试吗? 先看看如何快速查看剩余火车票? 作者 protream 原文:http ...

  7. 12306候补购票功能怎么用?抢票软件依旧能抢到票

    实际上,铁道部开发的铁路售票及订单系统的使用及推广,已经缓解了不少购票者的压力.而为了迎合互联网的快速发展,铁路客票系统多次升级.不过,目前存在的购票人数上涨.恶意抢票及占票及屯票的现象仍然很严重,很 ...

  8. python12306买票_利用python代码写的12306订票代码

    本文实例讲述了python代码写的12306订票代码,分享给大家供大家参考. 具体实现方法如下: import datetime import json import re import sys im ...

  9. 投票功能+代码+java_JSP实现的简单Web投票程序代码

    这篇文章主要介绍了JSP实现的简单Web投票程序代码,较为详细的分析了JSP实现投票功能的具体步骤与相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下 本文实例讲述了JSP实现的简单Web投票程序. ...

最新文章

  1. 组合特征(三)tfidf(word+article+length)
  2. 启动图一键生成工具_一键即运行!清华团队推出图深度学习工具包CogDL v0.1
  3. 一定要多角度看事物 | 今日最佳
  4. Leetcode--90. 子集Ⅱ
  5. 思维 || Make It Equal
  6. 形式多样!APP引导页设计灵感
  7. autotools归纳
  8. 凸优化第八章几何问题 8.5 中心
  9. 如何制作Win10启动U盘启动盘iso镜像文件
  10. csdn官网(csdn官网免费下载)
  11. onenote2016下载地址
  12. vue emoji编辑器
  13. Smartbi报表工具二次开发和集成能力怎么样?
  14. word中快速确认字体颜色的方法
  15. vscode——记单词插件Qwerty Learner
  16. 全国各地土特产一览表
  17. JAVA EE:1~5章选择题
  18. Win10任务栏显示窗口不折叠的设置方法
  19. iPhone开发初探
  20. “三下乡”暑期社会实践|机器人教育进社区(二)

热门文章

  1. 计算机中的信息表示 ppt模板,第2章 计算机中信息的表示方法.ppt.Convertor
  2. 《计算机考研-机试指南》- 3数学问题
  3. 行政审批系统建设的思考
  4. Lighthousenbsp;Partners赞助的区…
  5. 纸张多少克代表什么意思
  6. 计算机组成原理在线测试,计算机组成原理第01章在线测试
  7. 无法打开opencv_core.dll
  8. 谷歌zxing 二维码后台生成,并在前端展示以及下载
  9. wampserver3.2.3
  10. 城市量化研究-PM2.5数据分析-数据获取