a

HTTP Archive(HAR)1.2 格式的官方规范文档页:

http://www.softwareishard.com/blog/har-12-spec/

什么是HAR文件?

HAR 全称 HTTP Archive(HTTP 归档格式),是一种基于 JSON 的通用标准化格式,用于完整记录 HTTP 网络交互的全量数据 —— 包括请求方法、URL、请求 / 响应头、Cookie、查询参数、POST 数据、响应内容、各阶段耗时、缓存状态、服务器 IP 等全部信息。它是前端性能分析、网络故障排查、抓包工具数据互通的行业通用格式,Chrome/Firefox 开发者工具、Fiddler、Charles 等几乎所有网络调试工具都支持导出 / 导入 HAR 文件。

从获取HAR到解析下载的过程:

1. 让浏览器登录并打开目标页面。
2. 把 Network 记录导出成 HAR。
3. 从 HAR 里找出页面源码或资源请求。
4. 提取 href / src 中的文件链接。
5. 用 curl 批量下载。

6. HAR 是什么
1.HAR大概是什么

HAR 全称是 HTTP Archive,结构大概是这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{
"log": {
"entries": [
{
"request": {
"url": "https://www.socchina.net/competitionProduction?value=4",
"headers": []
},
"response": {
"status": 200,
"content": {
"mimeType": "text/html",
"text": "<html>...</html>"
}
}
}
]
}
}

关键字段:

log.entries[] 所有网络请求
request.url 请求地址
response.status HTTP 状态码
response.content.mimeType 响应类型
response.content.text 响应正文,HTML/JSON 通常在这里

你的这个页面里,真正的资源链接不是单独请求出来的,而是已经写在登录后的 HTML 里,比如:

播放
查看

所以不是靠“点下载请求”,而是从页面 HTML 里把这些链接正则提取出来。

2.如何获取 HAR

浏览器里操作:

  1. 登录网站。

  2. 打开目标页面。

  3. 按 F12。

  4. 进入 Network / 网络。

  5. 勾选:

    • Preserve log / 保留日志
    • Disable cache / 禁用缓存
  6. 刷新页面。

  7. 如果页面资源需要点按钮才出现,就把“查看、播放、下载、预览”等按钮都点一遍。

  8. Network 面板空白处右键:

    • Save all as HAR with content
    • 保存为 .har

注意:HAR 可能包含 Cookie、登录态、个人信息,不要发给别人或上传公共平台。

3.先看 HAR 里有哪些请求

我用了类似这个命令:

1
2
$harPath = ".\www.socchina.net.har"
$har = Get-Content $harPath -Raw | ConvertFrom-Json

$entries = @($har.log.entries)
“entries=$($entries.Count)”

$entries | ForEach-Object {
$url = $_.request.url
$hostName = ([Uri]$url).Host
$ext = [IO.Path]::GetExtension(([Uri]$url).AbsolutePath).ToLowerInvariant()

[pscustomobject]@{
  Host = $hostName
  Ext = $ext
  Status = $_.response.status
  Mime = $_.response.content.mimeType
  Url = $url
}

} | Group-Object Host | Sort-Object Count -Descending

这一步是为了判断资源来自哪里。你的 HAR 里主要域名是:

www.socchina.net
socoss.socchina.net
ai.jiaozuoye.online

目标文件基本在:

socoss.socchina.net/file/…

  1. 从页面 HTML 里提取文件链接

先取目标页面的 HTML:

$harPath = “.\www.socchina.net.har
$har = Get-Content $harPath -Raw | ConvertFrom-Json

$page = (
$har.log.entries |
Where-Object { $_.request.url -eq “https://www.socchina.net/competitionProduction?value=4“ } |
Select-Object -First 1
).response.content.text

然后用正则找 href 和 src 里的资源链接:

$lines = $page -split “r?n”
$items = @()

for ($i = 0; $i -lt $lines.Count; $i++) {
foreach ($m in [regex]::Matches(
$lines[$i],
‘(?i)(?:href|src)=”([^”]+.(?:mp4|pdf|docx?|rar|zip|7z|png|jpe?g|webp)(?:?[^”]*)?)”‘
)) {
$raw = $m.Groups[1].Value

  $url = if ($raw -match '^https?://') {
    $raw
  } elseif ($raw.StartsWith('/')) {
    'https://www.socchina.net' + $raw
  } else {
    'https://www.socchina.net/' + $raw
  }

  $items += [pscustomobject]@{
    Line = $i + 1
    Url = $url
  }
}

}

$items | Sort-Object Url -Unique

这一步会把页面中的 .mp4、.pdf、.rar、.png 等都抓出来。

  1. 下载提取出来的资源

最简单的下载方式:

$out = “.\socchina-downloads”
New-Item -ItemType Directory -Force -Path $out | Out-Null

$urls = @(
http://example.com/file/demo.mp4“,
http://example.com/file/report.pdf
)

foreach ($url in $urls) {
$uri = [Uri]$url
$name = [IO.Path]::GetFileName($uri.LocalPath)
$target = Join-Path $out $name

curl.exe -L --fail --retry 3 -o $target $url

}

我这次为了文件名更清楚,手动映射成了:

demo_video.mp4
technical_doc.pdf
code_package.rar
authorization.pdf
preview_1.png
preview_2.png
preview_3.png

  1. 验证有没有下错

有时下载出来的不是文件,而是登录页 HTML,所以要检查文件头:

Get-ChildItem .\socchina-downloads -File | ForEach-Object {
$fs = [System.IO.File]::OpenRead($.FullName)
try {
$buf = New-Object byte[] 16
[void]$fs.Read($buf, 0, 16)
$hex = ($buf | ForEach-Object { $
.ToString(“X2”) }) -join “ “

  [pscustomobject]@{
    Name = $_.Name
    MB = [Math]::Round($_.Length / 1MB, 2)
    Magic = $hex
  }
} finally {
  $fs.Close()
}

}

常见文件头:

PDF -> 25 50 44 46,也就是 %PDF
PNG -> 89 50 4E 47
RAR -> 52 61 72 21,也就是 Rar!
MP4 -> 通常包含 66 74 79 70,也就是 ftyp
HTML -> 通常是 3C 21 或 3C 68,也就是 <! 或 <h

你这次下载出来的文件头都正常,所以确认不是登录页或错误页。

总结一下

我做的事情就是:

读取 HAR
-> 找 competitionProduction 页面响应正文
-> 从 HTML 里提取 href/src 文件链接
-> 筛选 mp4/pdf/rar/png
-> 用 curl 下载
-> 检查文件头确认格式

真正关键的是:HAR 不只是请求列表,它还可能保存页面 HTML 内容。只要页面 HTML 里有资源地址,就可以从 HAR 离线解析出来。