通过PowerShell进行网络分析

好久没有写文章,因为确实工作也比较忙。今天周末,稍微有些时间,在解决一个问题时,用到了一点抓取和处理网络数据的小技巧,摘录分享如下。.问题描述

我有一个需求,就是要研究某个网页加载过程中具体发起了多少个请求(从主请求开始,到所有的资源完成),并且要检查每个响应的一些特性,例如是否 包含了某个header信息等。

解决方案

要完成这个需求,跟把一个大象装进冰箱一样简单,大致需要如下几个步骤:

  1. 记录某个网页加载的请求

  2. 把这些请求保存起来

  3. 分析这些请求

假设我们要分析Outlook.com这个网页

通过PowerShell进行网络分析

要对其网路网络请求进行抓取,其实很简单,所有主流的浏览器都带有一个开发者工具(通过F12可以唤出),然后有一个网络(Network)的面板,很容易就可以把所有的请求记录下来。

通过PowerShell进行网络分析

你可以点击每一个请求去查看具体的信息,但我们这里需要集中处理,所以如何把它们全部保存起来呢。这个也不难,点击下图的按钮即可。

通过PowerShell进行网络分析

这样会保存为一个 HAR 文件(本例而言,outlook.com的主界面,有800多个请求,这是现代网站的特点,有很多本地的功能,浏览器已经越来越强大,相当于是一个富客户端)。你会发现在你的电脑上无法直接打开。但是其实,它就是一个纸老虎,是一个json文件,你可以用记事本,或者VS Code这样的工具轻松打开。

通过PowerShell进行网络分析

那么关键的部分终于来了。如何在这一堆文本中快速分析得到你想要的数据。这个 json 文件可不小,大约几十MB呢。实际上有很多办法实现,我用的是PowerShell。

我也不卖什么关子了,这里直接上最终的代码。

(Get-Content .\outlook.live.com.har | `   ConvertFrom-Json).log.entries `  | Where-Object {($_.response.headers `      |where-object {$_.name -eq "report-to"}).length -gt 0} `  | Select-Object @{Name='URL';Expression={$_.request.url}}

这一行代码(没错,其实只有一行,只不过为了看起来直观换行了而已)即可得到我需要的结果

通过PowerShell进行网络分析

这一行代码的意思是

  1. 读取outlook.live.com.har 这个文件

  2. 将文件内容转换为json对象,并读取log属性的entries对象集合

  3. 针对entries集合进行筛选,查找那些response的headers中,包含了name=report-to 这个值的entry

  4. 如果找到的,则返回该entry的request对象的url属性

  5. 将所有找到的,用一个列表返回

预告一下,年内会有一本关于企业元宇宙的新书上市,我参与编写了其中的低代码的部分,费了一个月的脑筋,写下两万余言,希望对大家有所帮助吧。

但正如我在那本书中的结论一样,有代码和无代码本质上并无差别。写代码使我快乐,所以才会有这个分享。

通过PowerShell进行网络分析