以selenium模拟登陆12306
初级模拟,速度有点慢,后期有时间再优化
1 # -*- coding:utf-8 -*- 2 # author:zxy 3 # date:2018-12-23 4 5 from selenium import webdriver 6 from selenium.webdriver.support.ui import WebDriverWait 7 from selenium.webdriver.support import expected_conditions as EC 8 from selenium.webdriver.common.by import By 9 from http.cookiejar import CookieJar 10 from urllib import request 11 from urllib import parse 12 13 14 class login_12306(): 15 def get_opener(self): 16 # 1登录 17 # 1.1 创建一个CookieJar对象 18 self.cookiejar = CookieJar() 19 # 1.2 使用cookiejar创建一个HTTPCookieProcessor()对象 20 self.handler = request.HTTPCookieProcessor(self.cookiejar) 21 # 1.3 使用上一步创建的handler创建一个opener 22 opener = request.build_opener(self.handler) 23 return opener 24 25 class ticketGradding(): 26 27 def __init__(self): 28 self.driver_path = r"E:\chromDriver\chromedriver.exe" 29 self.initMy_url = "https://kyfw.12306.cn/otn/view/index.html" 30 self.driver = webdriver.Chrome(executable_path=self.driver_path) 31 self.login_url = "https://kyfw.12306.cn/otn/login/init" 32 self.ticket_url = "https://kyfw.12306.cn/otn/leftTicket/init" 33 self.confirm_url = "https://kyfw.12306.cn/otn/confirmPassenger/initDc" 34 35 def _wait_input(self): 36 self.from_station = input("起始站") 37 self.to_station = input("目的地") 38 39 # 时间格式 yyyy-MM-dd 40 self.depart_time = input("出发时间:") 41 self.passengers = input("乘客姓名(如有多个乘客,用英文逗号隔开):").split(",") 42 self.trains = input("车次(如果多个车次,用英文逗号隔开):").split(",") 43 44 def _login(self): # 函数名前加_,表示该函数只能在当前类使用 45 self.driver.get(self.login_url) 46 # 显示等待 47 # 隐示等待 48 WebDriverWait(self.driver, 1000).until( 49 EC.url_to_be(self.initMy_url) 50 ) 51 print("登陆成功") 52 53 def _order_ticket(self): 54 # 跳转到查余票的界面 55 self.driver.get(self.ticket_url) 56 self.tickets = [] 57 # 等待出发地是否输入正确 58 WebDriverWait(self.driver, 1000).until( 59 60 # 元组 61 EC.text_to_be_present_in_element_value((By.ID, "fromStationText"), self.from_station) 62 ) 63 64 # 等待目的地时候输入正确 65 WebDriverWait(self.driver, 1000).until( 66 EC.text_to_be_present_in_element_value((By.ID, "toStationText"), self.to_station) 67 ) 68 69 # 等待出发时间是否输入正确 70 WebDriverWait(self.driver, 1000).until( 71 EC.text_to_be_present_in_element_value((By.ID, "train_date"), self.depart_time) 72 ) 73 74 # 等待查询按钮是否可用 75 WebDriverWait(self.driver, 1000).until( 76 EC.element_to_be_clickable((By.ID, 'query_ticket')) 77 ) 78 79 # 执行查询事件 80 searchBtn = self.driver.find_element_by_id('query_ticket') 81 searchBtn.click() 82 83 # 等待显示车次信息 84 WebDriverWait(self.driver, 1000).until( 85 EC.presence_of_element_located((By.XPATH, ".//tbody[@id='queryLeftTable']/tr")) 86 ) 87 88 tr_list = self.driver.find_element_by_xpath(".//tbody[@id='queryLeftTable']/tr[not (@datatrain)]") 89 90 for tr in tr_list: 91 train_number = tr.find_element_by_class_name("number").text 92 if train_number in self.trains: 93 best_ticket = tr.find_element_by_xpath(".//td[2]").text 94 first_ticket = tr.find_element_by_xpath(".//td[3]").text 95 second_ticket = tr.find_element_by_xpath(".//td[4]").text 96 super_soft_ticket = tr.find_element_by_xpath(".//td[5]").text 97 soft_lay_ticket = tr.find_element_by_xpath(".//td[6]").text 98 move_lay_ticket = tr.find_element_by_xpath(".//td[7]").text 99 hard_lay_ticket = tr.find_element_by_xpath(".//td[8]").text 100 sort_sit_ticket = tr.find_element_by_xpath(".//td[9]").text 101 hard_sit_ticket = tr.find_element_by_xpath(".//td[10]").text 102 no_sit_ticket = tr.find_element_by_xpath(".//td[11]").text 103 others = tr.find_element_by_xpath(".//td[12]").text 104 # self.tickets.append(best_ticket,first_ticket,second_ticket,super_soft_ticket,soft_lay_ticket,\ 105 # move_lay_ticket,hard_lay_ticket,sort_sit_ticket,hard_sit_ticket,\ 106 # no_sit_ticket,others) 107 orderBtn = tr.find_element_by_class_name("btn72") 108 if best_ticket.isdigit or best_ticket == "有": 109 print(train_number + "商务座特等座有票,序号为0") 110 # orderBtn.click() 111 elif first_ticket.isdigit or first_ticket == "有": 112 print(train_number + "一等座有票,序号为1") 113 # orderBtn.click() 114 elif second_ticket.isdigit or second_ticket == "有": 115 print(train_number + "二等座有票,序号为2") 116 # orderBtn.click() 117 elif super_soft_ticket.isdigit or super_soft_ticket == "有": 118 print(train_number + "三等座有票,序号为3") 119 # orderBtn.click() 120 elif soft_lay_ticket.isdigit or soft_lay_ticket == "有": 121 print(train_number + "高级软卧有票,序号为4") 122 elif move_lay_ticket.isdigit or move_lay_ticket == "有": 123 print(train_number + "软卧有票,序号为5") 124 elif hard_lay_ticket.isdigit or hard_lay_ticket == "有": 125 print(train_number + "动卧有票,序号为6") 126 elif sort_sit_ticket.isdigit or sort_sit_ticket == "有": 127 print(train_number + "软座有票,序号为7") 128 elif hard_sit_ticket.isdigit or hard_sit_ticket == "有": 129 print(train_number + "硬座有票,序号为8") 130 elif no_sit_ticket.isdigit or no_sit_ticket == "有": 131 print(train_number + "无座有票,序号9") 132 elif others.isdigit or others == "有": 133 print(train_number + "其他有票,序号10") 134 135 choice = input("请输入有票的且座位等级对应的编号:") 136 if (choice): 137 orderBtn.click() 138 139 # 确认选票页面 140 WebDriverWait(self.driver, 1000).until( 141 EC.url_to_be(self.confirm_url) 142 ) 143 144 def run(self): 145 self._wait_input() 146 self._login() 147 self._order_ticket() 148 149 150 if __name__ == '__main__': 151 spider = ticketGradding() 152 spider.run()
转载于:https://www.cnblogs.com/z-712/p/10614512.html
以selenium模拟登陆12306相关推荐
- php selenium模拟登陆,12306 的selenium实现模拟登陆
# 下面是12306 实现的模拟登陆 # 解码 应用超级鹰,注册用户,左侧栏软件ID进去,开启一个新软件,拿到软件ID # 下面测试都在jupyter里面实现 # 超级鹰类 cell import r ...
- selenium模拟登录12306
利用selenium模拟登录12306,但是12306的登陆要想模拟还挺难的,需要先进行坐标识别,识别出来之后还要在进行滑块拖动验证识别,这里做一下记录. 这里的坐标识别是用的超级鹰,有时也会坐标识别 ...
- selenium模拟登陆豆瓣并获取cookies
验证码处理与模拟登陆豆瓣,首先我们看到豆瓣没有cookies,我们需要用程序来模拟登陆获取cookies(当前有些情况下自己手动登陆后复制粘贴cookies也能登陆),该文主要讲方法,如何用selen ...
- 爬取知乎壁纸:selenium模拟登陆获取cookies,再将cookies传递给requests
selenium很好用,但是爬取大量数据时速度较慢. 通过selenium模拟登陆,获取cookies,再将cookies传递给requests,通过requests爬取加快速度. 以为知乎网爬取壁纸 ...
- selenium模拟登陆淘宝遇到的问题及解决
今天忽然想用爬虫登陆淘宝,于是就试着写一下, 我是用selenium模拟登陆,我先是打开淘宝登陆页面发现淘宝的登陆界面是这样的 我就用代码写了一个模拟登陆:如下这是最终代码 import time f ...
- java使用Selenium模拟登陆58(验证码登陆密码登陆)若快平台识别文字点击验证码
文章目录 写在前面 配置环境 Selenium入门 使用Selenium登陆58 若快平台识别文字点击验证码 附: By对象中的 xpath & cssSelector获取方式** 不打开浏览 ...
- 使用Python模拟登陆12306并全自动下单
最近一段时间一直在研究用Python模拟登陆12306网站并自动刷票下单,经过一段时间的摸索,终于完成了代码,实现了12306刷票的功能.话不多说,先给大伙儿看看成果.我录制了一段时间,展示了自动刷票 ...
- Python3 爬虫实战 — 模拟登陆12306【点触验证码对抗】
登陆时间:2019-10-21 实现难度:★★★☆☆☆ 请求链接:https://kyfw.12306.cn/otn/resources/login.html 实现目标:模拟登陆中国铁路12306,攻 ...
- selenium模拟登陆时截取验证码
模拟登陆时,经常会遇到有验证码的问题,那么就需要把验证码给截取下来. 如下为截取验证码程序,该程序的原始地址为:http://www.cnblogs.com/donaldlee2008/p/53045 ...
最新文章
- 【数据结构】链表中的 指针,地址
- 数据恢复工具,每秒钟扫描 1000万文件!
- HDU 1231 最大连续子序列
- 机器学习(Machine Learning)深入学习(Deep Learning)资料
- 构造方法注入和设值注入有什么区别?
- EYQiPa,梦开始的地方
- C++ 常用设计模式
- xstatic图形连接linux,RHCE认证考试模拟题深入讲解:linux配置静态IP地址为:192.168.0.X!...
- 睡眠监测中的一些术语和指标(AASM)
- 实验室计算机主机关,计算机综合实验室管理办法
- 数学建模【开会总结】
- 机器学习模型评估方法
- 【洞见研报】网络游戏薪酬报告(薪酬报告,网络游戏,游戏公司岗位)
- 商品绑定可用的优惠券(多对多的绑定且一张优惠券只能使用于一个商品)
- PHP中=是什么意思
- Ubuntu16.04安装VCS和Verdi遇到的两个问题
- FireBox与Chrome,FireBox 对代码执行严格
- FPGA——1位全加器和4位全加器的实现
- 快速上手Django(六) -Django之Django drf 序列化器Serializer类
- 电磁仿真在EMC设计中的应用案例
热门文章
- Qt中的默认文件夹路径获取方法
- 雷达模拟器 HPx-310
- 属于不安全的http请求方法的是_解冻方法那么多,哪一种最好?你常用的方法可能最不安全...
- QCustomplot 层 (七)
- 20180615小测
- 虚拟机的远程桌面连不上怎么解决
- WPF 项目开发入门(十)DevExpress 插件+NHibernate 登录实现
- 怎么截取手游发送到服务器的信息,游戏是如何从服务器走到手机:发行流程的简单描述...
- js canvas 五指棋,138行实现五指棋
- 文献阅读001:由I类HLA转录缺失导致的联合免疫治疗的获得性癌症耐药性