實訓課需要機票數據集,網上沒有,所以我選擇爬取數據
此過程可謂經歷的九九八十一難,也參考了不少大佬的文章,在此特別記錄一下
彎路不多說,我直接講成功的方法
找到請求url
通過控制臺,最后確認下面的 url 的響應數據為機票信息
然后我們看一下請求頭,發現需要 cookie 是固定的,sign ,token 和 transactionID 是算法計算得到的,下面的文章里有代碼提到了 sign 和 transactionID 的處理,站內也有很多佬已經給出了答案,這里不過多敘述
吾愛破解網站的大佬發的文章
token 計算
最重要的是 token 的計算,通過搜索,發現賦值給它的是 i,打個斷點調試,再通過堆棧分析,發現 i 的值就是 token
而 i 是由 window.signature 函數賦值的,所以定位這個函數
接下來我們確定一下是不是這個函數生成的 token,新建一個代碼段,把上面函數的所有代碼復制到該文件,再添加一段控制臺輸出,右鍵運行,發現控制臺輸出了類似的 token,所以就是這個函數計算出來的 token
把這段函數代碼復制到代碼編輯器,我這里用的 pycharm ,沒有配置 node 的話記得配置一下
接下來有兩種做法:
- 破解算法:就是斷點寫日志插樁,分析算法怎么來的,B站上有很多這樣的教程,可以學習一下。我是小白,沒做出來,而且這段函數代碼足足 500 行,簡直是出生!
- 補環境:就是模擬瀏覽器的環境,來跑上面的函數,因為瀏覽器能跑,而用 node 跑是不行的,因為缺少一系列環境。這個相對簡單,所以下面介紹這種方法
補環境
接下來又有兩種做法:
- 手動補:就是用代碼編輯器跑這個函數,報啥錯加啥,B站上有很多這樣的教程,可以學習一下。我是小白,沒做出來
- 工具補:這就不得不提到 V 神的插件 v_jstools ,github 上有源碼下載下來,拖到谷歌瀏覽器里安裝,記得打開瀏覽器開發者模式,不然無法安裝。這個相對簡單,所以下面介紹這種方法
按照如下勾選配置
再打開配置頁面,把最下面所有的都勾上
然后清除緩存,將斷點打在那個函數上,重新來調試一下,直到 加載出票價信息為止
期間只需要一直點下一步就可以
當某程票價信息加載出來后,退出調試,然后點擊生成臨時環境,就會自動復制到剪貼板
然后把這些環境代碼粘貼到代碼編輯器那個函數的上面,我這里生成了大概1700行的樣子,里面有很多無用得完東西,咱們不管他,
直接運行補完后的代碼,此時要是還報錯,就把對應的錯誤行刪除,完全沒有影響!!!
再最后自己寫個函數,方便 python 調用輸出的 token
然后用 python 的 execjs 庫運行 js 腳本,注意編碼格式
with open('signture.js','r',encoding='utf-8') as f:js = f.read()
token = execjs.compile(js).call("getToken")
此時可能會報錯,說 gbk 不能識別某個字符之類的,那就再加上下面的代碼
import subprocess
from functools import partial
subprocess.Popen = partial(subprocess.Popen, encoding="utf-8")
然后把 token 傳給請求頭,就可以美美爬取代碼啦(我的主體代碼用的就是上面吾愛破解大佬給的代碼,再此基礎上傳入自己瀏覽器的 cookie ,useragent 和 token 就行啦)
結語
原諒我無法給出源碼,律師函警告捏。
建議爬取的時候設置隨機 sleep 時間大于1 秒,不然頻繁爬取會彈出登錄界面導致攔截爬蟲。
最后有什么問題可以私信我,我看到就會回復的,加油