又沒搶到票?手把手教你用python搶票回家過年…

2021-02-13 茁壯網絡人力資源

最近朋友圈刷屏:我又沒搶到票!哭!

憋急,教程在此,有人願意嘗試嗎?

先看看如何快速查看剩餘火車票?


作者 protream 

原文:http://www.jianshu.com/p/f411d7e10c41

當你想查詢一下火車票信息的時候,你還在上12306官網嗎?或是打開你手機裡的APP?下面讓我們來用Python寫一個命令行版的火車票查看器, 只要在命令行敲一行命令就能獲得你想要的火車票信息!如果你剛掌握了Python基礎,這將是個不錯的小練習。

接口設計

一個應用寫出來最終是要給人使用的,哪怕只是給你自己使用。所以,首先應該想想你希望怎麼使用它?讓我們先給這個小應用起個名字吧,既然及查詢票務信息,那就叫它tickets好了。我們希望用戶只要輸入出發站,到達站以及日期就讓就能獲得想要的信息,所以tickets應該這樣被使用:

$ tickets from to date

另外,火車有各種類型,高鐵、動車、特快、快速和直達,我們希望可以提供選項只查詢特定的一種或幾種的火車,所以,我們應該有下面這些選項:

-g   高鐵

-d    動車

-t    特快

-k    快速

-z    直達

這幾個選項應該能被組合使用,所以,最終我們的接口應該是這個樣子的:

$ tickets [-gdtkz] from to date

接口已經確定好了,剩下的就是實現它了。

開發環境

寫Python程序的一個良好實踐是使用virtualenv這個工具建一個虛擬的環境。我們的程序使用Python3開發,下面在你的工作目錄下建一個文件夾tickets,進去創建一個虛擬環境:

$ virtualenv -p /usr/bin/python3 venv

通過下面的命令激活它:

$ . venv/bin/activate

解析參數

Python有很多寫命令行應用的工具,如argparse, docopt, options...這裡,我們選用docopt這個簡單易用的工具,我們先安裝它:

$ pip3 install docopt

docopt可以按我們在文檔字符串中定義的格式來解析參數,在tickets.py中:

# coding: utf-8

"""Train tickets query via command-line.Usage:    tickets [-gdtkz] <from> <to> <date>Options:    -h,--help        顯示幫助菜單    -g               高鐵    -d               動車    -t               特快    -k               快速    -z               直達Example:    tickets 南京 北京 2016-07-01    tickets -dg 南京 北京 2016-07-01"""

from docopt import docopt

def cli():    """command-line interface"""    arguments = docopt(__doc__)    print(arguments)

if __name__ == '__main__':    cli()

下面我們運行一下這個程序:

$ python3 tickets.py 上海 北京 2016-07-01

我們得到下面的參數解析結果:

{'-d': False, '-g': False, '-k': False, '-t': False, '-z': False, '<date>': '2016-07-01', '<from>': '上海', '<to>': '北京'}

獲取數據

參數已經解析好了,下面就是如何獲取數據了,這也是最主要的部分。首先我們打開12306,進入餘票查詢頁面,如果你使用chrome,那麼按F12打開開發者工具,選中Network一欄,在查詢框鍾我們輸入上海到北京,日期2016-07-01, 點擊查詢,我們在調試工具發現,查詢系統實際上請求了這個URL

https://kyfw.12306.cn/otn/lcxxcx/query?purpose_codes=ADULT&queryDate=2016-07-01&from_station=SHH&to_station=BJP

並且返回的是Json格式的數據!接下來問題就簡單了,我們只需要構建請求URL然後解析返回的Json數據就可以了。但是我們發現,URL裡面from_station和to_station並不是漢字,而是一個代號,而用戶輸入的是漢字,我們要如何獲取代號呢?我們打開網頁源碼看看有沒有什麼發現。

啊哈!果然,我們在網頁裡面找到了這個連結:https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.8955。這裡面貌似是包含了所有車站的中文名,拼音,簡寫和代號等信息, 我們在項目目錄下將它保存為stations.html。但是這些信息擠在一起,而我們只想要中文名和大寫字母的代號信息,怎麼辦呢?

BINGO!正則表達式,我們寫個小腳本來匹配提取出想要的信息吧, 在parse.py中:

# coding: utf-8

import re
from pprint import pprint

with open('stations.html', 'r') as f:    text = f.read()    stations = re.findall(u'([\u4e00-\u9fa5]+)\|([A-Z]+)', text)    pprint(dict(stations), indent=4)

我們運行這個腳本,它將以字典的形式返回所有車站和它的大寫字母代號, 我們將結果重定向到stations.py中,

$ python3 parse.py > stations.py

我們為這個字典加名字,stations, 最終,stations.py文件是這樣的:

stations = {        '一間堡': 'YJT',    '一面坡': 'YPB',     ...    '龍鎮': 'LZA',    '龍骨甸': 'LGM'
}

現在,用戶輸入車站的中文名,我們就可以直接從這個字典中獲取它的字母代碼了:

...
from stations import stations

def cli():    arguments = docopt(__doc__)    from_staion = stations.get(arguments['<from>'])    to_station = stations.get(arguments['<to>'])    date = arguments['<date>']    # 構建URL    url = 'https://kyfw.12306.cn/otn/lcxxcx/query?purpose_codes=ADULT&queryDate={}&from_station={}&to_station={}'.format(        date, from_staion, to_station)

萬事俱備,下面我們來請求這個URL獲取數據吧!這裡我們使用requests這個庫, 先安裝它:

$ pip3 install requests

它提供了非常簡單易用的接口,

...
import requests

def cli():    ...    # 添加verify=False參數, 不驗證證書    r = requests.get(url, verify=False)    print(r.json())

從結果中,我們可以觀察到,與車票有關的信息需要進一步提取:

def cli():    ...    r = requsets.get(url);    rows = r.json()['data']['datas']

顯示結果

數據已經獲取到了,剩下的就是提取我們要的信息並將它顯示出來。prettytable這個庫可以讓我們它像MySQL資料庫那樣格式化顯示數據。

$ pip3 install prettytable

這樣使用它:

...
from prettytable import PrettyTable

def cli():    ...    headers = '車次 車站 時間 歷時 商務 一等 二等 軟臥 硬臥 軟座 硬座 無座'.split()    pt = PrettyTable()    pt._set_field_names(headers)
   for row in rows:
       # 從row中根據headers過濾信息, 然後調用pt.add_row()添加到表中        ...    print(pt)

其次我們看看如何自動搶:


作者:marvin,網際網路從業者,現居上海張江

使用Python+Splinter自動刷新搶票,可以成功搶到。(依賴自己的網絡環境太厲害,還有機器的好壞)

Splinter是一個使用Python開發的開源Web應用測試工具,它可以幫你實現自動瀏覽站點和與其進行交互,Splinter執行的時候會自動打開你指定的瀏覽器,訪問指定的URL。然後你所開發的模擬的任何行為,都會自動完成,你只需要坐在電腦面前,像看電影一樣看著屏幕上各種動作自動完成然後收集結果即可。

12306搶票Python代碼片段

1、實現自動登錄的函數:

2、開始購票的函數

研究了N遍,小編表示沒看懂

有大神能幫做一個嗎

相關焦點

  • 春節回家搶票難?"Python搶票教程」幫你解決!
    --我們的徵途是星辰是大海--即使再難,家還是要回的,票還是要搶的,所以這一周,GitHub上用python搶票的項目又重回top榜單。
  • 買到回家的票了嗎?用Python刷票,還不快來試試!
    今天,你搶到票了嗎?沒有的話,快來試試這個程序!獲取源碼方式:又是一年春運高潮來臨,搶票回家成了老大難題。除了 12306 官網和官方 APP,各種第三方搶票軟體也是層出不窮。就算朋友圈沒被搶票小程序刷屏,聊天群也被刷了吧?然而,春運的火爆,光靠這些小程序還是難以滿足大家的要求。
  • 高鐵火車沒票了怎麼辦?這款軟體幫你快速搶票!
    或許這個時候,大家就會用某團某程等app來搶票,通常這些app都有發送小程序邀請好友幫忙加速的,就像這樣:騰訊廣告支持泥鰍哥,讓泥鰍哥做的更好為了提高搶票的成功率,大家肯定用過了很多辦法,比如多個軟體搶同一趟車,只要一個軟體搶到票了,其他軟體就買不到票,因為不允許購買同一時間階段的票。今天呢,就給大家安利一款電腦端的一款搶票軟體,據說很多人都用這款軟體搶到了回家的票。
  • 同時開啟 3 個搶票軟體,買了 50 個加速包也沒搶到票之後,我們重新回到了沒有搶票軟體的年代
    我們知道,鐵總的票是一定的,供需關係未變。假設市場沒有出現搶票軟體,大家登陸 12306 搶票,概率是一致的。市場都在用搶票軟體,加價 50 元超級 VIP,搶到票的概率也是一致的。區別在於,當市場都使用搶票軟體後,每個搶到票的人,都要付給「搶票軟體」行業巨頭 50 元 VIP 包。讓我想起來了那個老掉牙的算命先生的故事。
  • 搜狗瀏覽器三大技術助你搶到「歸鄉票」
    11月15日,中國鐵路總公司發布消息,將從12月1日起,用一周的視覺,逐步將鐵路網際網路售票、電話訂票的預售期,由目前的20天延長至60天。搜狗瀏覽器就為大家詳細講解下網絡購票新規則,並教大家如何搶到回家票。知己知彼 新規則解讀  想要在網絡購票採取新規則的情況下,在被譽為人類歷史上規模最大,周期性最長的人類大遷徙——「春運」中順利搶到一張回家的火車票首要的就是要清楚的了解到新規則的含義。根據新規則內容, 12月6日起,火車票預售期將延長至60天。
  • 手把手教你用python搶火車票
    path=2.20/ 根據下載的自己的電腦系統選擇下載包,我的windows就用win32了解壓後直接放到C:\Windows\System32目錄下,你當然也可以給這個驅動程序弄個環境變量。值得注意的是,我不會去說什麼怎麼破解驗證碼以及有什麼漏洞可以利用什麼的,搶過票的都知道,快一點是一點,而我要做的是就能將機器能做的交給機器做,比如點擊,查詢,選擇等,所以希望必中的還是繞過此文吧。筆者水平也就這麼一點點。 首先我們用ipython講解一下思路 開始當然是導入啦。。
  • 高鐵搶票軟體 - 您的高鐵票已搶到~
    又到了搶票時刻,南往北漂,北往南漂,怎麼漂,都有一天要歸家,那一刻,穿心似箭,迫切而又焦慮的感受是每一位回家人兒的心裡故事!新的一年裡,斑馬繼續推薦給大家一些不錯的電腦搶票軟體,可以實現24小時掛機搶票,更多的是,搶到票後可以收到郵件提醒,QQ提醒。
  • 精選幾款免費搶票軟體分享,春節搶票不迷路!
    快過年了,讓我鬧心的不止是論文,更讓我鬧心的是火車票還沒買到~難道今年老天不讓我回家,讓我在學校改論文??
  • Python自動搶票升級第三版,小白也可以運行的搶票程序
    前兩篇關於搶票的文章沒看可點下方連結查看。用Python搶火車票加郵件通知Python搶票程序優化,可以選擇車次和座次目錄優化瀏覽器驅動路徑優化車站cookie值優化參數輸入打包搶票程序源碼獲取之前的代碼中會讓大家在初始化函數中輸入自己瀏覽器驅動的本地路徑,很繁瑣,可能有些夥伴忘了輸入或者有轉義字符的問題。
  • 搶票啦!請收下這份2020春節火車搶票攻略!
    最後可別因為沒搶到票回不了家哦小時候鄉愁是一枚小小的郵票我在這頭,母親在那頭長大後鄉愁是一款搶票APP我在這頭,車票在那頭廢話不多說趕緊收好下面的搶票攻略回家的票抓緊搶起來吧~一定要上好鬧鐘哦~12306網站和電話購票開放時間都是
  • 加速包搶票,錢白花了…...
    鐵總:第三方搶票軟體已被限制近日,一則「搶票軟體已被限制」的話題引發關注:為了買到回家的火車票,一些人求助搶票軟體,那麼搶票軟體都是怎麼運作的呢?用此方法,乘客可以通過增加備用車次和坐席的方法增加搶票概率,但沒有餘票的時候搶票軟體也毫無辦法。「優先出票權」有用嗎?據報導,2018年12月底,黃女士在某APP上預訂了兩張2月2日由廣州到陽江的火車票。邀請30位好友幫忙加速搶票後,黃女士達到了高速。
  • 零基礎,從一個搶票程序,提升自己的Python技能
    本文就從搭建一個搶票軟體開始,如何一步步提升自己的 Python 技能,不需要寫代碼,零基礎也可以學會。這個搶票軟體就是- 12306 智能刷票助手,是一位大佬基於 GitHub 上的萬星項目稍作修改,親測可用。
  • 千鋒大連校區師生協作開發HTML5搶票程序 回家過年不再愁
    春運難搶票,人人都知道,回家過個年,累得不要不要的!
  • 見識下「機器人」搶票!看完就明白你為什麼搶不到票了!
    春運「搶票戰」已經全面打響網友們紛紛吐槽購票的難度面對一票難求,你是12306官網?還是選擇所謂的搶票網站?還是花錢找黃牛買「速度」?不過記者用360網站循環搶了兩個多小時800多次,依舊搶票失敗。加錢後,搶票功能有所增加目前「搶票軟體」主要分兩類,一類是增加了搶票功能的瀏覽器,另一類是OTA(在線旅行服務商)的官網或APP。有的是全免費的,有的則有一些收費項目。很多時候,旅客要多付幾十元錢,才能利用這些軟體搶票。
  • 實測兩款 GitHub 開源搶票插件,所有坑我們都幫你踩過了
    如果你對自己手速和市面上的各種 「加速包」 都沒什麼信心的話,不妨試試用程式設計師的手段搶票?
  • 50個搶票加速包,還不如這個Python搶票神器
    又到了一年一度的搶票大戰,本來就辛苦勞累了一年,想著可以早點訂到票跟家裡人團聚。
  • 火車搶票黑科技,全自動高速搶票,秒殺所有搶票軟體!
    馬上元旦了,元旦過後緊接著沒幾天就要過年了,而一年一度的春運搶票大戰也已經如火如荼的開始了!2020年春運將在1月10號正式開始,不知道出門在外的小夥伴們都買到回家的票了嗎?沒有搶到票的小夥伴也不要著急,每年這個時候小編都會為大家推薦一款搶票軟體,今年也不例外。今年小編將為大家帶來兩款搶票神器,一款使我們熟悉的Bypass分流搶票,另外一款是今年全新推出的超級搶票機。
  • 搶票神器|Bypass分流搶票
    點擊關注,獲取更多免費資源        春運即將到來,你買到回家的票了嗎
  • 超級厲害的火車搶票秘籍!
    啊啊啊!我要回家!但是不要怕如果你能把搶票攻略吃透今年準時回家穩穩噠12306自動刷新鎖定12306官網自己就帶有自動查詢的功能,只要一查詢到有票便會通過聲音來提示,這時候你需要做的就是在第一時間下單啦。獵豹瀏覽器
  • 這屆搶票軟體為什麼不行?
    皮皮蝦,我們搶」、「為我回家助把力」、「你不點我不點,小X回家有危險」的文案又開始出現在各大微信群,為搶票助力和「砍一刀」都成了大家考驗人緣的方式。 儘管不久前12306對外表示已經屏蔽了多個搶票軟體,但記者了解到,智行火車票、高鐵管家、攜程、美團、飛豬、去哪兒、同城藝龍等60多家平臺仍然推出了搶票功能。