好久沒有寫文章,因為確實工作也比較忙。今天周末,稍微有些時間,在解決一個問題時,用到了一點抓取和處理網絡數據的小技巧,摘錄分享如下。
問題描述
我有一個需求,就是要研究某個網頁加載過程中具體發起了多少個請求(從主請求開始,到所有的資源完成),并且要檢查每個響應的一些特性,例如是否 包含了某個header信息等。
解決方案
要完成這個需求,跟把一個大象裝進冰箱一樣簡單,大致需要如下幾個步驟:
記錄某個網頁加載的請求
把這些請求保存起來
分析這些請求
假設我們要分析Outlook.com這個網頁
要對其網路網絡請求進行抓取,其實很簡單,所有主流的瀏覽器都帶有一個開發者工具(通過F12可以喚出),然后有一個網絡(Network)的面板,很容易就可以把所有的請求記錄下來。
你可以點擊每一個請求去查看具體的信息,但我們這里需要集中處理,所以如何把它們全部保存起來呢。這個也不難,點擊下圖的按鈕即可。
這樣會保存為一個 HAR 文件(本例而言,outlook.com的主界面,有800多個請求,這是現代網站的特點,有很多本地的功能,瀏覽器已經越來越強大,相當于是一個富客戶端)。你會發現在你的電腦上無法直接打開。但是其實,它就是一個紙老虎,是一個json文件,你可以用記事本,或者VS Code這樣的工具輕松打開。
那么關鍵的部分終于來了。如何在這一堆文本中快速分析得到你想要的數據。這個 json 文件可不小,大約幾十MB呢。實際上有很多辦法實現,我用的是PowerShell。
我也不賣什么關子了,這里直接上最終的代碼。
(Get-Content?.\outlook.live.com.har?| `ConvertFrom-Json).log.entries?`|?Where-Object?{($_.response.headers?`|where-object?{$_.name?-eq?"xxxx"}).length?-gt?0}?`|?Select-Object?@{Name='URL';Expression={$_.request.url}}
這一行代碼(沒錯,其實只有一行,只不過為了看起來直觀換行了而已)即可得到我需要的結果
這一行代碼的意思是
讀取outlook.live.com.har 這個文件
將文件內容轉換為json對象,并讀取log屬性的entries對象集合
針對entries集合進行篩選,查找那些response的headers中,包含了name=xxxx 這個值的entry
如果找到的,則返回該entry的request對象的url屬性
將所有找到的,用一個列表返回
預告一下,年內會有一本關于企業元宇宙的新書上市,我參與編寫了其中的低代碼的部分,費了一個月的腦筋,寫下兩萬余言,希望對大家有所幫助吧。
但正如我在那本書中的結論一樣,有代碼和無代碼本質上并無差別。寫代碼使我快樂,所以才會有這個分享。