知其然,知其所以然
爬虫工程 2026-10-12

原始响应归档:自己写 WARC 记录

在本机用手写的 WARC 记录实测:套接字字节原样写入并用 warcio 读回、chunked 的摘要要算在存下的字节上、requests 解码后再存会让头与正文对不上、每条记录单独 gzip 才能被 warcio 读并按偏移随机访问、revisit 记录省 29%、写到一半被截断后怎么恢复。

爬虫 WARC 原始响应 归档 gzip revisit warcio Python 真实验证 动画演示
爬虫工程 2026-10-12

sqlite 存抓取结果:WAL 与单写线程

在本机 sqlite 3.53.4 上实测:WAL 比默认日志模式每秒提交次数高一个数量级、多线程各开连接写同一个库的 locked 错误和 busy 等待、单写线程加队列的批大小对吞吐的影响、WAL 下读写互不挡、以及长读事务会让 WAL 一直增长。

爬虫 sqlite WAL 单写线程 批量提交 checkpoint Python 真实验证 动画演示
MongoDB 2026-10-12

WiredTiger 的读写 ticket 与并发

实测 9.0.2 的读写 ticket:初始 10 个、由 throughputProbing 缓慢调整(64 线程持续 30 秒只涨到 13);40 个并发慢读最快 822 ms、最慢 3052 ms 且排队 29 个;改成固定并发后 ticket 下限为 5(设 4 返回 BadValue),16 并发总耗时 2737 ms,放大到 128 后 1198 ms 且不排队。

MongoDB WiredTiger ticket 并发 executionControl throughputProbing 真实验证 动画演示
爬虫工程 2026-10-12

批量写入:批大小对吞吐的影响

在本机 sqlite 上实测批大小:从 1 到 100 提高十几倍,1000 以后持平;行大了收益变小;只按条数攒批时慢速阶段数据会等几秒,加超时可压到约 0.2 秒;kill -9 时没提交的批会丢;一批里有一行违反约束整批回滚。

爬虫 批量写入 批大小 executemany sqlite kill -9 Python 真实验证 动画演示
爬虫工程 2026-10-12

爬虫指标:成功率与延迟分位数

在本机服务器上抓 2000 个 URL 实测:平均值是中位数的 1.8 倍;不同分位数算法在小样本时差十几个百分点;100 个样本的 p99 可以差 10 倍;worker 各自的 p99 不能平均;超时封顶会让 p99 失真;只看状态码会把空正文算成成功。

爬虫 监控 指标 延迟分位数 p99 成功率 直方图 Python 真实验证 动画演示
MongoDB 2026-10-12

FTDC:诊断数据里记了什么

实测 FTDC:默认每秒采样、每块 300 个采样、目录上限 500 MB;文件是 BSON 块序列(type 0/1/2),type 1 是 zlib 压缩的参考文档加 varint 差值流;一个采样 5,036 个指标;自己写解码器还原出 opcounters.insert 的增量(2000+2000+2000+1000 = 7000)与真实插入一致;估算空闲实例每天约 12.5 MB。

MongoDB FTDC diagnostic.data 诊断数据 serverStatus 真实验证 动画演示
爬虫工程 2026-10-12

User-Agent 与联系方式:服务端日志里看到什么

在本机 nginx 的访问日志里看各 HTTP 库默认的 User-Agent、自报身份的 UA 与 From 头怎么出现、UA 太长 nginx 默认从 8200 字节起返回 400、中文 UA 在 requests/urllib 里报错,以及 UA 的写法怎么影响 urllib.robotparser 的匹配。

爬虫 User-Agent From头 nginx 访问日志 robots.txt 联系方式 Python 真实验证 动画演示
爬虫工程 2026-10-12

Redis 任务队列:worker 崩溃后任务怎么重新入队

在本机独立的 redis-server 上实测任务队列的崩溃恢复:BRPOP 取出就丢、BLMOVE 加 ack 不丢但会重复、租约到期自动放回、租约比任务短会无限重复、取任务分两步会在空隙里丢任务、毒任务要有重试上限。

爬虫 Redis 任务队列 租约 至少一次 Lua kill -9 Python 真实验证 动画演示
爬虫工程 2026-10-12

分布式去重:Redis SADD 的原子性

在本机独立的 redis-server 上实测:8 个 worker 先查再加会把 3000 个 URL 抓成一万七千多次,只用 SADD 的返回值恰好 3000 次;30 万个 URL 用 SET 存完整 URL 30.5 MiB、8 字节摘要 12.2 MiB、Bloom 位图 0.6 MiB;Bloom 同样要原子地测试并置位;DEL 一个 200 万成员的 SET 会让 PING 等 242 ms。

爬虫 分布式去重 Redis SADD Bloom过滤器 原子性 UNLINK Python 真实验证 动画演示
爬虫工程 2026-10-12

服务端限流:固定窗口、滑动窗口、令牌桶从客户端看是什么样

自己实现固定窗口、滑动窗口日志、滑动窗口计数、令牌桶四种限流器,从客户端看:固定窗口在边界附近 0.15 秒内放过两倍限额(20 对 10);整秒的 Retry-After 让客户端多等;429 后立刻重试多发 260 倍请求;AIMD 在窗口类限流下偏低。

爬虫 限流 429 Retry-After 固定窗口 滑动窗口 令牌桶 AIMD Python 真实验证 动画演示
爬虫工程 2026-10-12

蜜罐链接:页面里的隐藏链接会被谁触发

在本机页面上量隐藏链接:17 种写法里,静态解析全部跟进,加内联样式过滤后仍有 5 个被跟进,Chrome 可见性判断只跟进 1 个(文字与背景同色),但会漏掉屏幕外的无障碍链接;遵守 robots.txt 的 Disallow 就不会碰到 /trap/;陷阱请求和所在页面的间隔只有 0.6 ms。

爬虫 蜜罐链接 隐藏链接 robots.txt checkVisibility lxml Chrome Python 真实验证 动画演示
数据编码与压缩 2026-10-12

怎么公平地比较编码与压缩:测试数据、指标与重复次数

本系列的方法篇:五个合成数据集、计时用中位数且机器要空闲、同一个压缩结果换基准压缩比从 5.42× 变成 6.66×、每条单独压缩只有 1.25× 而整批压缩是 5.40×、数据越重复压缩比越高、多线程压缩大数据输出会和单线程不同。

编码 压缩 基准测试 测试方法 zstd Python 真实验证 动画演示
京ICP备2026067502号-1京公网安备11010502063487号