12306自動刷票下單-查票下單

12306自動刷票下單-登錄

前言

上篇寫了12306登錄,隔了快一個月了摄乒,才準(zhǔn)備動手寫下單篇漓穿,真的要非常感謝博客園的 Asimple朋友嗤军,如果不是看到你的留言,我?guī)缀醵纪艘獙懴缕嘶挝#@一點在簡書上就不好叙赚,都沒人看/(ㄒoㄒ)/~~,剛開始寫博客僚饭,真的需要大家的鼓勵震叮,看的人多了自然有動力寫更多的,所以這一篇要給那些看過我上篇的同學(xué)們鳍鸵,尤其是這位Asimple同學(xué)苇瓣,就是為你而寫,沒錯就是這個原因偿乖。因為你讓我知道了有人在看击罪,而且用心的在看哲嘲。發(fā)了這么多感慨,其實我不是這么愛感慨的人(????)媳禁,直入主題吧眠副。

圖片.png

還得說一下這次我用的是Firefox瀏覽器,在上篇中說了Chrome瀏覽器的一個問題竣稽,在抓取的請求過多的情況下囱怕,前面的請求就可能看不到請求信息,最后搞得我不得不搞了個虛擬機(jī)丧枪,裝了xp光涂,用Fiddler去查看請求信息,后來就換了Firefox拧烦,最新版的Firefox沒有Firebug可用忘闻,但是自帶的開發(fā)者工具足夠用了。當(dāng)然Chrome我也沒卸載恋博,因為Chrome上有個很贊的功能齐佳,在元素界面查找元素的時候可以用css和xpath,可不是右鍵copy里面的css和xpath哦

圖片.png
在這個查找框里你就可以寫自己的css和xpath债沮,看實時效果炼吴,這個真是太棒了,不用裝額外的插件疫衩。Firefox上暫時還沒有發(fā)現(xiàn)這個功能硅蹦,也不知道有沒有類似的插件,如果有人知道的話闷煤,麻煩回復(fù)一下童芹,先謝過了。鼠標(biāo)左鍵還壞了鲤拿,只能把右鍵設(shè)置一下暫時用著假褪,一波三折呀!這次真的要進(jìn)入主題了近顷。
圖片.png

臥了一個槽生音,忽略我上面說的吧,要寫博客了窒升,有一個請求Firefox竟然不給顯示了缀遍,還是虛擬機(jī)吧


后記

后記為什么要加載前言后面,而不是在文章最后饱须,我怕你不看瑟由。在這次分析中我基本沒有添加什么代碼,因為基本上每一個請求就是定義一個字典、一個url歹苦,然后發(fā)送請求青伤,獲取數(shù)據(jù),然后繼續(xù)下一個殴瘦。另一方面就是我并沒有做代碼優(yōu)化和整理狠角。我們都應(yīng)該知道對于沒有反爬措施的網(wǎng)站,基本上看兩個小時的爬蟲教程就能寫的出來蚪腋,對于有反爬的網(wǎng)站丰歌,最難得地方是分析階段,而不是發(fā)送請求屉凯。最后一點就是做這個也是一時興起立帖,積累一下經(jīng)驗,最主要是開始寫一寫博客悠砚。同時給像我一樣初學(xué)爬蟲的朋友一個例子晓勇、一個思路。


查票

圖片.png

車票預(yù)訂界面的url:https://kyfw.12306.cn/otn/leftTicket/init灌旧,選好票以后點擊查詢
圖片.png

多了一下兩個請求绑咱,第一個請求我沒用,沒有任何影響枢泰,我們就不用去管它描融,直接看第二個請求
https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date=2017-12-25&leftTicketDTO.from_station=BJP&leftTicketDTO.to_station=SHH&purpose_codes=ADULT
圖片.png

看一下參數(shù)和返回數(shù)據(jù),太亂了衡蚂,稍微仔細(xì)看一下窿克,預(yù)訂、有毛甲、G5年叮,好像還是有些有用信息的,可以按|拆分一下看看
圖片.png

圖片.png

看到了車次G101丽啡,8谋右、9是開車時間和到達(dá)時間硬猫,10是歷時补箍,商務(wù)座特等座9張余票,32行顯示9啸蜜,一等二等座都是有票坑雅,對應(yīng)30、31衬横,就不能具體確定了裹粤,暫時先不管,至少我們確定了這個請求是查詢出我們需要的車票信息了蜂林,那么再看一下請求參數(shù)遥诉,第一個是時間很容易理解拇泣,第四個好像是票的類型,成人票矮锈,翻譯一下單詞就知道了霉翔,反正每次都一樣,不用管了苞笨,中間兩個出發(fā)站债朵、目的地,不過這些字母是啥意思瀑凝,應(yīng)該是站名對應(yīng)的編碼序芦,在這個請求之前肯定是有對應(yīng)關(guān)系的,

圖片.png

https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9034
一個js的請求@bjb|北京北|VAP|beijingbei|bjb|0粤咪,拆分以后可以看到站名和編號
建議看完所有的分析在看代碼

def query_ticket_info(date, info):
    js_info = json.loads(info)
    if js_info.get("status") != True:
        print("查詢余票失敗")
        return

    result = js_info.get("data").get("result")
    for i in result:
        lst = i.split('|')
        if lst[11] != "Y": #主要是判斷是否開票了谚中,見下圖情況
            continue
        item = {
            "預(yù)定號":lst[0], #預(yù)定號
            "train_no":lst[2],
            "車次":lst[3], #車次
            "始發(fā)站":get_station_name_from_code(lst[4]), #始發(fā)站
            "終點站":get_station_name_from_code(lst[5]), #終點站
            "起始站":get_station_name_from_code(lst[6]), #起始站
            "目標(biāo)站":get_station_name_from_code(lst[7]), #目標(biāo)站
            "出發(fā)時間":"{} {}".format(date, lst[8]), #出發(fā)時間
            "到達(dá)時間":get_end_time(date, lst[8], lst[9], lst[10]), #到達(dá)時間
            "歷時":lst[10], #歷時
            "train_location":lst[15],
            "高級動臥":lst[21], #高級動臥
            "軟臥":lst[23], #軟臥
            "軟座":lst[24], #軟座
            "特等座":lst[25], #特等座
            "無座":lst[26], #無座
            "硬臥":lst[28], #硬臥
            "硬座":lst[29], #硬座
            "二等座":lst[30], #二等座
            "一等座":lst[31], #一等座
            "商務(wù)座":lst[32], #商務(wù)座
            "動臥":lst[33], #動臥
        }
        yield item
圖片.png

這個函數(shù)需要解釋一下,主要是這些站點信息是怎么找到的射窒,說一下思路

  • 當(dāng)我們打開車票預(yù)訂界面的時候藏杖,是這樣的,下面是空的
    圖片.png
  • 點擊查詢后
    圖片.png
  • 由此我們知道車票信息是通過js動態(tài)添加的(maybe)脉顿,那么我們就查找動態(tài)創(chuàng)建出來的元素蝌麸,隨便在上面找一個元素特征,比如我找這個
    圖片.png
    當(dāng)然你可以隨便找一個艾疟,前提是不是動態(tài)創(chuàng)建的来吩,然后在我們的js和document請求中去查找這個值,最后我找到了https://kyfw.12306.cn/otn/resources/merged/queryLeftTicket_end_UAM_js.js?scriptVersion=1.9053
    圖片.png
    我找這個是干什么呢蔽莱?我們上面的請求得到了余票信息弟疆,是json格式的,那么肯定是通過js把它添加到界面上盗冷,我們要知道哪一個信息是添加到硬座上怠苔,哪一個是添加到硬臥上,就像我代碼里寫的那樣仪糖,把所有的票種都找出來
  • 通過分析js
    圖片.png

    然后把大部分我們需要的參數(shù)都對應(yīng)出來柑司,這樣就看到像我上面寫的函數(shù)那樣,取出我們需要的信息

  • 其實有一種更簡單的方式锅劝,就是你查詢了余票信息以后攒驰,會看到余票幾張幾張,然后去對應(yīng)的信息參數(shù)中去找故爵,比如
    圖片.png

    我們就知道了32對應(yīng)的是商務(wù)座特等玻粪,多查詢一些站點就會把所有對應(yīng)索引都找出來


預(yù)訂

點擊預(yù)訂后看一下請求,記住我上一遍說過的,一般是看xhr和document請求劲室,
https://kyfw.12306.cn/otn/login/checkUser

圖片.png
看起來很簡單伦仍,參數(shù)也只有一個_json_att,值為空
重頭戲來了https://kyfw.12306.cn/otn/leftTicket/submitOrderRequest
圖片.png
看請求參數(shù)secretStr很洋,其他的請求幾次發(fā)現(xiàn)沒啥變化呢铆,重點就在這個secretStr上了,太亂了蹲缠,咦棺克,我上面好像說過這三個字,對他們有關(guān)系线定。怎么去理解呢娜谊,這里是發(fā)了一個post請求,而這個secretStr是作為參數(shù)發(fā)送給服務(wù)器的斤讥,那么它必定是在我們本地產(chǎn)生的纱皆,在這個請求之前應(yīng)該能找到“派蹋看一下特征:+wOQuwrBzvR6e...派草。是不是能發(fā)現(xiàn)查票那個請求里返回的數(shù)據(jù)第一個%2BwOQuwrBzvR6e,相似度很高啊铛楣,肯定是進(jìn)行了編碼或解碼近迁。Fiddler這點很好
圖片.png
點擊查票請求的第一條數(shù)據(jù),右鍵->Send to TextWizare...
圖片.png
哇哦簸州,So Beautiful鉴竭,這下就相等了,是使用了urldecode岸浑,這里支持很多種編碼解碼方式搏存,非常方便,真相已經(jīng)出來了矢洲,secretStr是我們上面輸出的第0行字符串的urldecode解碼值璧眠,python3中是parse.unquote。
train_date:訂哪一天的票读虏,back_train_date:今天的時間责静,還有出發(fā)站和目的地。


已經(jīng)轉(zhuǎn)戰(zhàn)頭條了掘譬,不在這個平臺寫了泰演,TT號:Python集結(jié)號

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末呻拌,一起剝皮案震驚了整個濱河市葱轩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖靴拱,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件垃喊,死亡現(xiàn)場離奇詭異,居然都是意外死亡袜炕,警方通過查閱死者的電腦和手機(jī)本谜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來偎窘,“玉大人乌助,你說我怎么就攤上這事∧爸” “怎么了他托?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長仆葡。 經(jīng)常有香客問我赏参,道長,這世上最難降的妖魔是什么沿盅? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任把篓,我火速辦了婚禮,結(jié)果婚禮上腰涧,老公的妹妹穿的比我還像新娘韧掩。我一直安慰自己,他們只是感情好窖铡,可當(dāng)我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布揍很。 她就那樣靜靜地躺著,像睡著了一般万伤。 火紅的嫁衣襯著肌膚如雪窒悔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天敌买,我揣著相機(jī)與錄音简珠,去河邊找鬼。 笑死虹钮,一個胖子當(dāng)著我的面吹牛聋庵,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播芙粱,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼祭玉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了春畔?” 一聲冷哼從身側(cè)響起脱货,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤岛都,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后振峻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體臼疫,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年扣孟,在試婚紗的時候發(fā)現(xiàn)自己被綠了烫堤。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡凤价,死狀恐怖鸽斟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情利诺,我是刑警寧澤湾盗,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站立轧,受9級特大地震影響格粪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜帐萎,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望胜卤。 院中可真熱鬧,春花似錦澈段、人聲如沸败富。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽泽本。三九已至,卻和暖如春姻僧,著一層夾襖步出監(jiān)牢的瞬間规丽,已是汗流浹背蒲牧。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留嘁捷,地道東北人。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓显熏,卻偏偏與公主長得像雄嚣,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子喘蟆,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容