2021-05-25

解决12306抢票系统弹出来的弹窗问题

应为疫情原因进入12306网站登陆界面弹出来这样一个界面

进入登陆界面的网站,把鼠标放在确定的位置右键点击检查,找到

# 我把它放在另一个函数中,这样调用就可以了
    def click_ok1(self):
        bounce_button = driver.find_element_by_css_selector(".btn.btn-primary.ok")
        bounce_button.click()

第二个弹出来的界面也是和上面的解决方法是一样的

把鼠标放在确认键,右键点击检查



        hint_button = driver.find_element_by_css_selector("#content_defaultwarningAlert_id .up-box-bd .lay-btn")
        if hint_button:
            hint_button.click()

以上就是我解决的这个方法,下面我我做这个12306完整的代码,

import csv
import datetime
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.webdriver.support.ui import Select
from selenium.common.exceptions import NoSuchElementException

driver = webdriver.Chrome(executable_path="D:\Spyder-selinuim\ChromeDriver\chromedriver.exe")


# 9:商务座,M:一等座,O:二等座,3:硬卧,4:软卧,1:硬座
class TrainSpyder(object):
    login_url = "https://kyfw.12306.cn/otn/resources/login.html"
    login_after_url = "https://kyfw.12306.cn/otn/view/index.html"
    search_ticket_url = "https://kyfw.12306.cn/otn/leftTicket/init?linktypeid=dc"
    confirm_passengers_url = "https://kyfw.12306.cn/otn/confirmPassenger/initDc"

    def __init__(self, from_station, to_station, start_date, trains_num, passengers):
        """

        :param from_station:起始站
        :param to_station: 终点站
        :param start_date:起始时间
        :param trains_num:车次。{""}
        :param passengers:乘客信息列表
        """
        self.from_station = from_station
        self.to_station = to_station
        self.start_date = start_date
        self.trains_num = trains_num
        self.passengers = passengers
        self.selected_num = None
        # 初始化站点多对应的代号
        self.station_codes = {}
        self.init_station_code()

    def init_station_code(self):
        with open("stations.csv", 'r', encoding='utf8') as f:
            reader = csv.DictReader(f)
            for line in reader:
                name = line["name"]
                code = line["code"]
                self.station_codes[name] = code

    def login(self):
        driver.get(self.login_url)
        # 通过手机扫描登陆
        input("等待扫描......") 
        self.click_ok1()
        # 等待url是否进入个人中心
        WebDriverWait(driver, 100).until(
            ec.url_contains(self.login_after_url)
        )
        print("登录成功!")


    def search_ticket(self):
        """
        查询余票信息
        :return: None
        """
        driver.get(self.search_ticket_url)
        # 第二个界面弹出来的界面
        hint_button = driver.find_element_by_css_selector("#content_defaultwarningAlert_id .up-box-bd .lay-btn")
        if hint_button:
            hint_button.click()
        # 起点站
        from_station_input = driver.find_element_by_id("fromStation")
        from_station_code = self.station_codes[self.from_station]
        driver.execute_script("arguments[0].value='%s'" % from_station_code, from_station_input)
        # 终点站
        to_station_input = driver.find_element_by_id("toStation")
        to_station_codes = self.station_codes[self.to_station]
        driver.execute_script("arguments[0].value='%s'" % to_station_codes, to_station_input)
        # 设置出发时间
        start_data_input = driver.find_element_by_id("train_date")
        driver.execute_script("arguments[0].value='%s'" % self.start_date, start_data_input)
        # 执行查询操作
        search_button = driver.find_element_by_id("query_ticket")
        search_button.click()
        # 解析车次信息
        WebDriverWait(driver, 100).until(
            ec.presence_of_element_located((By.XPATH, "//tbody[@='queryLeftTable']/tr"))
        )
        train_details = driver.find_elements_by_xpath("//tbody[@='queryLeftTable']/tr[not(@datatran)]")
        is_searched = False
        for train_detail in train_details:
            detail_info = train_detail.text.replace("\n", "").split(" ")
            number = detail_info[0]
            if number in self.trains_num:
                seat_types = self.trains_num[number]
                # 二等座
                for seat_type in seat_types:
                    if seat_type == "O":
                        count = detail_info[9]
                        if count.isdigit() or count == '有':
                            is_searched = True
                            break
                        elif seat_type == "M":
                            count = detail_info[8]
                            if count.isdigit() or count == '有':
                                is_searched = True
                                break
            if is_searched:
                self.selected_num = number
                orderButton = train_detail.find_elements_by_xpath(".//td[@class='no-br']")
                orderButton.click()




    def click_ok1(self):
        bounce_button = driver.find_element_by_css_selector(".btn.btn-primary.ok")
        bounce_button.click()



    def confirm_passengers_info(self):
        WebDriverWait(driver, 100).until(
            ec.url_contains(self.confirm_passengers_url)
        )
        WebDriverWait(driver, 100).until(
            ec.presence_of_element_located((By.XPATH, "//ul[@id='normal_passenger_id']//li/label"))
        )
        # 确认需要购买车票的乘客
        pasenger_labels_input = driver.find_elements_by_xpath("//ul[@id='normal_passenger_id']//li/label")
        for pasenger_labels in pasenger_labels_input:
            name = pasenger_labels.text
            if name in self.passengers:
                pasenger_labels.click()

        # 确认需要购买的席位信息
        seat_select = Select(driver.find_element_by_id("seatType_1"))
        seat_types = self.trains_num[self.selected_num]
        for seat_type in seat_types:
            try:
                seat_select.select_by_value(seat_type)
            except NoSuchElementException:
                continue
            else:
                break

        WebDriverWait(driver, 100).until(
            ec.element_to_be_clickable((By.XPATH, "submitOrder_id"))
        )
        submit_button = driver.find_element_by_id("submitOrder_id")
        submit_button.click()



    def run(self):
        #  1.登录
        self.login()
        # 2.余票查询
        self.search_ticket()
        # 3.确定乘客和车次信息
        self.comfirm_passengers_info()





def main():
    # 9:商务座,M:一等座,O:二等座,3:硬卧,4:软卧,1:硬座
    start_date = datetime.date.today().strftime("%Y-%m-%d")
    base_info = TrainSpyder("株洲", "深圳", start_date, {"G72":["O", "M"]}, ['严京'])
    base_info.run()



if __name__ == '__main__':
    main()

































最后,鄙人初来乍到,如有不妥,请各位大佬多多指教,一定洗耳恭听。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用python中的pymsql完成如下:表结构与数据创建 1. 建立 `users` 表和 `orders` 表。 `users` 表有用户ID、用户名、年龄字段,(id,name,age) `orders` 表有订单ID、订单日期、订单金额,用户id字段。(id,order_date,amount,user_id) 2 两表的id作为主键,`orders` 表用户id为users的外键 3 插入数据 `users` (1, '张三', 18), (2, '李四', 20), (3, '王五', 22), (4, '赵六', 25), (5, '钱七', 28); `orders` (1, '2021-09-01', 500, 1), (2, '2021-09-02', 1000, 2), (3, '2021-09-03', 600, 3), (4, '2021-09-04', 800, 4), (5, '2021-09-05', 1500, 5), (6, '2021-09-06', 1200, 3), (7, '2021-09-07', 2000, 1), (8, '2021-09-08', 300, 2), (9, '2021-09-09', 700, 5), (10, '2021-09-10', 900, 4); 查询语句 1. 查询订单总金额 2. 查询所有用户的平均年龄,并将结果四舍五入保留两位小数。 3. 查询订单总数最多的用户的姓名和订单总数。 4. 查询所有不重复的年龄。 5. 查询订单日期在2021年9月1日至9月4日之间的订单总金额。 6. 查询年龄不大于25岁的用户的订单数量,并按照降序排序。 7. 查询订单总金额排名前3的用户的姓名和订单总金额。 8. 查询订单总金额最大的用户的姓名和订单总金额。 9. 查询订单总金额最小的用户的姓名和订单总金额。 10. 查询所有名字中含有“李”的用户,按照名字升序排序。 11. 查询所有年龄大于20岁的用户,按照年龄降序排序,并只显示前5条记录。 12. 查询每个用户的订单数量和订单总金额,并按照总金额降序排序。
06-03
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值