纯selenium编写的12306抢票

**

纯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()

经测试效果还行,特意分享,谢谢!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值