偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Python實現(xiàn)全自動購買火車票!搶票回家過年咯

開發(fā) 后端
這里只進行了二等座的查詢和購票,想要買其他的自己也可以進行修改 1.進行車票的查詢 這里面需要注意的是在輸入目的地和起始地時需要先click一下文本框browser.find_element_by_id(‘fromStationText’).click() 不然輸入的地址無效 還有將日期的只讀屬性去掉。

這個是實現(xiàn)結(jié)果,因為一天只能取消三次,所以最后一步點擊確認被我注釋了。 

Python實現(xiàn)全自動購買火車票!搶票回家過年咯

1.首先實現(xiàn)使用selenium登陸12306

關(guān)于使用selenium實現(xiàn)12306登陸可以看我的另一篇文章 這里實現(xiàn)了使用selenium登陸12306,這次是基于上次的代碼進行修改實現(xiàn)全自動購買車票的 實現(xiàn)全自動登陸12306鏈接。

2.根據(jù)上面實現(xiàn)登陸后,實現(xiàn)購買火車票還需兩步

這里只進行了二等座的查詢和購票,想要買其他的自己也可以進行修改 1.進行車票的查詢 這里面需要注意的是在輸入目的地和起始地時需要先click一下文本框browser.find_element_by_id(‘fromStationText’).click() 不然輸入的地址無效 還有將日期的只讀屬性去掉。 

  1. def search_railway_ticket(fromstation,tostation,train_date): 
  2.     # 火車票頁面查詢url 
  3.     search_url = 'https://kyfw.12306.cn/otn/leftTicket/init?linktypeid=dc' 
  4.     # 轉(zhuǎn)到查詢車次頁面 
  5.     browser.get(search_url) 
  6.     time.sleep(2) 
  7.     #輸入出發(fā)地 
  8.     WebDriverWait(browser, 1000).until( 
  9.         EC.presence_of_element_located((By.ID, 'fromStationText')) 
  10.     ) 
  11.     #先點擊一下 
  12.     browser.find_element_by_id('fromStationText').click() 
  13.     browser.find_element_by_id('fromStationText').send_keys(fromstation) 
  14.     browser.find_element_by_id('fromStationText').send_keys(Keys.ENTER) 
  15.     time.sleep(1) 
  16.     WebDriverWait(browser, 1000).until( 
  17.         EC.presence_of_element_located((By.ID, 'toStationText')) 
  18.     ) 
  19.     #輸入目的地 
  20.     browser.find_element_by_id('toStationText').click() 
  21.     browser.find_element_by_id('toStationText').send_keys(tostation) 
  22.     browser.find_element_by_id('toStationText').send_keys(Keys.ENTER) 
  23.     time.sleep(5) 
  24.     #將日期的只讀屬性去掉 
  25.     js = 'document.getElementById("train_date").removeAttribute("readonly")' 
  26.     browser.execute_script(js) 
  27.     #去掉原本的時間 
  28.     WebDriverWait(browser, 1000).until( 
  29.         EC.presence_of_element_located((By.ID, 'train_date')) 
  30.     ) 
  31.     browser.find_element_by_id("train_date").clear() 
  32.     #輸入出發(fā)時間 
  33.     browser.find_element_by_id('train_date').send_keys(train_date) 
  34.     # 等待查詢按鈕是否可用 
  35.     WebDriverWait(browser, 1000).until( 
  36.         EC.element_to_be_clickable((By.ID, 'query_ticket')) 
  37.     ) 
  38.     searBtn = browser.find_element_by_id('query_ticket'
  39.     searBtn.click() 
  40.     print('點擊按鈕'

2.購買火車票 在這個函數(shù)中需要注意的是最好把最后一步注釋掉 browser.find_element_by_id(‘qr_submit_id’).click() 因為一天只能取消3次訂單。 

  1. def buy_ticket(fromstation,tostation,train_date,train_number,passenger): 
  2.  
  3.     #查詢火車票 
  4.     search_railway_ticket(fromstation,tostation,train_date) 
  5.     time.sleep(5) 
  6.     #獲取每一個車次的信息 
  7.     tr_list = browser.find_elements_by_xpath('.//tbody[@id="queryLeftTable"]/tr[not(@datatran)]'
  8.     for tr in tr_list: 
  9.         #獲取車次號 
  10.         number = tr.find_element_by_class_name('number').text 
  11.         if number in  train_number: 
  12.             #獲取是否還有票 
  13.             left_ticket = tr.find_element_by_xpath('./td[4]').text 
  14.             if left_ticket =='有'or left_ticket.isdigit: 
  15.                 print(f'{number}還有票'
  16.                 #點擊預訂 
  17.                 orderBtn = tr.find_element_by_class_name('btn72'
  18.                 orderBtn.click() 
  19.                 time.sleep(5) 
  20.                 #獲取12306中乘客的信息 
  21.                 passenger_list = browser.find_elements_by_xpath('//*[@id="normal_passenger_id"]/li'
  22.                 for li in passenger_list: 
  23.                     name = li.find_element_by_xpath('./label').text 
  24.                     print(name
  25.                     #配對12306人名 
  26.                     if name == passenger: 
  27.                         li.find_element_by_tag_name('input').click() 
  28.                 #提交訂單 
  29.                 submit = browser.find_element_by_id('submitOrder_id'
  30.                 submit.click() 
  31.                 WebDriverWait(browser, 1000).until( 
  32.                     EC.element_to_be_clickable((By.ID, 'qr_submit_id')) 
  33.                 ) 
  34.                 #一天只能取消3次 所以最好把最后一步注釋了 
  35.                 browser.find_element_by_id('qr_submit_id').click() 
  36.                 print('已經(jīng)提交訂單'
  37.                 break 

下面是源代碼

測試的時候可以把#click_captcha()這個點擊驗證碼的去掉自己手動點擊,這樣就不用扣超級鷹的積分(有錢的話當我沒說),留下了貧窮的淚水。 

  1. from selenium import webdriver 
  2. from selenium.webdriver import Actionchains 
  3. import time 
  4. from PIL import Image 
  5. import requests 
  6. from hashlib import md5 
  7. from selenium.webdriver import ChromeOptions 
  8. #驗證碼識別處理 
  9. from selenium.webdriver.common.keys import Keys 
  10. from selenium.webdriver.common.by import By 
  11. from selenium.webdriver.support.wait import WebDriverWait 
  12. from selenium.webdriver.support import expected_conditions as EC 
  13.  
  14. class Chaojiying_Client(object): 
  15.  
  16.     def __init__(self, username, password, soft_id): 
  17.         self.username = username 
  18.         password =  password.encode('utf8'
  19.         self.password = md5(password).hexdigest() 
  20.         self.soft_id = soft_id 
  21.         self.base_params = { 
  22.             'user': self.username, 
  23.             'pass2': self.password
  24.             'softid': self.soft_id, 
  25.         } 
  26.         self.headers = { 
  27.             'Connection''Keep-Alive'
  28.             'User-Agent''Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)'
  29.         } 
  30.  
  31.     def PostPic(self, im, codetype): 
  32.         ""
  33.         im: 圖片字節(jié) 
  34.         codetype: 題目類型 參考 http://www.chaojiying.com/price.html 
  35.         ""
  36.         params = { 
  37.             'codetype': codetype, 
  38.         } 
  39.         params.update(self.base_params) 
  40.         files = {'userfile': ('ccc.jpg', im)} 
  41.         r = requests.post('http://upload.chaojiying.net/Upload/Processing.php', data=params, files=files, headers=self.headers) 
  42.         return r.json() 
  43.  
  44.     def ReportError(self, im_id): 
  45.         ""
  46.         im_id:報錯題目的圖片ID 
  47.         ""
  48.         params = { 
  49.             'id': im_id, 
  50.         } 
  51.         params.update(self.base_params) 
  52.         r = requests.post('http://upload.chaojiying.net/Upload/ReportError.php', data=params, headers=self.headers) 
  53.         return r.json() 
  54.  
  55. def login(username,password): 
  56.     # 填寫賬號密碼 
  57.     browser.find_element_by_id('J-userName').send_keys(username) 
  58.     browser.find_element_by_id('J-password').send_keys(password
  59.  
  60.     # 獲取驗證碼 
  61.     get_captcha() 
  62.  
  63.     # 填寫驗證碼 
  64.     click_captcha() 
  65.  
  66.     #點擊登錄 
  67.     time.sleep(4) 
  68.     browser.find_element_by_id('J-login').click() 
  69.     time.sleep(4) 
  70.  
  71.     #滑動驗證碼 
  72.     slider() 
  73.  
  74.     print('成功登陸'
  75.     time.sleep(5) 
  76.  
  77. def slider(): 
  78.     #滑動驗證碼 
  79.     WebDriverWait(browser, 1000).until( 
  80.         EC.presence_of_element_located((By.XPATH, '//*[@id="nc_1_n1z"]')) 
  81.     ) 
  82.     span = browser.find_element_by_xpath('//*[@id="nc_1_n1z"]'
  83.     # 對div_tag進行滑動操作 
  84.     action = Actionchains(browser) 
  85.     # 點擊長按指定的標簽 
  86.     action.click_and_hold(span).perform() 
  87.     action.drag_and_drop_by_offset(span, 400, 0).perform() 
  88.  
  89. def click_captcha(): 
  90.     # 獲取驗證碼需要的為點擊位置 
  91.     chaojiying = Chaojiying_Client('自己的用戶名''密碼''軟件id')  # 用戶中心>>軟件ID 生成一個替換 96001 
  92.     im = open('./captcha.png''rb').read()  # 本地圖片文件路徑 來替換 a.jpg 有時WIN系統(tǒng)須要// 
  93.     location = chaojiying.PostPic(im, 9004)['pic_str']  # 1902 驗證碼類型  官方網(wǎng)站>>價格體系 3.4+版 print 后要加() 
  94.     print(chaojiying.PostPic(im, 9004)) 
  95.     # 將位置進行分割成    [  [  ], [ ], [ ]  ]類型 
  96.     location_list = [i.split(','for i in location.split('|')] 
  97.     for l in location_list: 
  98.         x = l[0] 
  99.         y = l[1] 
  100.         Actionchains(browser).move_to_element_with_offset(browser.find_element_by_class_name('login-pwd-code'), int(x),int(y)).click().perform() 
  101.         time.sleep(0.5) 
  102.  
  103. def get_captcha(): 
  104.     # 獲取網(wǎng)頁的截圖 
  105.     allscreen = browser.get_screenshot_as_file('allscreen.png'
  106.     # 獲取captcha 
  107.     captcha = browser.find_element_by_class_name('login-pwd-code'
  108.     # 獲取captcha的左上角位置 
  109.     location = captcha.location 
  110.     # 獲取圖片大小 
  111.     size = captcha.size 
  112.     # 裁取captcha 
  113.     rangle = (location['x'],location['y'],(location['x']+size['width']),(location['y']+size['height'])) 
  114.     i = Image.open('./allscreen.png'
  115.     captcha_img = './captcha.png' 
  116.     frame = i.crop(rangle) 
  117.     frame.save(captcha_img) 
  118.  
  119. def buy_ticket(fromstation,tostation,train_date,train_number,passenger): 
  120.  
  121.     #查詢火車票 
  122.     search_railway_ticket(fromstation,tostation,train_date) 
  123.     time.sleep(5) 
  124.     tr_list = browser.find_elements_by_xpath('.//tbody[@id="queryLeftTable"]/tr[not(@datatran)]'
  125.     for tr in tr_list: 
  126.         number = tr.find_element_by_class_name('number').text 
  127.         if number in  train_number: 
  128.             left_ticket = tr.find_element_by_xpath('./td[4]').text 
  129.             if left_ticket =='有'or left_ticket.isdigit: 
  130.                 print(f'{number}還有票'
  131.                 orderBtn = tr.find_element_by_class_name('btn72'
  132.                 orderBtn.click() 
  133.                 time.sleep(5) 
  134.                 passenger_list = browser.find_elements_by_xpath('//*[@id="normal_passenger_id"]/li'
  135.                 for li in passenger_list: 
  136.                     name = li.find_element_by_xpath('./label').text 
  137.                     if name == passenger: 
  138.                         li.find_element_by_tag_name('input').click() 
  139.                 submit = browser.find_element_by_id('submitOrder_id'
  140.                 submit.click() 
  141.                 WebDriverWait(browser, 1000).until( 
  142.                     EC.element_to_be_clickable((By.ID, 'qr_submit_id')) 
  143.                 ) 
  144.                 #一天只能取消3次 所以把最后一步注釋了 
  145.                 # browser.find_element_by_id('qr_submit_id').click() 
  146.                 print('已經(jīng)提交訂單'
  147.                 break 
  148.  
  149. def search_railway_ticket(fromstation,tostation,train_date): 
  150.     # 火車票頁面查詢url 
  151.     search_url = 'https://kyfw.12306.cn/otn/leftTicket/init?linktypeid=dc' 
  152.     # 轉(zhuǎn)到查詢車次頁面 
  153.     browser.get(search_url) 
  154.     time.sleep(2) 
  155.     #輸入出發(fā)地 
  156.     WebDriverWait(browser, 1000).until( 
  157.         EC.presence_of_element_located((By.ID, 'fromStationText')) 
  158.     ) 
  159.     #先點擊一下 
  160.     browser.find_element_by_id('fromStationText').click() 
  161.     browser.find_element_by_id('fromStationText').send_keys(fromstation) 
  162.     browser.find_element_by_id('fromStationText').send_keys(Keys.ENTER) 
  163.     time.sleep(1) 
  164.     WebDriverWait(browser, 1000).until( 
  165.         EC.presence_of_element_located((By.ID, 'toStationText')) 
  166.     ) 
  167.     #輸入目的地 
  168.     browser.find_element_by_id('toStationText').click() 
  169.     browser.find_element_by_id('toStationText').send_keys(tostation) 
  170.     browser.find_element_by_id('toStationText').send_keys(Keys.ENTER) 
  171.     time.sleep(5) 
  172.     #將日期的只讀屬性去掉 
  173.     js = 'document.getElementById("train_date").removeAttribute("readonly")' 
  174.     browser.execute_script(js) 
  175.     #去掉原本的時間 
  176.     WebDriverWait(browser, 1000).until( 
  177.         EC.presence_of_element_located((By.ID, 'train_date')) 
  178.     ) 
  179.     browser.find_element_by_id("train_date").clear() 
  180.     #輸入出發(fā)時間 
  181.     browser.find_element_by_id('train_date').send_keys(train_date) 
  182.     # 等待查詢按鈕是否可用 
  183.     WebDriverWait(browser, 1000).until( 
  184.         EC.element_to_be_clickable((By.ID, 'query_ticket')) 
  185.     ) 
  186.     searBtn = browser.find_element_by_id('query_ticket'
  187.     searBtn.click() 
  188.     print('點擊按鈕'
  189.  
  190. if __name__ == '__main__'
  191.     option = ChromeOptions()  # 實例化一個ChromeOptions對象 
  192.     option.add_experimental_option('excludeSwitches', ['enable-automation'])  # 以鍵值對的形式加入?yún)?shù) 
  193.     option.add_experimental_option('useAutomationExtension'False
  194.  
  195.     browser = webdriver.Chrome(options=option
  196.     # 獲取響應(yīng) 
  197.     browser.get('https://kyfw.12306.cn/otn/resources/login.html'
  198.     script = 'Object.defineProperty(navigator,"webdriver",{get:()=>undefined,});' 
  199.     browser.execute_script(script) 
  200.     browser.maximize_window() 
  201.     time.sleep(1) 
  202.  
  203.     # 點擊賬號登陸 
  204.     browser.find_element_by_class_name('login-hd-account').click() 
  205.     #登陸12306的賬號密碼 
  206.     login('用戶名','密碼'
  207.     time.sleep(4) 
  208.     #例buy_ticket('南昌','撫州北','2020-12-15','D2241','xx'
  209.     buy_ticket('起始地','目的地','出發(fā)日期','車次','姓名'

 【編輯推薦】

 

責任編輯:未麗燕 來源: 今日頭條
相關(guān)推薦

2018-12-29 16:24:58

Python12306火車票

2018-01-10 22:19:44

2013-01-07 17:34:47

火車票搶票瀏覽器

2018-01-02 09:56:04

Python12306火車票

2013-01-21 13:07:31

傲游云瀏覽器

2012-01-05 13:14:42

火車票

2013-01-23 11:24:57

360瀏覽器搶票

2011-01-28 15:48:11

Chrome插件Page Monito火車票

2016-08-31 13:26:24

PythonPython3工具

2018-01-05 09:33:10

Python火車票春運

2013-09-18 13:17:58

傲游云瀏覽器

2015-02-11 19:39:16

114啦機票頻道

2013-01-31 10:02:25

產(chǎn)品經(jīng)理火車

2014-12-10 12:28:18

安卓市場

2020-01-13 07:42:01

技術(shù)研發(fā)指標

2018-01-22 12:00:38

馬云人工智能12306

2018-10-23 11:16:59

12306思路余票

2011-01-24 15:37:32

火車票
點贊
收藏

51CTO技術(shù)棧公眾號