蜘蛛爬虫分析中 referer 字段能看出什么?
服务器日志中的 referer 字段可判断爬虫来源、发现可疑采集入口,识别假蜘蛛需结合 UA 与 IP 反查交叉验证,不能仅凭该字段封禁 IP。
学完这篇,你能从服务器日志里的 referer 字段读出蜘蛛的真实来源、判断真假爬虫、并顺藤摸瓜找到被采集的入口页面。
第一步:先搞清楚 referer 在爬虫请求里到底是什么
referer(HTTP 头里写作 Referer)记录的是「当前这个请求是从哪个页面跳过来的」。人类用户点链接,浏览器会自动带上它;爬虫程序是自己发的请求,带不带、带成什么样,完全取决于写爬虫的人。
在日志里的样子通常是这样(Nginx 默认格式):
124.90.xx.xx - - [12/Mar/2025:03:14:22 +0800] "GET /article/123.html HTTP/1.1" 200 18234 "-" "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)"
那个 "-" 位置就是 referer。真蜘蛛和假蜘蛛的差距,往往就在这个位置。
第二步:把 referer 分成四类,一眼看出问题
先把日志里的 referer 字段拉出来统计:
awk -F'"' '{print $4}' access.log | sort | uniq -c | sort -rn | head -50
(Nginx 默认 combined 格式里," 切分后第 4 段是 referer,第 6 段是 UA。日志格式不同字段号会变,先确认自己的 log_format。)
结果基本会落进这四类:
- 空 referer(
-):正常。绝大多数爬虫直接请求 URL,不带来源,尤其首次抓取。 - 自己的域名:也正常,说明它是顺着站内链接爬的。
- 搜索引擎自己的域名:如
http://www.baidu.com/search/spider.html、https://www.google.com/。这是最值得警惕的一类,下面细说。 - 陌生域名:可能是采集站的入口页、也可能是伪装,需要重点查。
第三步:用 referer 识别「UA 说自己是百度,referer 却不像百度」的假蜘蛛
真 Baiduspider 的 referer 通常是空,或者 Baidu 自己的页面。如果你看到一条 UA 是 Baiduspider、referer 却是 https://www.example-scraper.com/list/,这基本是伪造 UA 的采集器。
完整判断流程是「IP 反查 + referer 交叉验证」两步:
grep -i "Baiduspider" access.log | awk -F'"' '{print $2, $4, $6}' | head
# 2. 拿到可疑 IP 后反查归属
host 124.90.xx.xx
# 或
whois 124.90.xx.xx
真百度蜘蛛的 IP 段是固定的(可查百度官方公布的 spider IP 列表),若反查结果不是百度,而 referer 又指向某个站外域名,那这个 referer 就是它在「自报家门」——它可能是从那个页面抄了你的链接过来的。
注意:不要只凭 referer 一个字段就封 IP。UA 可以伪造,referer 也可以随便填。最可靠的做法是「IP 反查结果 + UA + referer」三条一起看,再用
nslookup IP看能不能反解出baidu.com这类域名。
第四步:从 referer 倒推「哪个页面被采集站盯上了」
如果某个陌生 referer 域名反复出现,而且请求量很大,说明对方是拿你站内某个页面当入口在批量采集。做法:
# 看哪个站外 referer 最活跃
awk -F'"' '$4 ~ /^https?:/ && $4 !~ /你的域名/ {print $4}' access.log \
| sort | uniq -c | sort -rn | head -20
拿到高频 referer 后,打开那个页面,看它链接了你哪些 URL。如果是列表页,说明对方在顺着你的分页爬;如果是单篇文章页,说明它在扒相关内容。
对应处理:在 Nginx 里对该 referer 返回 403:
if ($http_referer ~* "example-scraper\.com") {
return 403;
}
注意:
if在 location 里用要谨慎,配合return是安全写法;别拿它做复杂逻辑。改完用nginx -t测试再nginx -s reload。
第五步:用 referer 判断搜索引擎的抓取路径,优化收录
真蜘蛛的空 referer 请求,往往是「首次发现」;带站内 referer 的请求,是「顺链接深爬」。你可以统计一下:
# 真 Googlebot 的请求里,referer 为空的占比
grep -i "Googlebot" access.log | awk -F'"' '$4 == "-"' | wc -l
如果带站内 referer 的请求很少,说明你的内链结构太弱,蜘蛛爬不深,新页面收录慢。这时候该做的是补内链、加相关推荐、做好 sitemap,而不是怪蜘蛛不来。
小结
- referer 记录请求来源页,爬虫可以带、可以不带、也可以伪造,单看它不能定罪。
- 四类值快速分流:空、自己域名、搜索引擎域名、陌生域名;空和自家域名都正常。
- 假蜘蛛的典型特征是「UA 说自己是百度,referer 却指向站外陌生域名」。
- 判断可信度要靠 IP 反查 + UA + referer 三件套,真蜘蛛 IP 段可查官方列表。
- 陌生 referer 高频出现 = 有人拿某页面当采集入口,定位后可在 Nginx 里按 referer 返回 403。
- 真蜘蛛带站内 referer 少,说明内链太弱,重点该补内链和 sitemap。
原文链接:https://www.gj0.com/thread-1713.html
转载请注明出处并保留本声明;内容仅代表作者观点,与本站立场无关。若本文涉嫌侵权,请联系本站处理。