国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

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

傲游云瀏覽器

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

產品經理火車

2014-12-10 12:28:18

安卓市場

2020-01-13 07:42:01

技術研發指標

2018-01-22 12:00:38

馬云人工智能12306

2018-10-23 11:16:59

12306思路余票

2011-01-24 15:37:32

火車票
點贊
收藏

51CTO技術棧公眾號

日韩av在线免费播放| 日韩欧美一级特黄在线播放| 欧美激情在线一区| 欧美日韩伦理片| 韩国三级在线一区| 91精品免费看| 99精品视频在线免费播放 | 亚洲精品国产动漫| 亚洲国产天堂久久综合网| jizz欧美大全| 国产九九视频一区二区三区| 91免费国产网站| 136导航精品福利| 日韩精品一区二区三区第95| 黄色软件在线观看| 亚洲视频一区二区在线| 日韩不卡视频一区二区| 亚洲经典视频在线观看| 国产精品一区二区三区免费视频| 99re66热这里只有精品4| 91麻豆精品国产91久久久 | 亚洲国产中文在线二区三区免| 日韩视频一区二区三区| 日本成人一区二区三区| 亚洲色图第一区| 黄色国产小视频| 国产精品自产自拍| 色播五月综合| 伊人精品视频| 95av在线视频| 色999日韩| 国产999在线观看| aiai久久| 久久99青青精品免费观看| 九色成人搞黄网站| 国产一区二区成人| 成人午夜视屏| 亚洲精品动漫100p| 国内激情视频在线观看| 亚洲电影成人av99爱色| 三级网站视频在在线播放| 日韩一区二区电影网| 国产精品刘玥久久一区| 欧美高清视频一二三区 | 精品中国亚洲| 欧美极品少妇xxxxⅹ喷水 | 欧美久久久久久久久中文字幕| 日韩电影在线观看完整版| 亚洲综合色网站| 丝袜足控免费网站xx网站| 亚洲摸摸操操av| 日本一二区视频| 天天操天天综合网| 国产在线日本| 日韩欧美综合一区| 99欧美精品| 57pao成人永久免费视频| 久久最新网址| 91影院未满十八岁禁止入内| 国产深夜精品| 潘金莲一级淫片aaaaa免费看| 国产精品资源网站| 密臀av一区二区三区| 一区二区三区精密机械公司| 人成在线免费视频| 精品日韩99亚洲| 日韩漫画puputoon| 3344国产精品免费看| 一区二区影视| 公共露出暴露狂另类av| 久久久精品中文字幕麻豆发布| 探花国产精品| 日韩视频免费直播| 亚洲伦理一区二区| 国产精品久久一| 麻豆久久精品| 男女爽爽爽视频| 色欧美片视频在线观看在线视频| 毛片网站在线看| 欧美国产第一页| 欧美午夜国产| xxxx18hd亚洲hd捆绑| 亚洲一二三区不卡| aa国产成人| 国产成人福利网站| 奇米精品一区二区三区在线观看一| 欧美v在线观看| 欧洲日韩一区二区三区| 成人毛片免费| 亚洲精品日韩av| 国产高清在线观看免费不卡| 黄页在线观看视频| 精品亚洲永久免费精品| 免费看成人哺乳视频网站| 日韩黄色影视| 国产精品乱子久久久久| 欧美性猛片xxxxx免费中国 | 国产综合久久久久影院| 成人免费观看www在线| 色综合天天综合给合国产| 欧美日韩激情电影| www.av一区视频| 久久色视频免费观看| 午夜免费播放观看在线视频| 久久999免费视频| 亚洲主播在线| 免费亚色电影在线观看| 亚洲精品小视频在线观看| 色综合咪咪久久网| 久久精品视频16| 欧美日韩成人一区二区| 加勒比色老久久爱综合网| 夜夜爽www精品| 色久优优欧美色久优优| 爱高潮www亚洲精品| 中文字幕日韩精品久久| 91国在线观看| 国内精品久久久久久久影视简单| 东北少妇不带套对白| 91精品国产综合久久香蕉的特点| 无码日韩精品一区二区免费| 国产91av视频在线观看| 欧美亚一区二区| 在线日韩一区| 日本成人在线免费视频| 亚洲第一区中文字幕| 一本一道久久综合狠狠老| 久久久久久久久久久久91| 亚洲毛片一区二区| 另类图片国产| 国产三区四区在线观看| 日韩美女在线看| 亚洲国产精品v| 成人全视频免费观看在线看| 日本视频一区二区不卡| 一本一道综合狠狠老| 国产精品入口久久| av视屏在线播放| 在线播放国产一区中文字幕剧情欧美| 国产欧美二区| 在线观看黄色av| 鬼打鬼之黄金道士1992林正英| 亚洲一卡二卡三卡四卡五卡| 国产成人夜色高潮福利影视| 欧美韩国日本在线| 色妞欧美日韩在线| 成人黄色在线网站| 成人做爰视频www| 国产91沈先生在线播放| 日韩精品免费在线播放| 麻豆精品蜜桃视频网站| 超碰在线公开| 亚洲欧美一二三| 日韩激情av在线播放| 美女网站在线免费欧美精品| 国产三级伦理在线| 综合久久国产| 日韩精品在线免费| 国内精品免费**视频| 一区二区电影免费观看| 日本中文字幕一级片| 亚洲午夜久久久影院| 国产成人综合亚洲91猫咪| 欧美色片在线观看| 欧美国产激情视频| 97久久精品人搡人人玩| 亚洲黄色片在线观看| 日韩精品诱惑一区?区三区| 水莓100在线视频| 久久国产精品亚洲va麻豆| 日韩久久久精品| 国产精品77777竹菊影视小说| 精品福利在线| 色噜噜狠狠一区二区| 国产日韩欧美在线播放| 一本色道久久综合亚洲91 | 久久97视频| 一不卡在线视频| 久久精品人成| 精品sm捆绑视频| 成人美女视频在线观看| aaa国产精品视频| 手机福利小视频在线播放| 精品在线视频一区二区| 日韩av有码在线| 久久久蜜臀国产一区二区| 偷拍亚洲色图| 欧美jizzhd欧美| 久久99久久99精品| 欧美在线欧美在线| 日本韩国视频一区二区| 日本美女一区二区| 日韩一区二区三区色 | 久久视频国产精品免费视频在线| 91色视频在线| 欧美国产偷国产精品三区| 四虎影院观看视频在线观看| 日韩精品一区二区三区久久| 成人黄色在线免费| 日韩精品视频三区|