測試結果:
整個買票流程可以再快一點,不過為了穩定起見,有些地方等待了一些時間
完整程序,拿去可用
整個程序分了三個模塊:購票模塊(主體)、驗證碼識別模塊、余票查詢模塊
購票模塊:
from selenium import webdriverfrom selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from selenium.common.exceptions import NoSuchElementException, StaleElementReferenceException, ElementNotVisibleExceptionimport timeimport requestsfrom urllib.parse import urlencodefrom pyquery import PyQuery as pqfrom check_ticket import Checkfrom verify import Codeimport jsonclass Buy_Ticket(): def __init__(self, start_station, end_station, date, username, password, purpose): self.num = 1 self.start = start_station self.end = end_station self.date = date self.username = username self.password = password self.purpose = purpose self.login_url = 'https://kyfw.12306.cn/otn/login/init' self.ticket_url = 'https://kyfw.12306.cn/otn/leftTicket/init' def login(self): browser.get(self.login_url) try: input_name = browser.find_element_by_id('username') input_pd = browser.find_element_by_id('password') button = browser.find_element_by_id('loginSub') time.sleep(1) input_name.send_keys(self.username) input_pd.send_keys(self.password) c = Code(browser) #調用驗證碼識別模塊 c.main() button.click() time.sleep(2) #等待頁面跳轉,如果驗證碼識別錯誤,就執行下面的while語句 while browser.current_url == self.login_url + '#': c = Code(browser) c.main() button.click() time.sleep(2) #self.get_passenger() self.check() except NoSuchElementException: self.login() def check(self): #調用余票查詢模塊 check = Check(self.date, self.start, self.end, self.purpose) start_end = check.look_up_station() self.num = check.get_info() #cookie的添加,json.dumps把以漢字形式呈現的起始、終點站轉化成unicode編碼,可在審查元素里查看cookie browser.add_cookie({'name':'_jc_save_fromStation', 'value':json.dumps(self.start).strip('"').replace('//', '%') + '%2C' + start_end[0]}) browser.add_cookie({'name':'_jc_save_toStation', 'value':json.dumps(self.end).strip('"').replace('//', '%') + '%2C' + start_end[1]}) browser.add_cookie({'name':'_jc_save_fromDate', 'value':self.date}) browser.get(self.ticket_url) if self.purpose == '學生': btn = browser.find_element_by_id('sf2') time.sleep(1) btn.click() button = browser.find_element_by_id('query_ticket') time.sleep(1) button.click() def book_ticket(self): print('開始預訂車票...') #先查找出所有車次對應的預訂按鈕,再根據余票查詢模塊返回的車次序號,點擊相應的預訂按鈕 button = browser.find_elements_by_class_name('btn72') button[self.num-1].click() time.sleep(3) button2 = browser.find_element_by_id('normalPassenger_0') #按實際情況,可自行修改,這里就選擇的第一個常用聯系人, #第二個是normalPassenger_1,依此類推 button2.click() button3 = browser.find_element_by_id('submitOrder_id') time.sleep(1) button3.click() time.sleep(3) #等待頁面加載完畢,不然后面可能會報錯,等待時間自行決定 try: button4 = browser.find_element_by_id('qr_submit_id') button4.click() except ElementNotVisibleException: button4 = browser.find_element_by_id('qr_submit_id') button4.click() print('車票預定成功!請在30分鐘內完成付款!') def main(self): self.login() self.book_ticket()if __name__ == '__main__': begin = time.time() browser = webdriver.Chrome() b = Buy_Ticket('上海', '重慶', '2018-09-18', '賬號', '密碼', 'ADULT') #賬號、密碼自行修改 b.main() end = time.time() print('總耗時:%d秒' % int(end-begin)) #browser.close()
新聞熱點
疑難解答