**
纯selenium编写的12306抢票
**
该程序使用谷歌浏览器
# —*— coding: utf-8 -*- #
# @Time :2020/11/10 14:56
# @Author :woaishayueyue
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
from selenium.common.exceptions import ElementNotInteractableException, NoSuchElementException
import csv
import time
driver = webdriver.Chrome(executable_path="F:\chromdriver\chromedriver.exe")
driver.maximize_window()
class TicketGrabbing(object):
login_url = "https://kyfw.12306.cn/otn/resources/login.html"
success_url = "https://kyfw.12306.cn/otn/view/index.html"
search_ticket_url = "https://kyfw.12306.cn/otn/leftTicket/init?linktypeid=dc"
station_dict = {}
def __init__(self, go_place, final_place, go_time, train, name, sit):
"""
:param go_place: 出发地
:param final_place: 目的地
:param go_time: 出发时间
:param train: 车次
:param name: 乘客
:param sit: 座位
"""
self.go_place = go_place
self.final_place = final_place
self.go_time = go_time
self.train = train
self.name = name
self.set = sit
def station_info(self):
with open("2.csv", "r", encoding="utf-8")as fp:
reader = csv.DictReader(fp, delimiter=" ")
for i in reader:
title = i["title"]
data = i["data"]
self.station_dict[title] = data
fp.close()
def login(self):
driver.get(self.login_url)
WebDriverWait(driver, 1000).until(
ec.url_contains(self.success_url)
)
def search_ticket(self):
driver.get(self.search_ticket_url)
# 输入出发地
from_station_input = driver.find_element_by_id("fromStation")
from_station_input_name = self.station_dict[self.go_place]
driver.execute_script("arguments[0].value='%s'" % from_station_input_name, from_station_input)
# 输入目的地
to_station_input = driver.find_element_by_id("toStation")
to_station_input_name = self.station_dict[self.final_place]
driver.execute_script("arguments[0].value='%s'" % to_station_input_name, to_station_input)
# 输入时间
time_select = driver.find_element_by_id("train_date")
driver.execute_script("arguments[0].value='%s'" % self.go_time, time_select)
# 选择高铁动车
click_h = driver.find_element_by_xpath("//body//ul[@id='_ul_station_train_code']/li[1]")
click_h.click()
click_d = driver.find_element_by_xpath("//body//ul[@id='_ul_station_train_code']/li[2]")
click_d.click()
# 执行查询操作
search_btn = driver.find_element_by_id("query_ticket")
search_btn.click()
def select_train(self):
while True:
WebDriverWait(driver, 1000).until(
ec.presence_of_element_located((By.XPATH, "//tbody[@id='queryLeftTable']/tr"))
)
info = driver.find_elements_by_xpath("//tbody[@id='queryLeftTable']/tr[not(@datatran)]")
# 数据结构 列车号 一等座 二等座 无座
train_info = []
for i in info:
train_name = i.text.replace("\n", " ").split(" ")[0]
train_tickets_second = i.text.replace("\n", " ").split(" ")[-10]
train_tickets_one = i.text.replace("\n", " ").split(" ")[-11]
train_info_1 = [train_name, train_tickets_one, train_tickets_second]
train_info.append(train_info_1)
for i in range(len(train_info)):
if self.train == train_info[i][0]:
if train_info[i][1] != "无" or "--" and train_info[i][2] != "无" or "--":
try:
click_btn = driver.find_element_by_xpath(
"//tbody[@id='queryLeftTable']/tr[not(@datatran)][" + str(i + 1) + "]//a[@class='btn72']")
driver.execute_script("arguments[0].click()", click_btn)
return
except NoSuchElementException:
print("此车没有想要的车票了!正在抢票~~")
driver.refresh()
self.search_ticket()
def select_buy(self):
# 选择购票人
WebDriverWait(driver, 1000).until(
ec.url_contains("https://kyfw.12306.cn/otn/confirmPassenger/initDc")
)
time.sleep(1)
all_name = driver.find_element_by_xpath("//body//ul[@id='normal_passenger_id']")
a = all_name.text.replace("\n", " ").split(" ")
for i in a:
if i == self.name:
name = driver.find_element_by_id("normalPassenger_"+str(a.index(i)))
name.click()
def select_sit(self):
# 二等座 O 一等座 M
if self.set == "二等座":
sele_sit = driver.find_element_by_xpath("//td//select[@id='seatType_1']//option[@value='O']")
sele_sit.click()
elif self.set == "一等座":
sele_sit = driver.find_element_by_xpath("//td//select[@id='seatType_1']//option[@value='M']")
sele_sit.click()
sub_btn = driver.find_element_by_id("submitOrder_id")
sub_btn.click()
# 点击
WebDriverWait(driver, 1000).until(
ec.presence_of_element_located((By.CLASS_NAME, "dhtmlx_wins_body_outer"))
)
WebDriverWait(driver, 1000).until(
ec.element_to_be_clickable((By.ID, "qr_submit_id"))
)
sub_btn_final = driver.find_element_by_id("qr_submit_id")
while sub_btn_final:
try:
sub_btn_final.click()
sub_btn_final = driver.find_element_by_id("qr_submit_id")
except ElementNotInteractableException:
break
print("抢票成功!请30分钟内到个人中心付款!!!")
def run(self):
# 加载城市代号
self.station_info()
# 登录
self.login()
# 查询车票
self.search_ticket()
# 进入详细车次
self.select_train()
# 选择购票人
self.select_buy()
# 选择座位
self.select_sit()
def main():
user_place = input("请输入出发地:")
user_final_place = input("请输入目的地:")
user_time = input("请输入出发时间(示例:2000-01-01):")
user_train = input("请输入车次(仅支持动车或高铁首字母大写):")
user_name = input("请输入购票人信息:")
user_sit = input("请输入座位(仅支持一等座或二等座):")
ticket = TicketGrabbing(user_place, user_final_place, user_time, user_train, user_name, user_sit)
ticket.run()
if __name__ == '__main__':
main()
经测试效果还行,特意分享,谢谢!