import time
import json
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.keys import Keys
path = r'D:\game\chromedriver.exe'
def browser_initial():
""""
进行浏览器初始化
"""
# os.chdir('E:\\pythonwork')
# 1.将加载项配置到启动浏览器中 打开/创建浏览器对象
browser = webdriver.Chrome(service=Service(path))
# 2.网址 https://kyfw.12306.cn/otn/resources/login.html -- 登录界面
# https://kyfw.12306.cn/otn/leftTicket/init 选票界面可以 判断是否登录
log_url = 'https://kyfw.12306.cn/otn/leftTicket/init'
return log_url, browser
def get_cookies(browser):
"""
获取cookies保存至本地
"""
browser.get(log_url)
time.sleep(15) # 进行扫码
# selenium_login(browser)
# print("登录成功")
dictCookies = browser.get_cookies() # 获取list的cookies
string_Cookies = json.dumps(dictCookies) # 转换成字符串保存
with open('string_cookies.json', 'w') as f:
f.write(string_Cookies)
print('cookies保存成功!')
def login_cookie(log_url, browser):
"""
从本地读取cookies并刷新页面,成为已登录状态
"""
# 这个是12306的登录界面 https://kyfw.12306.cn/otn/resources/login.html
# browser.get(log_url)
with open('string_cookies.json', 'r', encoding='utf8') as f:
listCookies = json.loads(f.read())
# 往browser里添加cookies
for cookie in listCookies:
# cookie_dict = {
# 'domain': cookie.get('domain'),
# # "expires": cookie.get('value'),
# 'httpOnly': cookie.get('httpOnly'),
# 'name': cookie.get('name'),
# 'path': cookie.get('path'),
# "sameSite": "Lax",
# 'Secure': cookie.get('Secure'),
# 'value': cookie.get('value'),
# }
browser.add_cookie(cookie)
# browser.refresh()
time.sleep(1)
# 如果是已登录的界面,可以免登录直接进 https://kyfw.12306.cn/otn/view/index.html
# https://www.12306.cn/index/ --12306官网首页
browser.get(log_url)
return browser
def selenium_run(driver):
# 11.1 选择出发的城市--点击那个框
driver.find_element(by="css selector", value="#fromStationText").click()
# 11.2 选择出发的城市--选择城市
driver.find_element(by="css selector", value="#fromStationText").send_keys(login["from_city"])
# 11.3 选择出发的城市--回车确定
driver.find_element(by="css selector", value="#fromStationText").send_keys(Keys.ENTER)
# 12.1 选择目的的城市--点击那个框
driver.find_element(by="css selector", value="#toStationText").click()
# 12.2 选择目的的城市--选择城市
driver.find_element(by="css selector", value="#toStationText").send_keys(login['to_city'])
# 12.3 选择目的的城市--回车确定
driver.find_element(by="css selector", value="#toStationText").send_keys(Keys.ENTER)
# 13.1 选择出发的日期--点击那个框
driver.find_element(by="css selector", value="#train_date").clear()
# 12.2 选择出发的日期--选择城市
driver.find_element(by="css selector", value="#train_date").send_keys(login['train_date'])
# 12.3 选择出发的日期--回车确定
driver.find_element(by="css selector", value="#train_date").send_keys(Keys.ENTER)
# # 12.4 点击--显示全部可预订的车次
# driver.find_element(by="css selector", value="avail_ticket").click()
# 12.5 点击查询
driver.implicitly_wait(5)
driver.find_element(by="css selector", value="#query_ticket").click()
# num = int(input('请输入您想要的车次:'))
# 点击预订按钮 -- 选择要预定的是第几躺车 -- 这个代码没有问题
# driver.find_element(by="css selector", value='#ticket_65000G279007_01_03 > td.no-br').click()
# //div//tbody[@id="queryLeftTable"]/tr[contains(@id,"ticket")]/@id -- 但是selenium的find_elements不可以用@id找到元素。
ticket_list = driver.find_elements(by="xpath", value='//div//tbody[@id="queryLeftTable"]/tr[contains(@id,"ticket")]')
ticket_num = ticket_list[login['num']].get_attribute("id")
ticket_pre = ticket_num + ' > td.no-br'
# 12.6 点击想要车次的预定按钮
driver.find_element(by="css selector", value=f"#{ticket_pre}").click()
# 13.1 勾选想要的乘车人
driver.find_element(by="css selector", value='#normalPassenger_0').click()
# 13.2 提交订单
driver.find_element(by="css selector", value='#submitOrder_id').click()
driver.implicitly_wait(5)
# 13.3 选择靠窗的1F的位置 #erdeng1 > ul:nth-child(4) > li:nth-child(2) 是在浏览器右键copy selector选择出来的
# # 1F是不可以选中的
driver.find_element(by="css selector", value='#erdeng1 > ul:nth-child(4) > li:nth-child(2)').click()
# 13.4 再次确认提交
time.sleep(1)
# 如果此处没有响应多点击就好 -- 加上 "try -- except"
# driver.find_element(by="css selector", value='#qr_submit_id').click()
# driver.find_element(by="css selector", value='#qr_submit_id').click()
# driver.find_element(by="css selector", value='#qr_submit_id').click()
f = open('login.json', encoding='utf-8').read()
login = json.loads(f)
if __name__ == "__main__":
log_url, browser = browser_initial()
browser.get(log_url)
# 1.二维码登录 保存 -- cookie -- 用完关掉
# get_cookies(browser)
# 计算程序运行时间
# start = time.perf_counter()
# 2.自动登录
driver = login_cookie(log_url, browser)
# # 如果没有登录那就自动登录 -- 然后获得cookie自动保存
# # if browser.find_element(by="css selector", value="#login_user").text == "登录":
# # 3.自动买票
selenium_run(driver)
# end = time.perf_counter()
# runTime = end - start
# runTime_ms = runTime * 1000
# # 输出运行时间
# print("运行时间:", runTime, "秒")
# print("运行时间:", runTime_ms, "毫秒")
|