成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Python實現全自動購買火車票!搶票回家過年咯

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

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

Python實現全自動購買火車票!搶票回家過年咯

1.首先實現使用selenium登陸12306

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

2.根據上面實現登陸后,實現購買火車票還需兩步

這里只進行了二等座的查詢和購票,想要買其他的自己也可以進行修改 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.     # 轉到查詢車次頁面 
  5.     browser.get(search_url) 
  6.     time.sleep(2) 
  7.     #輸入出發地 
  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.     #輸入出發時間 
  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.購買火車票 在這個函數中需要注意的是最好把最后一步注釋掉 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('已經提交訂單'
  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: 圖片字節 
  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系統須要// 
  93.     location = chaojiying.PostPic(im, 9004)['pic_str']  # 1902 驗證碼類型  官方網站>>價格體系 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.     # 獲取網頁的截圖 
  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('已經提交訂單'
  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.     # 轉到查詢車次頁面 
  153.     browser.get(search_url) 
  154.     time.sleep(2) 
  155.     #輸入出發地 
  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.     #輸入出發時間 
  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'])  # 以鍵值對的形式加入參數 
  193.     option.add_experimental_option('useAutomationExtension'False
  194.  
  195.     browser = webdriver.Chrome(options=option
  196.     # 獲取響應 
  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('起始地','目的地','出發日期','車次','姓名'

 【編輯推薦】

 

責任編輯:未麗燕 來源: 今日頭條
相關推薦

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

傲游云瀏覽器

2013-01-23 11:24:57

360瀏覽器搶票

2012-01-05 13:14:42

火車票

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

產品經理火車

2020-01-13 07:42:01

技術研發指標

2018-01-22 12:00:38

馬云人工智能12306

2014-12-10 12:28:18

安卓市場

2013-09-16 13:09:56

瀏覽器

2011-01-24 15:37:32

火車票
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产激情一区二区三区 | 丝袜久久 | 999www视频免费观看 | 91视频www.| 天天操网 | 亚洲国产二区 | 男女羞羞视频在线 | 日韩国产在线观看 | 日本高清视频网站 | 夫妻午夜影院 | 久久毛片| 亚洲精品欧美一区二区三区 | 欧美亚洲国产一区 | 五月激情综合网 | 欧美日韩精品在线一区 | 日韩中文字幕网 | www亚洲免费国内精品 | 偷拍自拍在线观看 | 亚洲狠狠爱一区二区三区 | 国产伦精品一区二区三区四区视频 | 91在线精品一区二区 | 精品在线看 | 91精品无人区卡一卡二卡三 | 美国一级毛片a | 久久久精 | 精品国产精品三级精品av网址 | japanhd成人| 2019天天干天天操 | 国产91亚洲精品一区二区三区 | 97伦理最新伦理 | 国产精品久久久久久中文字 | av在线免费观看网址 | 久久久久国产 | 国产又色又爽又黄又免费 | 五月天国产在线 | 欧美专区日韩 | 国产一区91精品张津瑜 | 久久99成人 | 午夜精品久久久久久久99黑人 | 亚洲精品欧美一区二区三区 | 欧美专区日韩专区 |