当其它抢票软件不起作用的时候,是另一个保障

from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException, ElementNotVisibleException
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.webdriver.support.ui import Select
import csv# 为什么需要把dirver放在外面?
# 因为如果放在里面,那么driver将会随着对象的销毁而销毁
# 而我们的TrainSpider的对象是放在main函数中执行的,
# 只要main函数运行完成后,里面所有的变量都不会被销毁,
# 也就是说spider也会被销毁,那么spider里面的driver也会被销毁
driver = webdriver.Chrome(executable_path='E:\pyspiderapp\chromedriver87.exe')class TrainSpider(object):login_url = "https://kyfw.12306.cn/otn/resources/login.html"person_url = "https://kyfw.12306.cn/otn/view/index.html"left_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_date,trains,passengers):""":param from_station: 起始站:param to_station:  目的站:param train_date: 出发日期:param trains: 需要购买的车次  {"D3008":["O","M"]}:param passengers: 乘客的姓名,需要为一个列表"""self.from_station = from_stationself.to_station = to_stationself.train_date = train_dateself.trains = trainsself.passengers = passengersself.selected_number = None# self.driver = webdriver.Chrome(executable_path='E:\pyspiderapp\chromedriver87.exe')#初始化站点所对应的代号self.station_codes = {}self.init_station_code()def init_station_code(self):with open("stations.csv", 'r', encoding='utf-8') 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,1000).until(EC.url_to_be(self.person_url))print("登录成功")def search_left_ticket(self):driver.get(self.left_ticket_url)#起始站的代号设置from_station_input = driver.find_element_by_id("fromStation")from_station_code = self.station_codes[self.from_station]#将from_station_input标签里的value的值改为from_station_code的值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_date, train_date_input)#执行查询操作search_btn = driver.find_element_by_id("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_xpath("//tbody[@id='queryLeftTable']/tr[not(@datatran)]")is_searched = Falsewhile True:for train_tr in train_trs:infos = train_tr.text.replace("\n", " ").split(" ")number = infos[0]if number in self.trains:seat_types = self.trains[number]for seat_type in seat_types:if seat_type == "O":# 二等座count = infos[9]if count.isdigit() or count == '有':is_searched = Truebreakelif seat_type == "M":# 一等座count = infos[8]if count.isdigit() or count == '有':is_searched = Truebreakif is_searched:self.selected_number = numberorder_btn = train_tr.find_element_by_xpath(".//a[@class='btn72']")order_btn.click()returndef confirm_passengers(self):WebDriverWait(driver,1000).until(EC.url_to_be(self.confirm_passenger_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_xpath("//ul[@id='normal_passenger_id']//li/label")for passenger_label in passenger_labels:name = passenger_label.textif name in self.passengers:passenger_label.click()#确认需要购买的席位信息seat_select = Select(driver.find_element_by_id("seatType_1"))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#等待提交按钮可以被点击WebDriverWait(driver,1000).until(EC.presence_of_element_located((By.ID,"submitOrder_id")))submit_btn = driver.find_element_by_id("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")))comfirm_submit_btn = driver.find_element_by_id('qr_submit_id')while comfirm_submit_btn:try:comfirm_submit_btn.click()comfirm_submit_btn = driver.find_element_by_id('qr_submit_id')except ElementNotVisibleException:breakprint()def run(self):# 1.登录self.login()# 2.车次余票查询self.search_left_ticket()# 3.确认乘客和车次信息self.confirm_passengers()def main():spider = TrainSpider("荆州","苏州","2020-12-12",{"D3008":["O","M"]},["刘友权"])spider.run()if __name__ == '__main__':main()

12306半自动抢票相关推荐

  1. python编写12306窗体抢票软件(二)

    python编写12306窗体抢票软件(二) 本文这次介绍如何获取12306网站的验证码并登陆. 1 获取验证码 12306它是一个服务器,每次我们访问它都是以客户端的方式去向它索取信息. 建议用谷歌 ...

  2. 用python写12306系统_Python实现12306火车票抢票系统

    Python实现12306火车票抢票系统 来源:中文源码网    浏览: 次    日期:2019年11月5日 [下载文档:  Python实现12306火车票抢票系统.txt ] (友情提示:右键点 ...

  3. 12306自动抢票及自动识别验证码功能(一)

    其实12306抢票之前有做过,近年来随着技术的发展AI的兴起,我也随波逐流,研究了下python深度学习,来实现12306全自动抢票工具. 1. 实现12306自动识别验证码,我这里用的比较简单,目前 ...

  4. 基于python的火车票订票系统的设计与实现_Python实现12306火车票抢票系统

    Python实现12306火车票抢票系统效果图如下所示: 具体代码如下所示: import urllib.request as request import http.cookiejar as coo ...

  5. Python大牛带你实现12306全自动抢票,学完后春运回家抢票无忧

    随着2018年春节的脚步日益临近,归心似箭的人们都希望能尽快赶回家中.中国人回家过年,是每个人一年中最重要的事,无论你离家远近.在所有的交通工具中,承担着最大客流量的交通工具,毫无疑问是火车.中国庞大 ...

  6. 12306与抢票插件初识

    序. 无数巨人的肩膀 12306购票浅显研究 http://xiaowa.org/modules.php?link=read_article&id=129 . 基于HTTPS协议的12306抢 ...

  7. python实现云服务器上12306自动化抢票功能

    本文将分为几大模块讲解python服务器上12306自动化抢票功能: 一.云服务器的安装与配置 1.1 云服务器与个人主机不同,不受时间.场所等条件的限制,将python代码运行在云服务器上可以实现真 ...

  8. python编写12306窗体抢票软件(一)

    python编写12306窗体抢票软件(一) 第一次写博客,拿写过的软件练个手~ 12306是学习爬虫的比较好的一个练手网站.本文带你重零开始编写一个python窗体,十分简单,小白进来看哈~这节只说 ...

  9. 12306 分流抢票 纯净绿色版

    全程自动抢票,云打码自动识别验证码,多线程秒单.稳定捡漏,支持多天.多车次.短信提醒. ​​12306Bypass,12306分流抢票软件,完全免费的12306抢票软件,功能强易使用,全程自动抢票,云 ...

最新文章

  1. 重磅直播|中科慧眼崔峰博士详解深度相机原理及其应用
  2. 微服务架构 — 服务治理 — 服务监控与告警、服务日志与审计
  3. 分类模型的性能评估——以SAS Logistic回归为例(3): Lift和Gain
  4. [react] 怎么在JSX里使用自定义属性?
  5. diy直立双足机器人_Aelos Pro 机器人:让编程变得更有趣
  6. linux两个数字正则,正则表达式-Linux readelf显示具有不同数字系...
  7. Kotlin学习笔记24 协程part4 协程的取消与超时
  8. .net加载失败的程序集重新加载
  9. JSP---网页日历
  10. Ubuntu下用glade和GTK+开发C语言界面程序(三)——学习make的使用方法
  11. 洛谷OJ - P1192 - 台阶问题(递推)
  12. C语言运算符和表达式
  13. 色环在线计算机,多功能电子计算软件(eTools)
  14. Linux下的sock_stream和sock_dgram
  15. android 手机 跑分榜,Android手机哪家强?安兔兔鲁大师榜单见分晓!
  16. 原子的波尔模型、能量量子化、光电效应、光谱实验、量子态、角动量
  17. 织梦网站转移主机服务器教程
  18. GIS实验之加权泰森多边形的应用
  19. 耐看的《银元时代生活史》
  20. 凡客之困:物流和信誉在缩水

热门文章

  1. C语言中的sscanf()函数使用详解
  2. 鸿蒙系统会中毒吗,手机中毒会感染wifi吗
  3. 某厂大咖花一周整的 Java 八股文面试题,小白菜学了也能快速进大厂
  4. 甲方屡次选错乙方终致项目暴毙
  5. android电商闹钟,AndroidNativeEmu模拟执行计算出某电商App sign
  6. mapbox-gl自定义图层动态贴图效果(视频)
  7. C语言I--作业10
  8. 关于传统微积分的病态
  9. SOFA Weekly | Layotto 本周新晋 Contributor、QA 整理、新手任务
  10. “无人超市”信用测试:有人扔10元抱走名贵烟酒