a
HTTP Archive(HAR)1.2 格式的官方规范文档页:
什么是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 | { |
关键字段:
log.entries[] 所有网络请求
request.url 请求地址
response.status HTTP 状态码
response.content.mimeType 响应类型
response.content.text 响应正文,HTML/JSON 通常在这里
你的这个页面里,真正的资源链接不是单独请求出来的,而是已经写在登录后的 HTML 里,比如:
所以不是靠“点下载请求”,而是从页面 HTML 里把这些链接正则提取出来。
2.如何获取 HAR
浏览器里操作:
登录网站。
打开目标页面。
按 F12。
进入 Network / 网络。
勾选:
- Preserve log / 保留日志
- Disable cache / 禁用缓存
刷新页面。
如果页面资源需要点按钮才出现,就把“查看、播放、下载、预览”等按钮都点一遍。
Network 面板空白处右键:
- Save all as HAR with content
- 保存为 .har
注意:HAR 可能包含 Cookie、登录态、个人信息,不要发给别人或上传公共平台。
3.先看 HAR 里有哪些请求
我用了类似这个命令:
1 | $harPath = ".\www.socchina.net.har" |
$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/…
- 从页面 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 等都抓出来。
- 下载提取出来的资源
最简单的下载方式:
$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
- 验证有没有下错
有时下载出来的不是文件,而是登录页 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 离线解析出来。
