很多站长发现新文章收录越来越慢,站长平台的抓取频次曲线往下走,却找不到原因。其实配额下降往往和两件事有关:站内生产了太多无效 URL,以及恶意爬虫把源站响应速度拖垮。本文用 9 个问答讲清 抓取配额为什么会掉、怎么用日志判断配额被浪费在哪、404 与 410 该怎么选、sitemap 怎么建才不白花抓取次数。
Q:抓取配额是什么?为什么会突然下降?
抓取配额是搜索引擎每天愿意在你的站点上花掉的抓取次数上限。它不是平均分配的,而是由四项因素共同决定:站点权重、内容更新频率、服务器响应速度、历史抓取成功率。
由此可以得到一个很重要的判断:配额不是被分配的,是被「挣」来的。站点越稳定、响应越快、抓取越少出错,配额越大;站点越慢、越容易超时、越容易返回错误页,配额就越小。
这也解释了恶意爬虫与抓取配额之间的关系:它抢的不是搜索引擎的抓取名额,而是你的服务器响应能力。当源站响应时间从 200 毫秒被拖到 3 秒,搜索引擎会主动降低抓取速率,结果就是恶意爬虫拖慢站点,等于你自降配额。所以拦截恶意爬虫本身就是一项提升配额的运维动作。
Q:怎么判断配额被浪费了?看哪几个数?
不用等平台报表,先看自己的访问日志。三个比例就够定性:
- 无效状态码占比:抓取请求里 404、410、301 的占比越高,配额浪费越严重。
- 带参数 URL 占比:筛选、排序、分页参数组合会制造出大量低价值 URL,它们会把配额吃干。
- 响应时间分布:被抓取请求的平均响应时间如果超过 1 秒,配额一定会被下调。
# 1) 状态码分布:看 404 与 301 占比
awk '{print $9}' access.log | sort | uniq -c | sort -rn | head
# 2) 带参数 URL 占全部请求的比例
total=$(wc -l < access.log)
param=$(awk '$7 ~ /\?/' access.log | wc -l)
echo "参数 URL 占比: $param / $total"
# 3) 按参数名聚合,找出制造 URL 爆炸的元凶
awk '$7 ~ /\?/ {split($7,a,"?"); n=split(a[2],b,"&");
for(i=1;i<=n;i++){split(b[i],c,"="); print c[1]}}' access.log \
| sort | uniq -c | sort -rn | head -10
经验参考:一个内容站的抓取请求里,返回 200 的有效页面应该占大头。如果 404 加参数页的占比超过一半,说明配额有一半以上花在了没有价值的地方,这种情况下的正确动作是先减少 URL 的产生,而不是先抱怨搜索引擎。
Q:404 和 410 到底该用哪个?
两者的语义完全不同,选错会白白消耗配额:
- 404 Not Found:暂时找不到。搜索引擎会反复回来确认,每次确认都是一次抓取消耗。
- 410 Gone:永久删除。明确告诉搜索引擎不用再回来,能加速下线、省下配额。
结论:确定永久删除的内容用 410,可能恢复的用 404。批量下线的旧栏目、已合并的页面、下架的商品详情页,都属于适合 410 的场景。
# 先验证真实状态码,别被「软 404」骗了
curl -sI https://www.example.com/old-page/ | head -1
# Nginx 中为特定路径直接返回 410
location ^~ /old-category/ {
return 410;
}
# 清理完成后,站内链接与 sitemap 里必须同步移除,否则 410 等于白设
要特别小心软 404:页面返回 200,内容却写着「该内容不存在」。搜索引擎会把这种页面当成有效页反复抓取,是配额浪费最隐蔽的一种形式。自查方法很简单,用 curl -sI 看第一行状态码即可。
Q:sitemap 应该怎么建才不浪费抓取配额?
sitemap 是「抓取优先级建议书」,不是全站 URL 的清单。三条硬规则:
- 只放返回 200 的规范 URL:把 404、410、重定向页写进 sitemap 会直接降低文件的信任度。
- 不放被 robots 屏蔽或被 noindex 的 URL:sitemap 说「请抓」、页面说「别收录」,这种自相矛盾会让搜索引擎降低对整份文件的采信度。
- lastmod 必须真实:批量刷时间戳等于告诉搜索引擎「全站天天在变」,结果是所有页面被均匀抓一遍,重点页面反而排不上队。
<?xml version="1.0" encoding="UTF-8"?>
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<sitemap>
<loc>https://www.example.com/sitemap-posts.xml</loc>
<lastmod>2026-09-29</lastmod>
</sitemap>
<sitemap>
<loc>https://www.example.com/sitemap-pages.xml</loc>
<lastmod>2026-09-20</lastmod>
</sitemap>
</sitemapindex>
文件规模也有上限:单个 sitemap 不超过 5 万条 URL 或 50 MB(未压缩),超出就必须用上面这种索引文件加分片的方式。分片维度建议按内容类型拆,而不是按时间无限追加,方便单独下线某一类 URL。
Q:sitemap 会不会反过来帮了爬虫?
会,而且这是很多站长忽略的一点。对采集器来说 /sitemap.xml 就是一张免费的全站地图,很多脚本启动后的第一个动作就是拉 robots.txt 和 sitemap。所以 sitemap 要按「给谁看」来设计:
- 只放你希望被正常收录的规范 URL,不要把内部接口、带参数的列表页、导出链接、接口文档写进去。
- 日志里单独统计 sitemap 的请求来源,如果大量请求的头是蜘蛛标识、IP 却不在官方段内,基本可以判定被借名使用。
- 不要为了防爬虫把 sitemap 整个下线,那样正常蜘蛛也抓不到新内容,等于自己砍配额。
# 单独落盘 sitemap 请求,便于比对来源
location = /sitemap.xml {
access_log /var/log/nginx/sitemap.log combined;
try_files $uri =404;
}
# 统计请求 sitemap 的 IP 与其来源段
awk '{print $1}' /var/log/nginx/sitemap.log | sort -u | wc -l
awk '{print $1}' /var/log/nginx/sitemap.log | sort | uniq -c | sort -rn | head
Q:收窄抓取面的正确顺序是什么?
顺序错了会做很多无用功。正确顺序是从便宜到重,而且先断流、后回收:
- 第一步:定位无效 URL 的来源。是站内链接制造出来的,还是外部链接带进来的,还是程序自动生成的分页与筛选页。用日志按路径前缀聚合就能看出来。
- 第二步:断流。改链接结构、去掉无意义的全量归档页、限制筛选参数组合、给已下架内容返回 410。这一步做不彻底,后面清理多少链接都会被重新生成出来。
- 第三步:回收。把已失效的 URL 从 sitemap 和站内链接中移除,让搜索引擎自然收敛。
# 按路径前缀看谁在制造大量 URL
awk '{print $7}' access.log | awk -F'[/?]' '{print "/"$2}' \
| sort | uniq -c | sort -rn | head -15
# 找出「只有被抓取、没有站内入口」的孤儿路径,通常是参数组合页
awk '$9 == 404 {print $7}' access.log | sort | uniq -c | sort -rn | head -20
Q:怎么把「响应速度」这一项拉回来?
因为配额与响应速度直接挂钩,所以这一节和拦截恶意爬虫其实是同一件事:
- 静态资源交给 CDN:图片、CSS、JS 不走源站,源的响应时间立刻下降。
- 给遍历型爬虫快速返回:确认是异常遍历的请求,直接 429 或 410 快速返回,不要让它把你的后端查询全部跑一遍。快速拒绝比慢慢处理更省资源。
- 收紧超时设置:慢速请求会长期占用工作进程,间接拉高整体响应时间。
map $http_user_agent $suspect_crawler {
default 0;
"~*(python-requests|scrapy|Go-http-client|masscan)" 1;
}
limit_req_zone $suspect_crawler zone=suspect:5m rate=1r/m;
server {
# 可疑采集器:一分钟一个请求,超出直接 429
limit_req zone=suspect burst=3 nodelay;
limit_req_status 429;
# 慢请求不要拖住工作进程
client_header_timeout 10s;
client_body_timeout 10s;
send_timeout 15s;
}
# 静态资源独立处理,不占用动态接口的限速额度
location ~* \.(jpg|png|webp|css|js)$ {
expires 30d;
add_header Cache-Control "public, max-age=2592000";
}
Q:改动之后怎么验证效果?
三个指标,缺一个都容易误判:
- 抓取频次:站长平台的抓取统计曲线,看总量是否回升。
- 抓取成功率:有效 200 响应占抓取请求的比例,这个数上升说明配额用得更值。
- 重要页面的更新延迟:从发布到被抓取、被收录的时间差。
# 把官方蜘蛛与可疑爬虫分开统计,两个数应该一个稳中有升、一个下降
grep -iE "baiduspider|googlebot|bingbot" access.log | wc -l
grep -iE "python-requests|scrapy|Go-http-client" access.log | wc -l
# 看被抓取请求的平均响应时间
awk '/baiduspider|googlebot/ {sum+=$NF; n++} END {print sum/n}' access.log
时间尺度要有耐心:搜索引擎的策略收敛通常需要 2 到 8 周,改动当天看不出效果是正常的,不要因为一天没变化就反复调整策略,频繁变动反而会让抓取行为更保守。
Q:还有什么补充建议?
- 不要用 5xx 挡爬虫。大量 5xx 会被判断为站点故障,直接导致配额被砍,宁可返回 429 或者 403。
- 限速优先于封禁。给 429 加上
Retry-After头,合规爬虫会自动降低频率,比直接封 IP 更省事,也不会误伤共享出口。 - 让 404 页面也轻量化。如果 404 页面还要走数据库和模板,等于无效请求也在消耗资源。
- 站内链接比外链更能影响配额。站内导出链接越多,被抓取的 URL 就越多,该加 nofollow 的列表页、标签云、归档页要果断处理。
一句话总结:抓取配额下降大多是两件事造成的——无效 URL 生产过剩、源站响应被爬虫拖慢;先用 410 和 sitemap 收敛抓取面,再把响应速度和恶意爬虫管住,配额自然会回来。