网站跑得稳不稳,很多时候不取决于内容量,而取决于爬虫来的时候服务器扛不扛得住。尤其是做了蜘蛛池、批量提交 URL 或者内容更新频繁的站点,抓取请求会在短时间里集中出现。如果页面大多是动态查询、又没有缓存层,数据库连接数会被迅速占满,最后表现为 5xx 增多、响应变慢,访客和爬虫一起受影响。
先分清是谁在抓
打开日志,看 User-Agent 和 IP 段。大致分三类:主流搜索引擎的爬虫、自己发起的蜘蛛池或批量请求、第三方采集与扫描工具。三类请求的处理方式完全不同,混在一起做限速,很容易把正常抓取也一起挡掉。
- 主流搜索引擎:核对 IP 反查与 UA 是否一致,通常可以放行,靠抓取频次设置来调节。
- 自建抓取:自己发的请求最可控,控制并发数、加延时即可,不必上服务器层策略。
- 采集与扫描:数量大、路径杂乱、常集中在搜索页或参数页,需要单独限速。
从日志里看出压力来源
按时段统计请求量
把日志按小时切分,统计总请求数、动态请求数和 5xx 数量。如果某几个小时的曲线和服务器负载曲线几乎重合,说明压力确实来自抓取,而不是正常访问高峰,这时再去优化页面就有的放矢。
区分页面类型
同一个站点的页面,抓取成本差别很大。列表页、详情页通常有缓存,站内搜索结果页、筛选排序页、日历归档页往往每次都要查库。统计这些路径在日志中的请求占比,就能知道抓取预算到底花在了哪里。
减少被抓的页面数量
与其在服务器端硬扛,不如让爬虫少抓一些没价值的地址。抓取预算和服务器资源一样,都是有限资源。
- 站内搜索结果页加 noindex,并在 robots.txt 里屏蔽查询参数路径。
- 筛选、排序、对比类参数页做规范化,只保留一个可抓取入口。
- 空结果页、无内容的标签页与作者页,要么补内容,要么别让入口外露。
- 分页过深的列表,考虑用加载更多配合站点地图,减少无效翻页。
服务器端的缓冲手段
- 静态资源和可缓存页面交给 CDN,让回源请求尽量少。
- 给详情页做页面缓存或对象缓存,减少重复查询。
- 在 Nginx 层配置连接数与请求速率限制,先限并发再限总量。
- 数据库慢查询单独记录,别让爬虫触发的查询把连接池占满。
限速与封禁的边界
限速手段要留后路。直接按 IP 段封禁、一律返回 403,可能误伤正常的搜索引擎爬虫,也可能让已经收录的页面慢慢失去抓取。比较稳妥的顺序是:先屏蔽无价值路径,再限制并发,最后才对确认的恶意来源做封禁。
一个实用的判断标准:如果某个来源的请求几乎不产生有效访问,路径集中在搜索页和参数页,且频次明显超出正常范围,才考虑收紧策略。
形成定期复盘
抓取压力不是一次配置就完事。站点结构变了、内容更新节奏变了、蜘蛛池规模变了,压力分布都会跟着变。建议每个月看一次日志汇总:抓取总量、动态请求占比、5xx 次数、平均响应时间。四个数字稳定,说明当前策略还够用;其中一个突然抬头,就去日志里找那批请求。
把抓取当成一种需要分配的资源来看待,往往比单纯加机器更有效。让爬虫多看该看的页面,少碰没价值的地址,服务器自然轻松一些。