现场是这样的。图片站前面套了对象存储 蜘蛛请求图片时带 Range: bytes=0-1023 源站返回 206 Partial Content 只给前 1KB 图片被截断 图片搜索里全是半张图 日志里 206 占图片请求六成
中间走过弯路,把「渐进式 JPEG 首段确实只有部分数据」当成主因,改完现象没变。
这类报错背后常见的原因有几处,逐个排除就行。源站支持 Range 但没有对爬虫关闭分片响应;CDN 回源把 Range 透传 缓存里存了半截内容;Content-Range 与 Content-Length 不一致。
带 Range 头复现一次
curl -s -H 'Range: bytes=0-1023' -o part.jpg -w '%{http_code} %{size_download}\n' https://img.example.com/a.jpg
再往下对蜘蛛 UA 关闭 Range 支持
if ($http_user_agent ~* 'Baiduspider|bingbot') { unset $http_range; }
随后清理 CDN 上已缓存的 206 响应
curl -X PURGE https://img.example.com/a.jpg
剩下的就是确认整图返回 200 且大小正确
curl -s -o /dev/null -w '%{http_code} %{size_download}\n' https://img.example.com/a.jpg
命令输出我都留了记录,免得改完记不清原来的值。
怎么算真的好了,看的是同一批现象。蜘蛛请求图片返回 200 全量内容 图片搜索里半图消失 缓存命中后字节数与源文件一致。
补一句。Range 是给断点续传用的 对整图抓取没有好处 反而容易在缓存层留下半截文件。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。
