微網(wǎng)站功能介紹網(wǎng)站搭建公司哪家好
提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔
python實現(xiàn)自動登錄12306搶票 -- selenium
- 前言
- 其實網(wǎng)上也出現(xiàn)了很多12306的代碼,但是都不是最新的,我也是從網(wǎng)上找別人的帖子,看B站視頻,然后寫成了這個程序,想分享一下。其中我會說自己遇到的問題以及自己的一個改進(jìn)。
- 一、遇到的問題?
- 1.url-正確的表頭:就是首先url不要寫錯了,然后一定要加正確的表頭,才可以拿到數(shù)據(jù),就是我日期填寫錯誤,然后生成的url就有問題,浪費了好多時間。日期:2024-01-09 ,不要加兩個杠。。。
- 2.:注意用網(wǎng)頁顯示的user-agent:
- 3.拿到車票信息的json數(shù)據(jù)--代碼展示
- 4. 12306的城市對應(yīng)的代碼json文件,大家可以去網(wǎng)上找下,然后自己編程寫一下,我這個也花了一些時間鍛煉自己
- 4.對拿到的車次json數(shù)據(jù)進(jìn)行可視化處理,也生成一個列表信息,代碼如下
- 5.程序進(jìn)入到自動化代碼 -- 自動登錄 --自動搶票,這里要注意有些操作一定要有時間等待,time.sleep(2)等,是不可以刪除的否則會報錯,因為操作太快,瀏覽器沒有反應(yīng)過來。
- 至此,這個程序完全結(jié)束了。這也是最近春節(jié)要搶票我特意寫的。主要都是學(xué)習(xí)別人的代碼,但是有幾個改進(jìn)是自己學(xué)了爬蟲,然后結(jié)合網(wǎng)頁的變化(很多程序是2021,2022的,現(xiàn)在12306的網(wǎng)頁有所改變),所寫的。
- 二、改進(jìn)
- 1.xpath語法中@id 或者說可以@元素,但是selenium不可以要拆成兩部來寫。,而且新的selenium語法和前幾年的也有所區(qū)別。
- 2.預(yù)定按鈕的元素定位我沒有寫死可以自己定義,也就是可以自己選擇預(yù)定那躺車,比如1,3,4,11等,隨便選擇。因為這里是用了xpath語法去找到了所有的預(yù)訂按鈕。這個num你也可以放在login.json當(dāng)中,這樣更方面搶票。login.json就是一個字典序列,我是將要填寫的東西都放進(jìn)去。這樣不用手動填寫。
- 3.源代碼完整展示
- 三、進(jìn)階--展望
- 1.首先可以將自動化操作用try--except,這樣不會一直報錯,更為規(guī)范。
- 2.免登錄:因為登錄其實要驗證碼,這樣搶票也不方便。于是我就又繼續(xù)學(xué)習(xí)了一些,發(fā)現(xiàn)了兩種方法一是可以保存瀏覽器的數(shù)據(jù),因為selenium每次打開的是一個新的程序,但是我們可以通過設(shè)置參數(shù),讓他打開是有記憶的,但是沒有用。第二種,是cookie,是沒有什么問題的,目前已經(jīng)實現(xiàn),接下嘗試各種方法的cookie看行不行。后續(xù)我會發(fā)此程序。
- 3.多線程多進(jìn)程:主要我已經(jīng)實現(xiàn)cookie免登錄,我想著是否可以打開多個頁面,然后多個賬號,一起搶他們所需要的票呢。
- 總結(jié)
- 1.最開始跟著寫這個程序只會照著抄,然后根本不懂,后面就是差了一點點成功,也不會找錯誤。
- 2.后面學(xué)習(xí)了一下爬蟲,更明白一點語法以及自己也更會如何定位元素了。還有就是request的一個請求,這些代碼也更看得懂了
- 3.想著結(jié)合多線程然后實現(xiàn)批量搶票,同時也希望代價的容錯率高,也就是說在自動化不用點幾下程序就不行了,讓它可以有更好的性能。-- 未來學(xué)習(xí)的一個點。加油!!!
前言
其實網(wǎng)上也出現(xiàn)了很多12306的代碼,但是都不是最新的,我也是從網(wǎng)上找別人的帖子,看B站視頻,然后寫成了這個程序,想分享一下。其中我會說自己遇到的問題以及自己的一個改進(jìn)。
提示:以下是本篇文章正文內(nèi)容,下面案例可供參考
一、遇到的問題?
1.url-正確的表頭:就是首先url不要寫錯了,然后一定要加正確的表頭,才可以拿到數(shù)據(jù),就是我日期填寫錯誤,然后生成的url就有問題,浪費了好多時間。日期:2024-01-09 ,不要加兩個杠。。。
2.:注意用網(wǎng)頁顯示的user-agent:
3.拿到車票信息的json數(shù)據(jù)–代碼展示
import requests
from prettytable import PrettyTable
# 下面的模塊就是打開瀏覽器的操作模塊
from selenium import webdriver
from selenium.webdriver.common.keys import Keys# 獲取瀏覽器的用戶數(shù)據(jù)
# chrome ==> chrome://version/
# 個人資料路徑 C:\Users\hl\AppData\Local\Temp\scoped_dir18416_1206036739\Default
# 路徑的Default要去掉
path = r'D:\game\chromedriver.exe'
user_data_dir = r'C:\Users\hl\AppData\Local\Temp\scoped_dir18416_1206036739'from pypinyin import pinyin, Style
import json
import time"""
發(fā)送請求:模擬瀏覽器對于url地址發(fā)送請求
"""
"""根據(jù)用戶自行輸入相關(guān)信息,進(jìn)行查票搜索"""
# 讀取城市文件
f = open('city_all.json', encoding='utf-8').read()
city_data = json.loads(f)
print(city_data)# 輸入出發(fā)和目的城市
# 輸入時間
train_date = '2025-01-09'
from_city = input('請輸出你出發(fā)的城市:')
to_city = input('請輸出你要出行的城市:')
print(city_data[from_city])
print(city_data[to_city])headers = {'user-agent':'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Mobile Safari/537.36',}# 請求網(wǎng)址
# https://kyfw.12306.cn/otn/leftTicket/queryG?leftTicketDTO.train_date=2025-01-06&leftTicketDTO.from_station=SZQ&leftTicketDTO.to_station=EFG&purpose_codes=ADULT
url = f'https://kyfw.12306.cn/otn/leftTicket/queryG?leftTicketDTO.train_date={train_date}&leftTicketDTO.from_station={city_data[from_city]}&leftTicketDTO.to_station={city_data[to_city]}&purpose_codes=ADULT'# 發(fā)送請求 使用request
response = requests.get(url=url, headers=headers)
print(url)
print(response.status_code)
print(response.text)
# 獲取數(shù)據(jù)
json_data = response.json()
4. 12306的城市對應(yīng)的代碼json文件,大家可以去網(wǎng)上找下,然后自己編程寫一下,我這個也花了一些時間鍛煉自己
4.對拿到的車次json數(shù)據(jù)進(jìn)行可視化處理,也生成一個列表信息,代碼如下
import requests
from prettytable import PrettyTable
# 下面的模塊就是打開瀏覽器的操作模塊
from selenium import webdriver
from selenium.webdriver.common.keys import Keys# 獲取瀏覽器的用戶數(shù)據(jù)
# chrome ==> chrome://version/
# 個人資料路徑 C:\Users\hl\AppData\Local\Temp\scoped_dir18416_1206036739\Default
# 路徑的Default要去掉
path = r'D:\game\chromedriver.exe'
user_data_dir = r'C:\Users\hl\AppData\Local\Temp\scoped_dir18416_1206036739'from pypinyin import pinyin, Style
import json
import time"""
發(fā)送請求:模擬瀏覽器對于url地址發(fā)送請求
"""
"""根據(jù)用戶自行輸入相關(guān)信息,進(jìn)行查票搜索"""
# 讀取城市文件
f = open('city_all.json', encoding='utf-8').read()
city_data = json.loads(f)
print(city_data)# 輸入出發(fā)和目的城市
# 輸入時間
train_date = '2025-01-09'
from_city = '深圳'
to_city = '廣州'
print(city_data[from_city])
print(city_data[to_city])headers = {'cookie':f'_uab_collina=173526990403562156621352; JSESSIONID=1B8F19FC6675BDA9782FEA7B06BDC256; route=9036359bb8a8a461c164a04f8f50b252; BIGipServerotn=1725497610.24610.0000; BIGipServerpassport=1005060362.50215.0000; guidesStatus=off; highContrastMode=defaltMode; cursorStatus=off; _jc_save_fromStation=%u6DF1%u5733%2CSZQ; _jc_save_toStation=%u4FE1%u4E30%2CEFG; _jc_save_fromDate={train_date}; _jc_save_wfdc_flag=dc; _jc_save_toDate=2024-12-28','user-agent':'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Mobile Safari/537.36',}# 請求網(wǎng)址
# https://kyfw.12306.cn/otn/leftTicket/queryG?leftTicketDTO.train_date=2025-01-06&leftTicketDTO.from_station=SZQ&leftTicketDTO.to_station=EFG&purpose_codes=ADULT
url = f'https://kyfw.12306.cn/otn/leftTicket/queryG?leftTicketDTO.train_date={train_date}&leftTicketDTO.from_station={city_data[from_city]}&leftTicketDTO.to_station={city_data[to_city]}&purpose_codes=ADULT'# 發(fā)送請求 使用request
response = requests.get(url=url, headers=headers)
print(url)
print(response.status_code)
print(response.text)
# 獲取數(shù)據(jù)
json_data = response.json()# 解析數(shù)據(jù)--字典取值:
result = json_data['data']['result']# 實例化對象
tb = PrettyTable()
tb.field_names = ['序號','車次','出發(fā)時間','到達(dá)時間','耗時','特等座','一等座','二等座','軟臥','硬臥','硬座','無座',
]# 定義一個打印序號page
page = 1
# for循環(huán)遍歷,提取列表里面的元素
for i in result:# 字符串分割,返回列表index = i.split('|')# 通過列表索引位置取值num = index[3] # 車次star_time = index[8] # 出發(fā)時間arrive_time = index[9] # 到達(dá)時間use_time = index[10] # 耗時special_class = index[32] # 特等座frist_class = index[31] # 一等座second_class = index[30] # 二等座hard_sleeper = index[28] # 硬臥hard_seat = index[29] # 硬座no_seat = index[26] # 無座soft_sleeper = index[23]# 軟臥dict = {'序號':'page','車次':'num','出發(fā)時間':'star_time','到達(dá)時間':'arrive_time','耗時':'use_time','特等座':'special_class','一等座':'frist_class','二等座':'second_class','軟臥':'soft_sleeper','硬臥':'hard_sleeper','硬座':'hard_seat','無座': 'no_seat'}tb.add_row([page, #序號索引num, # 車次star_time,# 出發(fā)時間arrive_time,# 到達(dá)時間use_time, # 耗時special_class, # 特等座frist_class, # 一等座second_class,# 二等座soft_sleeper, # 軟臥hard_sleeper,# 硬臥hard_seat, # 硬座no_seat,# 無座])page += 1
print(tb)
5.程序進(jìn)入到自動化代碼 – 自動登錄 --自動搶票,這里要注意有些操作一定要有時間等待,time.sleep(2)等,是不可以刪除的否則會報錯,因為操作太快,瀏覽器沒有反應(yīng)過來。
def selenium_login():# 0.配置谷歌瀏覽器加載項options = webdriver.ChromeOptions()options.add_argument(f'--user-data-dir={user_data_dir}') # 添加瀏覽器數(shù)劇# 1.將加載項配置到啟動瀏覽器中 打開/創(chuàng)建瀏覽器對象driver = webdriver.Chrome(executable_path=r'D:\game\chromedriver.exe', options=options)# 2.輸入網(wǎng)址driver.get('https://kyfw.12306.cn/otn/view/index.html')# 3.輸入賬號 -- > 找到賬號的輸入框 selenium 通過元素面板去定位元素driver.find_element(by="css selector", value="#J-userName").send_keys(login['account'])# 4.輸入密碼 -- > 找到密碼的輸入框driver.find_element(by="css selector", value="#J-password").send_keys(login['password'])# 5.點擊登錄按鈕driver.find_element(by="css selector", value="#J-login").click()time.sleep(0.5)# 6.輸入身份證后4位driver.find_element(by="css selector", value="#id_card").send_keys(login['id_card'])# 7.點擊獲取驗證碼driver.find_element(by="css selector", value="#verification_code").click()# 8.輸入驗證碼code = input("請輸入驗證碼:")driver.find_element(by="css selector", value="#code").send_keys(code)driver.find_element(by="css selector", value="#verification_code").click()# 9.點擊確認(rèn)按鈕driver.find_element(by="css selector", value="#sureClick").click()# 有時候報錯是需要延時等待 用 driver.implicitly_wait(10)代碼 可以實現(xiàn)加載完就就進(jìn)行下一步,# 而time.sleep(5)則必須等我規(guī)定的時間driver.implicitly_wait(5)# 10,點擊車票預(yù)定按鈕driver.find_element(by="css selector", value="#link_for_ticket").click()# 11.1 選擇出發(fā)的城市--點擊那個框driver.find_element(by="css selector", value="#fromStationText").click()# 11.2 選擇出發(fā)的城市--選擇城市driver.find_element(by="css selector", value="#fromStationText").send_keys(from_city)# 11.3 選擇出發(fā)的城市--回車確定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(to_city)# 12.3 選擇目的的城市--回車確定driver.find_element(by="css selector", value="#toStationText").send_keys(Keys.ENTER)# 13.1 選擇出發(fā)的日期--點擊那個框driver.find_element(by="css selector", value="#train_date").clear()# 12.2 選擇出發(fā)的日期--選擇城市driver.find_element(by="css selector", value="#train_date").send_keys(train_date)# 12.3 選擇出發(fā)的日期--回車確定driver.find_element(by="css selector", value="#train_date").send_keys(Keys.ENTER)# # 12.4 點擊--顯示全部可預(yù)訂的車次# 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('請輸入您想要的車次:'))# 點擊預(yù)訂按鈕 -- 選擇要預(yù)定的是第幾躺車 -- 這個代碼沒有問題# 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[num].get_attribute("id")ticket_pre = ticket_num + ' > td.no-br'# 12.6 點擊想要車次的預(yù)定按鈕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的位置# driver.find_element(by="css selector", value='#1F').click() --這種行不通,只能下方這種driver.find_element(by="css selector", value='#erdeng1 > ul:nth-child(4) > li:nth-child(2)').click()# 13.4 再次確認(rèn)提交time.sleep(2)driver.find_element(by="css selector", value='#qr_submit_id').click()# driver.find_element(by="css selector", value='#qr_submit_id').click()# # 14. 網(wǎng)上支付 -- payButton# driver.find_element(by="css selector", value='#payButton').click()# # 15. 取消訂單 -- cancelButton# driver.find_element(by="css selector", value='#cancelButton').click()
至此,這個程序完全結(jié)束了。這也是最近春節(jié)要搶票我特意寫的。主要都是學(xué)習(xí)別人的代碼,但是有幾個改進(jìn)是自己學(xué)了爬蟲,然后結(jié)合網(wǎng)頁的變化(很多程序是2021,2022的,現(xiàn)在12306的網(wǎng)頁有所改變),所寫的。
二、改進(jìn)
1.xpath語法中@id 或者說可以@元素,但是selenium不可以要拆成兩部來寫。,而且新的selenium語法和前幾年的也有所區(qū)別。
# 點擊預(yù)訂按鈕 -- 選擇要預(yù)定的是第幾躺車 -- 這個代碼沒有問題# 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[num].get_attribute("id")ticket_pre = ticket_num + ' > td.no-br'
2.預(yù)定按鈕的元素定位我沒有寫死可以自己定義,也就是可以自己選擇預(yù)定那躺車,比如1,3,4,11等,隨便選擇。因為這里是用了xpath語法去找到了所有的預(yù)訂按鈕。這個num你也可以放在login.json當(dāng)中,這樣更方面搶票。login.json就是一個字典序列,我是將要填寫的東西都放進(jìn)去。這樣不用手動填寫。
num = int(input('請輸入您想要的車次:'))# 點擊預(yù)訂按鈕 -- 選擇要預(yù)定的是第幾躺車 -- 這個代碼沒有問題# 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[num].get_attribute("id")ticket_pre = ticket_num + ' > td.no-br'
login.json的內(nèi)容展示
3.源代碼完整展示
import requests
from prettytable import PrettyTable
# 下面的模塊就是打開瀏覽器的操作模塊
from selenium import webdriver
from selenium.webdriver.common.keys import Keys# 獲取瀏覽器的用戶數(shù)據(jù)
# chrome ==> chrome://version/
# 個人資料路徑 C:\Users\hl\AppData\Local\Temp\scoped_dir18416_1206036739\Default
# 路徑的Default要去掉
path = r'D:\game\chromedriver.exe'
user_data_dir = r'C:\Users\hl\AppData\Local\Temp\scoped_dir18416_1206036739'from pypinyin import pinyin, Style
import json
import time"""
發(fā)送請求:模擬瀏覽器對于url地址發(fā)送請求
"""
"""根據(jù)用戶自行輸入相關(guān)信息,進(jìn)行查票搜索"""
# 讀取城市文件
f = open('city_all.json', encoding='utf-8').read()
city_data = json.loads(f)
print(city_data)# 輸入出發(fā)和目的城市
# 輸入時間
train_date = '2025-01-09'
from_city = '深圳'
to_city = '廣州'
print(city_data[from_city])
print(city_data[to_city])headers = {'cookie':f'_uab_collina=173526990403562156621352; JSESSIONID=1B8F19FC6675BDA9782FEA7B06BDC256; route=9036359bb8a8a461c164a04f8f50b252; BIGipServerotn=1725497610.24610.0000; BIGipServerpassport=1005060362.50215.0000; guidesStatus=off; highContrastMode=defaltMode; cursorStatus=off; _jc_save_fromStation=%u6DF1%u5733%2CSZQ; _jc_save_toStation=%u4FE1%u4E30%2CEFG; _jc_save_fromDate={train_date}; _jc_save_wfdc_flag=dc; _jc_save_toDate=2024-12-28','user-agent':'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Mobile Safari/537.36',}# 請求網(wǎng)址
# https://kyfw.12306.cn/otn/leftTicket/queryG?leftTicketDTO.train_date=2025-01-06&leftTicketDTO.from_station=SZQ&leftTicketDTO.to_station=EFG&purpose_codes=ADULT
url = f'https://kyfw.12306.cn/otn/leftTicket/queryG?leftTicketDTO.train_date={train_date}&leftTicketDTO.from_station={city_data[from_city]}&leftTicketDTO.to_station={city_data[to_city]}&purpose_codes=ADULT'# 發(fā)送請求 使用request
response = requests.get(url=url, headers=headers)
print(url)
print(response.status_code)
print(response.text)
# 獲取數(shù)據(jù)
json_data = response.json()# 解析數(shù)據(jù)--字典取值:
result = json_data['data']['result']def print_ticketlist():# 實例化對象tb = PrettyTable()tb.field_names = ['序號','車次','出發(fā)時間','到達(dá)時間','耗時','特等座','一等座','二等座','軟臥','硬臥','硬座','無座',]# 定義一個打印序號pagepage = 1# for循環(huán)遍歷,提取列表里面的元素for i in result:# 字符串分割,返回列表index = i.split('|')# 通過列表索引位置取值num = index[3] # 車次star_time = index[8] # 出發(fā)時間arrive_time = index[9] # 到達(dá)時間use_time = index[10] # 耗時special_class = index[32] # 特等座frist_class = index[31] # 一等座second_class = index[30] # 二等座hard_sleeper = index[28] # 硬臥hard_seat = index[29] # 硬座no_seat = index[26] # 無座soft_sleeper = index[23]# 軟臥dict = {'序號':'page','車次':'num','出發(fā)時間':'star_time','到達(dá)時間':'arrive_time','耗時':'use_time','特等座':'special_class','一等座':'frist_class','二等座':'second_class','軟臥':'soft_sleeper','硬臥':'hard_sleeper','硬座':'hard_seat','無座': 'no_seat'}tb.add_row([page, #序號索引num, # 車次star_time,# 出發(fā)時間arrive_time,# 到達(dá)時間use_time, # 耗時special_class, # 特等座frist_class, # 一等座second_class,# 二等座soft_sleeper, # 軟臥hard_sleeper,# 硬臥hard_seat, # 硬座no_seat,# 無座])page += 1print(tb)# def change_chinese(chinese):
# """把中文自動轉(zhuǎn)換為拼音"""
# text = pinyin(chinese, style=Style.NORMAL)
# string = ''.join(t[0] for t in text)
# return stringdef selenium_login():# 0.配置谷歌瀏覽器加載項options = webdriver.ChromeOptions()options.add_argument(f'--user-data-dir={user_data_dir}') # 添加瀏覽器數(shù)劇# 1.將加載項配置到啟動瀏覽器中 打開/創(chuàng)建瀏覽器對象driver = webdriver.Chrome(executable_path=r'D:\game\chromedriver.exe', options=options)# 2.輸入網(wǎng)址driver.get('https://kyfw.12306.cn/otn/view/index.html')# 3.輸入賬號 -- > 找到賬號的輸入框 selenium 通過元素面板去定位元素driver.find_element(by="css selector", value="#J-userName").send_keys(login['account'])# 4.輸入密碼 -- > 找到密碼的輸入框driver.find_element(by="css selector", value="#J-password").send_keys(login['password'])# 5.點擊登錄按鈕driver.find_element(by="css selector", value="#J-login").click()time.sleep(0.5)# 6.輸入身份證后4位driver.find_element(by="css selector", value="#id_card").send_keys(login['id_card'])# 7.點擊獲取驗證碼driver.find_element(by="css selector", value="#verification_code").click()# 8.輸入驗證碼code = input("請輸入驗證碼:")driver.find_element(by="css selector", value="#code").send_keys(code)driver.find_element(by="css selector", value="#verification_code").click()# 9.點擊確認(rèn)按鈕driver.find_element(by="css selector", value="#sureClick").click()# 有時候報錯是需要延時等待 用 driver.implicitly_wait(10)代碼 可以實現(xiàn)加載完就就進(jìn)行下一步,# 而time.sleep(5)則必須等我規(guī)定的時間driver.implicitly_wait(5)# 10,點擊車票預(yù)定按鈕driver.find_element(by="css selector", value="#link_for_ticket").click()# 11.1 選擇出發(fā)的城市--點擊那個框driver.find_element(by="css selector", value="#fromStationText").click()# 11.2 選擇出發(fā)的城市--選擇城市driver.find_element(by="css selector", value="#fromStationText").send_keys(from_city)# 11.3 選擇出發(fā)的城市--回車確定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(to_city)# 12.3 選擇目的的城市--回車確定driver.find_element(by="css selector", value="#toStationText").send_keys(Keys.ENTER)# 13.1 選擇出發(fā)的日期--點擊那個框driver.find_element(by="css selector", value="#train_date").clear()# 12.2 選擇出發(fā)的日期--選擇城市driver.find_element(by="css selector", value="#train_date").send_keys(train_date)# 12.3 選擇出發(fā)的日期--回車確定driver.find_element(by="css selector", value="#train_date").send_keys(Keys.ENTER)# # 12.4 點擊--顯示全部可預(yù)訂的車次# 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('請輸入您想要的車次:'))# 點擊預(yù)訂按鈕 -- 選擇要預(yù)定的是第幾躺車 -- 這個代碼沒有問題# 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[num].get_attribute("id")ticket_pre = ticket_num + ' > td.no-br'# 12.6 點擊想要車次的預(yù)定按鈕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的位置# driver.find_element(by="css selector", value='#1F').click() --這種行不通,只能下方這種driver.find_element(by="css selector", value='#erdeng1 > ul:nth-child(4) > li:nth-child(2)').click()# 13.4 再次確認(rèn)提交time.sleep(2)driver.find_element(by="css selector", value='#qr_submit_id').click()# driver.find_element(by="css selector", value='#qr_submit_id').click()# # 14. 網(wǎng)上支付 -- payButton# driver.find_element(by="css selector", value='#payButton').click()# # 15. 取消訂單 -- cancelButton# driver.find_element(by="css selector", value='#cancelButton').click()f = open('login.json', encoding='utf-8').read()
login = json.loads(f)if __name__ == "__main__":print_ticketlist()selenium_login()