本文目標:去哪兒網(qunar.com)的主要關鍵字段pre
我們的目標是獲取以下鏈接返回的數據:
經多方調試,這裏主要的字段就是headers中的pre參數。
其他參數可以固定使用。太過簡單的就不介紹了。
從朋友那兒得知,目前大家獲取這個參數主要就是依靠selenium模擬獲取,作爲爬蟲工程師,用selenium是迫不得已的下下策,所以,一怒之下,自己動手,把這個參數給解了,純代碼實現,不需要藉助selenium,這纔是爬蟲該有的姿態。
查找pre的調用位置:
顯然pre是通過window._pt_ 獲得。
經過多方查找,最後看到前端源碼裏面的script標籤,這段熟悉又陌生的代碼。
複製這段js到本地、格式化、運行。成功看到:內存溢出報錯:
內存溢出,判斷是代碼進入了死循環,只能console.log慢慢識別具體的位置,好吧,這個過程,花費三天三夜。不盡一個地方會導致內存溢出,每段這串js代碼都有多處讓你崩潰的溢出。沒辦法,只能一個一個找。
鬼叼的是,不同的js返回,溢出的地方,並不一樣。調試這個還是需要耐心、耐心、耐心。
解決完內存溢出後,運行代碼,發現,並沒有生成我們需要的window._pt_
這不科學,難道這段代碼並不是我們需要的代碼,不存在的,在多次斷點之後,發現加載完這個代碼後,window._pt_就已經生成了,這時查看了源碼返回的其他script下的 代碼,會不會是其他的代碼生成的,可惜,其他js代碼並沒有做什麼重要事情。
那麼最後還是回到這段代碼上來,既然運行沒有報錯,卻沒有生成我們需要的參數,那很可能是某塊的代碼並沒有運行。
於是又是一段瘋狂的斷點輸出,甄別具體沒有運行到的代碼。
最後果然發現有一段是沒有運行到的。
即使發現了問題,但是,這中間又出現了無數個無法進行下去的坑,苦戰幾天幾夜,最後完美用純代碼的方式生成pre:
目前網上普遍都是用selenium模擬生成這個參數,自己硬幹把它解出來的過程是艱辛的,當然也充滿着樂趣。
純屬個人愛好,不做任何數據的抓取。
破解技術交流,歡迎勾搭。
更多粉絲可見的文章,歡迎點擊關注。
QQ: MTE2NTY3MzkzNg== (base64)