python+selenium实现自动抢票
使用说明
程序运行开始,需要输入出发地,目的地,出发时间,乘客信息,车次;乘客信息和车次可以输入多个
刚刚开始学习爬虫,selenium仅仅是解放了双手,运行效率不是很高;
程序运行时会打开chrome浏览器,因为使用的是chrome的浏览器驱动;
相关文档
https://selenium-python.readthedocs.io/installation.html#introduction
代码示例
# encoding: utf-8
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import time
class Qiangpiao(object):
def __init__(self):
driver_path = "E:\py_pachong\chromedriver.exe"
# 浏览器驱动
self.drive = webdriver.Chrome(executable_path=driver_path)
# 登陆链接
self.login_url = "https://kyfw.12306.cn/otn/login/init"
# 登陆后的链接
# 2018-11-29 更新,12306改版了,登陆后跳转的页面地址已变
# self.initmy_url = "https://kyfw.12306.cn/otn/index/initMy12306"
self.initmy_url = "https://kyfw.12306.cn/otn/view/index.html"
# 查询页面
self.search_url = "https://kyfw.12306.cn/otn/leftTicket/init"
# 乘车人页面
self.passenger_url = "https://kyfw.12306.cn/otn/confirmPassenger/initDc"
def wait_input(self):
"""
主要用于页面审核;
当输入出发地,目的地,乘车时间后,会自动出发查询submit
:return:
"""
self.from_station = input("出发地:")
self.to_station = input("目的地:")
self.depart_time = input("出发时间:")
self.passengers = input("乘客姓名:").split(",")
self.trains = input("车次:").split(",")
def _login(self):
"""
登陆验证,登陆成功后会跳转到 self.initmy_url
:return:
"""
self.drive.get(self.login_url)
WebDriverWait(self.drive, 1000).until(
EC.url_to_be(self.initmy_url)
)
print('登录成功')
def _order_ticket(self):
"""
只实现了在无票的情况下去刷票
最关键的是等待验证 WebDriverWait
:return:
"""
self.drive.get(self.search_url)
WebDriverWait(self.drive, 1000).until(
EC.text_to_be_present_in_element_value((By.ID, "fromStationText"), self.from_station)
)
WebDriverWait(self.drive, 1000).until(
EC.text_to_be_present_in_element_value((By.ID, "toStationText"), self.to_station)
)
WebDriverWait(self.drive, 1000).until(
EC.text_to_be_present_in_element_value((By.ID, "train_date"), self.depart_time)
)
WebDriverWait(self.drive, 10000).until(
EC.element_to_be_clickable((By.ID, "query_ticket"))
)
searchBtn = self.drive.find_element_by_id("query_ticket")
searchBtn.click()
WebDriverWait(self.drive, 1000).until(
EC.presence_of_element_located((By.XPATH, ".//tbody[@id='queryLeftTable']/tr"))
)
# find_elements_by_xpath 返回的是一个列表
# find_element_by_xpath 返回的是一个元素
tr_list = self.drive.find_elements_by_xpath(".//tbody[@id='queryLeftTable']/tr[not(@datatran)]")
for tr in tr_list:
train_num = tr.find_element_by_class_name("number").text
# print(train_num)
if train_num in self.trains:
left_ticket_td = tr.find_element_by_xpath(".//td[4]").text
num = 1
while left_ticket_td == "无":
print("暂时无票,正在刷新")
time.sleep(2)
searchBtn.click()
num += 1
print("抢票%s次" % num)
if left_ticket_td != "无":
print(train_num + "有票")
oderBtn = tr.find_element_by_xpath(".//td[13]/a")
oderBtn.click()
WebDriverWait(self.drive, 1000).until(
EC.url_to_be(self.passenger_url)
)
WebDriverWait(self.drive, 1000).until(
EC.presence_of_element_located((By.XPATH, ".//ul[@id='normal_passenger_id']/li"))
)
passenger_labels = self.drive.find_elements_by_xpath(
".//ul[@id='normal_passenger_id']/li/label")
for passenger_label in passenger_labels:
name = passenger_label.text
if name in self.passengers:
passenger_label.click()
submitBtn = self.drive.find_element_by_id("submitOrder_id")
submitBtn.click()
WebDriverWait(self.drive, 1000).until(
EC.presence_of_element_located((By.CLASS_NAME, "dhtmlx_wins_body_outer"))
)
WebDriverWait(self.drive, 1000).until(
EC.presence_of_element_located((By.ID, "qr_submit_id"))
)
qr_submit = self.drive.find_element_by_id("qr_submit_id")
qr_submit.click()
def run(self):
self.wait_input()
self._login()
self._order_ticket()
if __name__ == '__main__':
spider = Qiangpiao()
spider.run()
python+selenium实现自动抢票的更多相关文章
- python自动抢票
# -*- coding: utf-8 -*- from splinter.browser import Browser from time import sleep import traceback ...
- Python实例--12306的抢票功能
基础知识学习 目标: 通过python程序实现自动登录下单功能 知识点: Selenium + 云打码 + Python 学习链接: 1. Python学习--Selenium模块 2. Python ...
- python之12306自动查票
一.导读 本篇文章所采用的技术仅用于学习.研究,任何其他用途请自行承担后果. 12306自动查票使用到的python库主要是splinter,同时也涉及到查票的城市编码,具体的城市编码请在网络上搜 ...
- Python+Appium实现自动抢微信红包
前言 过年的时候总是少不了红包,不知从何时开始微信红包横空出世,对于网速和手速慢的人只能在一旁观望,做为python的学习者就是要运用编程解决生活和工作上的事情. 于是我用python解决我们的手速问 ...
- c# 模拟 网页实现12306登陆、自动刷票、自动抢票完全篇
这一篇文章,我将从头到尾教大家使用c#模拟网页面登陆12306网站,自动刷票,选择订票人,到最后一步提交订单.研究过HTTP协议的童鞋们都知道,我们在访问网站时,是有两种方式的,POST和GET方式, ...
- Python 实现的 12306抢票脚本
Python12306抢票脚本 本脚本使用一个类来实现所有代码,大体上分为以下几个模块及其步骤:- 初始化对象属性(在抢票前进行的属性初始化,包括初始化浏览器模拟对象,个人信息等).- 建立模拟浏览器 ...
- 开源you-get项目爬虫,以及基于python+selenium的自动测试利器
写在前面 爬虫和自动测试,对于python来说是最合适不过也是最擅长的. 开源的项目也很多,例如you-get项目https://github.com/soimort/you-get.盗链和爬虫神器. ...
- 360自动抢票还不够,几行js代码设置无人值守
360就是牛逼哄哄的...... 但是最近在使用360浏览器抢票的时候还是发现了一些体验不好的地方,比如搞着搞着就退出了登录,有时候能帮你自动登录进去,但是自动登录之后又不会帮你自动开始抢.然后验证码 ...
- 基于selenium+java的12306自动抢票
import java.util.concurrent.TimeUnit; import org.openqa.selenium.By;import org.openqa.selenium.Keys; ...
随机推荐
- GCC the GNU
GCC简单使用 -v/-v/--version 查看gcc版本号 python@ubuntu:~$ gcc -v -I 指定头文件目录,注意-I和之间没有空格 1 #include<s ...
- 如何在SAP C4C里使用ABSL消费第三方Restful API
首先我们得有一个可以正常工作的Restful API: 然后在Cloud for Customer的Cloud Application Studio里创建Restful API的模型,把第一步可以正常 ...
- SAP专家培训之Netweaver ABAP内存管理和内存调优最佳实践
培训者:SAP成都研究院开发人员Jerry Wang 1. Understanding Memory Objects in ABAP Note1: DATA itab WITH HEADER LINE ...
- hibernate mysql 分页时报错 显示的代码和sql server 类似 select top 1……
[ERROR][com.alibaba.druid.filter.stat.StatFilter]merge sql error, dbType mysql, sql : select top 1 d ...
- MongoDB删除文档
db.collection.deleteOne() 删除单个文档db.collection.deleteMany() 删除多个文档db.collection.remove() 删除单/多个文档,db. ...
- ASP.NET 页面基本优化.
一.禁用Browser Link(目前主要用来是刷新vs ide 浏览界面),直接干掉. <!-- Visual Studio Browser Link --> <script ty ...
- 用poi-3.6-20091214.jar 实现java给excel资料加密
用poi-3.6-20091214.jar 实现java给excel文件加密我用了网上的很多方法,但是都没有成功! HSSFWorkbook wb = new HSSFWorkbook(new Fil ...
- 绘图、Core Animation与硬件架构
原文地址:http://blog.csdn.net/wzzvictory/article/details/11180241 转载请注明出处 如果觉得文章对你有所帮助,请通过留言或关注微信公众帐号wan ...
- 第三篇——第二部分——第一文 SQL Server镜像简单介绍
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/DBA_Huangzj/article/details/26951563 原文出处:http://bl ...
- 【[SCOI2008]奖励关】
又抄了一篇题解 要凉了要凉了,开学了我还什么都不会 文化课凉凉,NOIP还要面临爆零退役的历史进程 这道题挺神的,期望+状态压缩 我们设\(dp[i][S]\)表示在第\(i\)天前,捡的宝物状态为\ ...