Python之——實現自動搶火車票(基于Python3.6+splinter)

      網友投稿 915 2022-05-30

      splinter使用

      首先介紹一下splinter使用:

      plinter.brower是一個開源工具,通過Python自動化測試web,通過電腦自動操作網頁。

      Splinter模塊是python egg,下載當然很簡單,安裝: pip install splinter

      同時還需要瀏覽器的驅動,Splinter的Browser類默認優先調用的驅動是firefox,所以用chrome的話需要在初始化Browser時候指定driver_name="chrome"參數,建議都明確指定瀏覽器!

      注意:Chrome的驅動chromedriver,注意版本要對應,不然基本上會有unknown error,打不開瀏覽器

      splinter.brower基礎知識

      創建一個Browser實例,就會打開相應的瀏覽器。

      visit(url): 故名思議,訪問指定網站

      findbyid("控件的id").first: 根據控件的屬性id找到控件,一般控件都有獨立唯一的id。不然,Splinter api還提供byname,byid,by_tag等方法!first表示返回第一次找到的控件。

      fill("要填充的內容"): 用指定的內容填充相應控件

      控件是指對數據和方法的封裝。控件可以有自己的屬性和方法,其中屬性是控件數據的簡單訪問者,方法則是控件的一些簡單而可見的功能、控件創建過程包括設計、開發、調試(就是所謂的3Ds開發流程,即Design、Develop、Debug)工作, 然后是控件的使用。

      設計控件是一項繁重的工作。自行開發控件與使用控件進行可視化程序開發存在著極大的不同,要求程序員精通面向對象程序設計。創建控件的最大意義在于封裝重復的工作,其次是可以擴充現有控件的功能。

      click(): 點擊控件

      登錄后,browser.cookies.all()中保存了本次登錄的cookie信息(dict類型),可以打印出來或者保存下次使用

      quit_browser(browser)函數: 要求用戶交互輸入q再退出。否則,程序跑完之后就直接退出了,釋放Browser的實例,調用quit()方法,瀏覽器也就關閉了。

      reload() 方法用于重新加載當前文檔

      實現思路

      首先我們需要登陸12306網站,登錄時需要輸入用戶名與密碼,然后需要輸入蛋疼的驗證碼,然后選擇起、始站,時間,車次類型,點擊查詢,再選擇車次,乘客,提交訂單。如果按照這樣的手動操作下來,票早已經沒有了

      備注:加粗字體都是需要購買火車票的屬性

      實現目標

      整個流程全自動,自動登陸,自動查詢,自動訂單,自動提交訂單( (暫時不實現自動點擊驗證碼,驗證碼成功幾率比較低)

      '''

      實現自動搶火車票(基于Python3.6+splinter)

      Created on 2018年1月15日

      @author: liuyazhuang

      '''

      Python之——實現自動搶火車票(基于Python3.6+splinter)

      from splinter.browser import Browser

      from time import sleep

      import traceback

      #實現自動購票的類

      class Buy_Tickets(object):

      # 定義實例屬性,初始化

      def __init__(self, username, passwd, order, passengers, dtime, starts, ends):

      self.username = username

      self.passwd = passwd

      # 車次,0代表所有車次,依次從上到下,1代表所有車次,依次類推

      self.order = order

      # 乘客名

      self.passengers = passengers

      # 起始地和終點

      self.starts = starts

      self.ends = ends

      # 日期

      self.dtime = dtime

      # self.xb = xb

      # self.pz = pz

      self.login_url = 'https://kyfw.12306.cn/otn/login/init'

      self.initMy_url = 'https://kyfw.12306.cn/otn/index/initMy12306'

      self.ticket_url = 'https://kyfw.12306.cn/otn/leftTicket/init'

      self.driver_name = 'chrome'

      self.executable_path = 'C:\Python36\Scripts\chromedriver.exe'

      # 登錄功能實現

      def login(self):

      self.driver.visit(self.login_url)

      self.driver.fill('loginUserDTO.user_name', self.username)

      # sleep(1)

      self.driver.fill('userDTO.password', self.passwd)

      # sleep(1)

      print('請輸入驗證碼...')

      while True:

      if self.driver.url != self.initMy_url:

      sleep(1)

      else:

      break

      # 買票功能實現

      def start_buy(self):

      self.driver = Browser(driver_name=self.driver_name, executable_path=self.executable_path)

      #窗口大小的操作

      self.driver.driver.set_window_size(700, 500)

      self.login()

      self.driver.visit(self.ticket_url)

      try:

      print('開始購票...')

      # 加載查詢信息

      self.driver.cookies.add({"_jc_save_fromStation": self.starts})

      self.driver.cookies.add({"_jc_save_toStation": self.ends})

      self.driver.cookies.add({"_jc_save_fromDate": self.dtime})

      self.driver.reload()

      count = 0

      if self.order != 0:

      while self.driver.url == self.ticket_url:

      self.driver.find_by_text('查詢').click()

      count += 1

      print('第%d次點擊查詢...' % count)

      try:

      self.driver.find_by_text('預訂')[self.order-1].click()

      sleep(1.5)

      except Exception as e:

      print(e)

      print('預訂失敗...')

      continue

      else:

      while self.driver.url == self.ticket_url:

      self.driver.find_by_text('查詢').click()

      count += 1

      print('第%d次點擊查詢...' % count)

      try:

      for i in self.driver.find_by_text('預訂'):

      i.click()

      sleep(1)

      except Exception as e:

      print(e)

      print('預訂失敗...')

      continue

      print('開始預訂...')

      sleep(1)

      print('開始選擇用戶...')

      for p in self.passengers:

      self.driver.find_by_text(p).last.click()

      sleep(0.5)

      if p[-1] == ')':

      self.driver.find_by_id('dialog_xsertcj_ok').click()

      print('提交訂單...')

      # sleep(1)

      # self.driver.find_by_text(self.pz).click()

      # sleep(1)

      # self.driver.find_by_text(self.xb).click()

      # sleep(1)

      self.driver.find_by_id('submitOrder_id').click()

      sleep(2)

      print('確認選座...')

      self.driver.find_by_id('qr_submit_id').click()

      print('預訂成功...')

      except Exception as e:

      print(e)

      if __name__ == '__main__':

      # 用戶名

      username = 'xxxx'

      # 密碼

      password = 'xxx'

      # 車次選擇,0代表所有車次

      order = 2

      # 乘客名,比如passengers = ['XXX', 'XXX']

      # 學生票需注明,注明方式為:passengers = ['XXX(學生)', 'XXX']

      passengers = ['劉亞壯']

      # 日期,格式為:'2018-01-20'

      dtime = '2018-01-20'

      # 出發地(需填寫cookie值)

      starts = '%u6210%u90FD%2CCDW' #成都

      # 目的地(需填寫cookie值)

      ends = '%%u5317%u4EAC%u897F%2CBXP' #北京

      # xb =['硬座座']

      # pz=['成人票']

      Buy_Tickets(username, password, order, passengers, dtime, starts, ends).start_buy()

      ————————————————

      人工智能

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:0x7OpenResty系列:Openresty最佳案例| 第7篇:模塊開發,OpenResty連接Redis
      下一篇:Dataset之HiggsBoson:Higgs Boson(Kaggle競賽)數據集的簡介、下載、案例應用之詳細攻略
      相關文章
      亚洲国产一区视频| 亚洲一区二区三区在线视频 | 亚洲日韩中文字幕| 无码专区—VA亚洲V天堂| 亚洲女久久久噜噜噜熟女| 亚洲日产无码中文字幕| 亚洲色欲一区二区三区在线观看| 亚洲综合无码AV一区二区| 国产亚洲av片在线观看18女人| 在线精品亚洲一区二区三区| 在线A亚洲老鸭窝天堂| 亚洲无码在线播放| 亚洲精品无码永久中文字幕| 亚洲热线99精品视频| 久久亚洲精品中文字幕无码| 亚洲精品无码不卡| 久久久久亚洲精品日久生情| 亚洲男人的天堂在线| 亚洲国产成人精品久久| 亚洲黄色激情视频| 亚洲av无码av在线播放| 四虎亚洲国产成人久久精品| 亚洲中文字幕丝袜制服一区| 伊人久久大香线蕉亚洲| 亚洲av无码国产精品夜色午夜| 亚洲视频在线播放| 亚洲国产成人久久99精品| 亚洲卡一卡二卡乱码新区| 亚洲av综合av一区二区三区| www国产亚洲精品久久久| 亚洲中文字幕丝袜制服一区| 亚洲成AV人在线观看天堂无码| 久久亚洲私人国产精品| 亚洲性猛交xx乱| 亚洲精品无播放器在线播放| 亚洲高清视频一视频二视频三| 亚洲AV人人澡人人爽人人夜夜| 亚洲人成网站在线播放影院在线 | 色欲aⅴ亚洲情无码AV蜜桃| 无码欧精品亚洲日韩一区夜夜嗨 | 国产亚洲一区二区三区在线观看|