自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

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

這個(gè)是實(shí)現(xiàn)結(jié)果,因?yàn)橐惶熘荒苋∠?,所以最后一步點(diǎn)擊確認(rèn)被我注釋了。 

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

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

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

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

這里只進(jìn)行了二等座的查詢和購票,想要買其他的自己也可以進(jìn)行修改 1.進(jìn)行車票的查詢 這里面需要注意的是在輸入目的地和起始地時(shí)需要先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.     #先點(diǎn)擊一下 
  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.     #去掉原本的時(shí)間 
  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ā)時(shí)間 
  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('點(diǎn)擊按鈕'

2.購買火車票 在這個(gè)函數(shù)中需要注意的是最好把最后一步注釋掉 browser.find_element_by_id(‘qr_submit_id’).click() 因?yàn)橐惶熘荒苋∠?次訂單。 

  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.     #獲取每一個(gè)車次的信息 
  7.     tr_list = browser.find_elements_by_xpath('.//tbody[@id="queryLeftTable"]/tr[not(@datatran)]'
  8.     for tr in tr_list: 
  9.         #獲取車次號(hào) 
  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.                 #點(diǎn)擊預(yù)訂 
  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.                     #配對(duì)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 

下面是源代碼

測試的時(shí)候可以把#click_captcha()這個(gè)點(diǎn)擊驗(yàn)證碼的去掉自己手動(dòng)點(diǎn)擊,這樣就不用扣超級(jí)鷹的積分(有錢的話當(dāng)我沒說),留下了貧窮的淚水。 

  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. #驗(yàn)證碼識(shí)別處理 
  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:報(bào)錯(cuò)題目的圖片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.     # 填寫賬號(hào)密碼 
  57.     browser.find_element_by_id('J-userName').send_keys(username) 
  58.     browser.find_element_by_id('J-password').send_keys(password
  59.  
  60.     # 獲取驗(yàn)證碼 
  61.     get_captcha() 
  62.  
  63.     # 填寫驗(yàn)證碼 
  64.     click_captcha() 
  65.  
  66.     #點(diǎn)擊登錄 
  67.     time.sleep(4) 
  68.     browser.find_element_by_id('J-login').click() 
  69.     time.sleep(4) 
  70.  
  71.     #滑動(dòng)驗(yàn)證碼 
  72.     slider() 
  73.  
  74.     print('成功登陸'
  75.     time.sleep(5) 
  76.  
  77. def slider(): 
  78.     #滑動(dòng)驗(yàn)證碼 
  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.     # 對(duì)div_tag進(jìn)行滑動(dòng)操作 
  84.     action = Actionchains(browser) 
  85.     # 點(diǎn)擊長按指定的標(biāo)簽 
  86.     action.click_and_hold(span).perform() 
  87.     action.drag_and_drop_by_offset(span, 400, 0).perform() 
  88.  
  89. def click_captcha(): 
  90.     # 獲取驗(yàn)證碼需要的為點(diǎn)擊位置 
  91.     chaojiying = Chaojiying_Client('自己的用戶名''密碼''軟件id')  # 用戶中心>>軟件ID 生成一個(gè)替換 96001 
  92.     im = open('./captcha.png''rb').read()  # 本地圖片文件路徑 來替換 a.jpg 有時(shí)WIN系統(tǒng)須要// 
  93.     location = chaojiying.PostPic(im, 9004)['pic_str']  # 1902 驗(yàn)證碼類型  官方網(wǎng)站>>價(jià)格體系 3.4+版 print 后要加() 
  94.     print(chaojiying.PostPic(im, 9004)) 
  95.     # 將位置進(jìn)行分割成    [  [  ], [ ], [ ]  ]類型 
  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.     #先點(diǎn)擊一下 
  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.     #去掉原本的時(shí)間 
  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ā)時(shí)間 
  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('點(diǎn)擊按鈕'
  189.  
  190. if __name__ == '__main__'
  191.     option = ChromeOptions()  # 實(shí)例化一個(gè)ChromeOptions對(duì)象 
  192.     option.add_experimental_option('excludeSwitches', ['enable-automation'])  # 以鍵值對(duì)的形式加入?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.     # 點(diǎn)擊賬號(hào)登陸 
  204.     browser.find_element_by_class_name('login-hd-account').click() 
  205.     #登陸12306的賬號(hào)密碼 
  206.     login('用戶名','密碼'
  207.     time.sleep(4) 
  208.     #例buy_ticket('南昌','撫州北','2020-12-15','D2241','xx'
  209.     buy_ticket('起始地','目的地','出發(fā)日期','車次','姓名'

 【編輯推薦】

 

責(zé)任編輯:未麗燕 來源: 今日頭條
相關(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火車票春運(yùn)

2013-09-18 13:17:58

傲游云瀏覽器

2015-02-11 19:39:16

114啦機(jī)票頻道

2013-01-31 10:02:25

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

2014-12-10 12:28:18

安卓市場

2020-01-13 07:42:01

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

2018-10-23 11:16:59

12306思路余票

2018-01-22 12:00:38

馬云人工智能12306

2011-01-24 15:37:32

火車票
點(diǎn)贊
收藏

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