为了给海外用户加速,正文通过 allorigins 这类公共代理拉取,蜘蛛抓到的页面里只有一行 rate limit exceeded。
一开始怀疑是「正文接口跨域依赖代理,蜘蛛不执行脚本时拿不到内容」,查了一圈,方向不对。
真正麻烦的地方在于,几个原因的现象几乎一样。公共代理对同一 IP 有频率限制,蜘蛛并发一高就被拒。也可能是代理返回 403 后前端没有兜底,直接把错误信息渲染进正文。
少数情况下是代理域名不在站点控制范围内,证书和可用性都不可控。
直接请求正文接口确认返回
curl -s 'https://api.allorigins.win/raw?url=https://www.example.com/api/post/1' | head -5
然后把正文改成服务端渲染直出
curl -s https://www.example.com/post/1 | grep -c '<article'
给代理失败加兜底内容
if (!body) { body = document.querySelector('.fallback').innerHTML; }
恢复的判定其实很直接。正文改回服务端直出后,蜘蛛抓到的页面恢复完整,代理只用于前端次要模块,抓取失败率降到零。
任何依赖第三方代理的输出都可能成为单点,正文这种核心内容必须由站点自己可控地返回。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。
