浏览器历史记录看不到,从会话快照找回打开过的网页
浏览器历史记录看不到,从会话快照找回打开过的网页
浏览器历史记录里翻不到以前打开过的网页,是常事。多数人以为数据被清掉了,其实大半还在,只是没躺在历史记录里,躺在另一个地方。这篇把找回来的完整过程拆开讲,每一步给命令,讲清楚结果怎么看。
为什么历史记录里翻不到
Chromium 内核的浏览器(Chrome、Edge、联想浏览器 SLBrowser、360 极速这些都属于)把历史记录存在一个 SQLite 数据库里,文件名 History.db,位置在用户数据目录下。界面里 chrome://history 看到的那些条目,就是从这张表读出来的。
这张表有个清理策略:默认只留最近 90 天,更早的记录会被浏览器自己清掉,跟用户手不手动清无关。所以一台半年不关机的电脑,历史记录里往往只能翻到最近三个月,再往前就是空的。数据并没有凭空消失,是历史库把它清了。
两套数据分开存
浏览器把打开过的网页存了两份,多数人只看到第一份。
第一份是 History.db,就是上面说的历史库,有 90 天上限,会被自动清。
第二份是会话快照,存在用户数据目录的 Sessions 文件夹里。浏览器每隔一段时间就把当前所有打开的标签页序列化成一份快照,留着做崩溃恢复、断电恢复用。文件名形如 Session_数字 和 Tabs_数字。
两套数据的存法不同。历史库是按时间累积、到期删除;会话快照是覆盖式保存最近状态。只要浏览器在关掉时没有正常覆盖掉最后一份快照——比如崩溃、断电、被任务管理器强杀——这份快照里那批标签页的网址就还在,历史记录清没清都不影响它。找回网页,找的就是这份快照。
第一步:定位用户数据目录
会话快照在用户数据目录里,先找到这个目录。最稳的办法是查浏览器进程的启动命令行,里面通常带着 --user-data-dir 参数,直接告诉你数据在哪:
Get-CimInstance Win32_Process -Filter "name='SLBrowser.exe'" | Select-Object -ExpandProperty CommandLine
把 SLBrowser.exe 换成对应的进程名:Chrome 是 chrome.exe,Edge 是 msedge.exe。
命令行里如果有 --user-data-dir=某路径,就用那个路径。没有这个参数,按默认位置找:
- Chrome:%LOCALAPPDATA%\Google\Chrome\User Data
- Edge:%LOCALAPPDATA%\Microsoft\Edge\User Data
- 联想浏览器:%LOCALAPPDATA%\Lenovo\SLBrowser\User Data
浏览器要先完全退出再动这些文件,开着的时候目录被占用,读和拷都可能出错。
第二步:进 Sessions 文件夹找快照
用户数据目录下面有 Default 文件夹,多配置的浏览器还会有 Profile 1、Profile 2 之类,Sessions 就在它里面:
Get-ChildItem "$env:LOCALAPPDATA\Lenovo\SLBrowser\User Data\Default\Sessions" |
Sort-Object LastWriteTime -Descending |
Select-Object Name, Length, LastWriteTime
看输出:文件名以 Tabs_ 或 Session_ 开头,后面跟着一长串数字。按修改时间倒序排,最新的那份往往就是最后一次保存的标签页状态。
那串数字是时间戳,单位是微秒,起点是 1601 年 1 月 1 日(Windows 内部计时用的 FILETIME 纪元)。换算成能看的时间:
[datetime]::FromFileTime(13438225069177835 * 10)
乘 10 是因为 .NET 的 FromFileTime 按 100 纳秒算,而文件名里是微秒。上面这个数字换算出来是 2026-11-04 00:17,就是这份快照落盘的时间,用来核对是不是想要的那一份。
第三步:把快照拷出来
分析别在原文件上做,拷一份到别处,全程只读,不动浏览器数据目录里的任何东西:
Copy-Item "$env:LOCALAPPDATA\Lenovo\SLBrowser\User Data\Default\Sessions\Tabs_13438225069177835" -Destination "D:\tabs_snapshot.bin"
快照里装的是什么
这份文件是 Chromium 自带的 Pickle 二进制序列化格式,直接打开是一堆乱码。它有一个特点:里面存的网址、网页标题都是明文 UTF-8 字符串,前面带着长度字段。所以不需要写反序列化器,把它当字节流读出来,用正则捞 http 开头的串就行。
第四步:抽出网址
PowerShell 一版:
$p = "D:\tabs_snapshot.bin"
$raw = [System.IO.File]::ReadAllBytes($p)
$txt = [System.Text.Encoding]::UTF8.GetString($raw)
[regex]::Matches($txt, 'https?://[^\x00-\x20"<>\\]+') |
ForEach-Object { $_.Value } |
Sort-Object -Unique |
Set-Content -Encoding UTF8 "D:\urls.txt"
Python 一版(处理更方便,建议用这个):
import re
raw = open(r"D:\tabs_snapshot.bin", "rb").read()
urls = sorted(set(re.findall(rb'https?://[^\x00-\x20"<>\\]+', raw)))
with open(r"D:\urls.txt", "w", encoding="utf-8") as f:
f.write("\n".join(u.decode("utf-8", "ignore") for u in urls))
print(len(urls), "条")
正则里 \x00-\x20 是排除空字节和控制字符,因为字符串后面紧跟着长度字段和别的二进制数据,不排除的话会把垃圾一起吞进网址里。
跑完先看条数。这一步会把广告、统计、跳转链接一起带出来,条数虚高,接下来要滤。
第五步:过滤噪声
抽出来的链接里混着一批点开也打不开、或者根本不是网页的地址,常见三类。
第一类,跟踪和广告域名:doubleclick、googlesyndication、各种以 track、analytics、beacon、stats 结尾的。
第二类,内网地址:192.168.1.1 这种路由器管理页,本来就不是内容页。
第三类,跳转中转页:百度、搜狗这类搜索的跳转链接,本身不是内容,但 URL 参数里藏着真正的目标。
Python 过滤一版:
noise = ("doubleclick", "googlesyndication", "google-analytics",
"track", "beacon", "analytics", "stats", "count")
clean = []
for u in urls:
s = u.decode("utf-8", "ignore")
if any(w in s for w in noise):
continue
if s.startswith(("http://192.168.", "http://10.", "http://172.")):
continue
clean.append(s)
滤完剩下的就是真正打开过的网页地址,去重后按域名看分布。
第六步:从跳转链接里还原搜索词
百度这类搜索的跳转链接本身打不开,但参数里藏着用户当时搜的东西。百度搜索的 URL 长这样:
https://www.baidu.com/s?wd=%E9%93%81%E8%B7%AF
wd= 后面就是搜索词,做了 URL 编码。解出来:
from urllib.parse import urlparse, parse_qs, unquote
keywords = set()
for s in clean:
q = parse_qs(urlparse(s).query)
if "wd" in q:
keywords.add(unquote(q["wd"][0]))
print(len(keywords), "条搜索词")
这就是那批「历史记录里翻不到、但当时搜过」的关键词,全躺在跳转链接的参数里。
第七步:按域名归类
最后把有效地址按域名归类,方便阅读。域名字段在 URL 第三段,就是协议://之后、第一个 / 之前那截:
from collections import Counter
from urllib.parse import urlparse
domains = Counter(urlparse(s).netloc for s in clean)
for d, n in domains.most_common():
print(f"{n:5d} {d}")
按域名统计出来后,把同类的归到一起,就是一份能直接看的找回清单。
总结
历史记录里翻不到旧网页,先别认定数据没了。历史库 History.db 有 90 天清理上限,但会话快照——Sessions 里的 Session_ / Tabs_ 文件——是覆盖式保存最近状态,浏览器崩溃、断电、被强杀没覆盖掉的话,那批标签页网址就还在。
找回的路线一条直线:定位用户数据目录,进 Sessions 找最新的 Tabs_ 文件,拷出来,按字节流用正则抽 http 链接,再滤掉广告、内网、跳转中转页,最后从跳转参数的 wd= 里还原搜索词、按域名归类。
真正找不回来的只有一种情况:最后一份快照被正常关闭覆盖掉了,历史库也过期,两套都没了,那时候才真的没辙。
本文由猫娘助手整理。