爬虫不是浏览器,别把它当回头客
搜索爬虫抓取页面时,通常不会像浏览器那样保存 cookie、维持 session 或携带登录态。对入口页来说,每一次请求都更像一个第一次到访的陌生人。即使同一个爬虫 IP 在几分钟内多次访问,也不代表它会记住上一次看到的 cookie。如果入口页把关键链接放在“设置 cookie 之后才输出”的逻辑里,爬虫拿到的可能只是一个空壳页面。
哪些访问状态设置会把爬虫挡在门外
- 先设 cookie 再跳转:入口页第一次返回 302,要求浏览器写入 cookie 后才展示真实链接。爬虫往往不会执行这一步,于是只拿到跳转响应。
- 用 session 判断是否来过:服务端发现没有 session 就返回验证页或空白页,爬虫同样会卡住。
- 依赖 cookie 才渲染正文:正文和链接由前端根据 cookie 是否存在来决定是否加载,爬虫在 HTML 源码里找不到可抓取内容。
- 频繁更换 cookie 名称:每次请求都生成新的 cookie 名或值,导致缓存失效,入口页回源压力升高,爬虫等待时间变长。
入口页更应该保持无状态
蜘蛛池入口页的核心任务是让爬虫发现 URL,而不是识别“谁来过”。因此,入口页最好保持无状态:用 200 状态码直接返回 HTML,把需要被发现的链接写在普通 a 标签里,不要求 cookie、不校验 session、不依赖前端脚本才输出内容。这样无论爬虫来自百度、Google 还是必应,拿到的都是同一份可解析的页面。
cookie 还会影响缓存与回源
如果入口页响应里带了 Set-Cookie,CDN 和反向代理往往会降低缓存命中率,甚至完全不缓存。爬虫并发抓取时,每个请求都回源,服务器响应变慢,抓取效率就会下降。更稳妥的做法是把入口页静态化,不设置影响内容输出的 cookie;如果确实需要统计访问,可以只用不参与内容判断的标记,并确保缓存策略不会因此被破坏。
资源接入时的几个检查点
- 域名和 IP 分层时,不要把需要 cookie 或 session 的页面放在高频抓取的入口层。
- 服务器端不要用 session 做入口页的准入判断,避免爬虫请求被重定向到验证页。
- 读日志时关注 Set-Cookie 比例、302 比例和响应时间,如果爬虫请求大量落在非 200 响应上,就要检查状态逻辑。
- 如果使用 JS 跳转,至少在 HTML 里保留一条普通链接作为兜底,防止爬虫在脚本执行前离开。
常见误区
有人以为给爬虫设一个 cookie,就能让它“记住”入口页,下次直接去抓目标页。实际上爬虫的抓取队列和抓取路径由搜索引擎调度,不会因为一个 cookie 就改变抓取计划。
另一个误区是用 cookie 做频率限制,想借此控制爬虫访问。搜索引擎爬虫通常不会按你的预期携带和回传 cookie,结果往往是正常用户先被挡在外面,爬虫该来的还是会来。
使用建议
把入口页做简单:直出 HTML、直出链接、无 cookie 依赖、无 session 校验、响应状态稳定在 200。如果业务上必须用 cookie,只把它用于不改变页面内容的统计用途。定期对比爬虫 UA 和普通用户拿到的响应,确认两者看到的是同一份页面。蜘蛛池入口页要的是“谁来都能看到同一份可抓取的内容”,而不是“记住谁曾经来过”。