结论:分析蜘蛛对图片和视频的抓取,核心是“日志字段先补齐,再按资源类型+蜘蛛UA聚合,最后看请求数、字节数、状态码、响应时间、缓存命中率五组指标”。只要在 Nginx 日志里给 .jpg/.png/.webp/.avif 和 .mp4/.m3u8/.ts 打上 image/video 标记,用一条 ClickHouse SQL 就能按 Googlebot、Baiduspider、bingbot 等维度出日报;重点盯 404、5xx、429 和 206/304 比例,就能判断抓取健康度与带宽浪费点。
分析蜘蛛抓取图片视频,日志里必须先补哪些字段?
结论:只靠默认 combined 日志不够,必须增加资源类型、缓存状态、响应时间三个字段。Nginx 用 map 给 URI 打标,再用 JSON 格式落盘,后续用 jq 或 ClickHouse 解析都不容易错位。
map $request_uri $res_type {
default "other";
~*\.(jpe?g|png|gif|webp|avif|svg|ico)$ "image";
~*\.(mp4|webm|mov|flv|m3u8|ts)$ "video";
}
log_format json_log escape=json '{"time":"$time_iso8601","ip":"$remote_addr","uri":"$request_uri","status":$status,"bytes":$body_bytes_sent,"ua":"$http_user_agent","rt":$request_time,"cache":"$upstream_cache_status","res":"$res_type"}';
access_log /var/log/nginx/access_res.log json_log;
字段至少要保留:时间、IP、URI、状态码、响应字节数、User-Agent、响应时间、$upstream_cache_status、资源类型。$upstream_cache_status 的 HIT/MISS/EXPIRED/REVALIDATED/BYPASS 用来算缓存命中率;没有 CDN 或 Nginx 缓存时该字段为空,命中率指标跳过。
怎么区分真假蜘蛛?
结论:UA 可以伪造,必须用反向 DNS 验证。Googlebot 的正向解析必须落在 googlebot.com 或 google.com,Baiduspider 落在 baidu.com,bingbot 落在 search.msn.com,否则一律标记为 fake。
验证命令:host 66.249.66.1 返回 crawl-66-249-66-1.googlebot.com,再 host crawl-66-249-66-1.googlebot.com 应返回同一个 IP。两步不一致就是假蜘蛛。百度、Bing、Yandex、PetalBot 同理。把验证结果写入日志或离线表,后续统计只信任 verified 蜘蛛。
图片和视频抓取量、流量、命中率怎么统计?
结论:用 ClickHouse 或 Elasticsearch 按天聚合,查 7 天窗口,输出每个蜘蛛对 image/video 的请求数、MB、404、5xx、平均响应时间和 HIT 率。下面 SQL 可直接套用:
SELECT res_type,
multiIf(ua LIKE '%Googlebot%','Googlebot',
ua LIKE '%Baiduspider%','Baiduspider',
ua LIKE '%bingbot%','bingbot',
ua LIKE '%Bytespider%','Bytespider',
ua LIKE '%YisouSpider%','YisouSpider',
ua LIKE '%PetalBot%','PetalBot',
ua LIKE '%360Spider%','360Spider',
ua LIKE '%Sogou%','Sogou','other') AS spider,
count() AS reqs,
round(sum(bytes)/1048576,2) AS mb,
countIf(status=404) AS c404,
countIf(status>=500) AS c5xx,
round(avg(rt),3) AS avg_rt,
round(countIf(cache='HIT')/count()*100,2) AS hit_rate
FROM access_log
WHERE res_type IN ('image','video')
AND time >= now() - INTERVAL 7 DAY
GROUP BY res_type, spider
ORDER BY mb DESC;
看结果时注意:图片常见 200、304,视频常见 200、206。206 表示 Range 分段拉取,不是错误;304 表示协商缓存命中,正常。404 占比超过 5%、5xx 超过 1%、429 超过 0.5%,就要查死链、源站压力和限速策略。平均响应时间超过 1 秒会降低蜘蛛抓取频次。HIT 率低于 80% 说明 CDN 或 Nginx 缓存 TTL 偏短。
哪些异常指标要立刻处理?
结论:图片视频流量占比超过 70%、URL 占比低于 20%,说明媒体资源吞带宽;同一 URL 24 小时内被同一蜘蛛抓取超过 10 次,说明重复抓取;单蜘蛛单日请求超过 100 万次,要检查是否被恶意镜像或参数泛滥。
另外,403 集中出现说明权限或防盗链拦截了蜘蛛;404 集中在旧尺寸图或旧视频切片,要清理 sitemap;5xx 集中在视频转码或回源,要查源站。把上述阈值写成告警规则,按小时聚合,比月底看报表有效。
分析后怎么优化蜘蛛抓取?
结论:让静态媒体走 CDN,给长缓存,保留 304/206,robots.txt 挡住无价值路径,视频用 Video Sitemap 引导。图片响应头设 Cache-Control: public, max-age=31536000, immutable;m3u8 设 max-age=10,ts 设 max-age=31536000。robots.txt 对 /tmp/、/private/、带 ?preview= 的临时图加 Disallow,减少蜘蛛空抓。
日志保留 90 天,按天分区。每周对比 Googlebot、Baiduspider、bingbot 的 image/video 请求曲线:如果某蜘蛛流量突增但 404/429 同步上涨,先查参数和死链,再调 CDN 缓存,最后才考虑 robots 限流。
总结:先补资源类型、缓存状态、响应时间字段,再验证真假蜘蛛,接着按蜘蛛和资源类型聚合请求数、流量、状态码、响应时间、命中率,最后用 404>5%、5xx>1%、429>0.5%、平均响应>1s、HIT<80% 这几条线做告警和优化。这样既能看清蜘蛛对图片视频的抓取全貌,也能直接定位带宽浪费和抓取预算问题。