这个坑值得记一笔。栏目页每天更新二十篇文章,百度蜘蛛一天来抓四十次列表页,详情页的请求数始终是个位数。列表页里明明有完整的 a 标签链接,HTML 也没有用 JS 渲染,日志里却看不到详情页的抓取记录,用 site 查询目录下的收录只有第一页。
刚开始盯着「列表页首屏只输出十条 后续内容靠滚动加载 蜘蛛压根触发不到」,折腾了半个多小时,排掉了。
把日志和配置对完,能解释这个现象的基本就这几处。列表页分页链接是 onclick 拼出来的 蜘蛛拿不到可跟随的 href;详情页 URL 带 sessionid 每次渲染都不同 蜘蛛把同一篇当成新地址;栏目页设置了 nofollow 属性 整块列表的链接权重被一起掐断。
第一件事是看列表页源码里详情链接是不是真实 href
curl -s https://www.example.com/news/ | grep -o 'href="[^"]*"' | head -20
随后统计日志里列表页与详情页的请求比例
grep -E '/news/[0-9]+\.html' access.log | wc -l
接着把分页改成可爬的静态地址
rewrite ^/news/page/([0-9]+)/?$ /news/index.php?page=$1 last;
末了确认列表区块没有被 rel=nofollow 包住
curl -s https://www.example.com/news/ | grep -c 'rel="nofollow"'
改完先别撤,确认这几项。改完第二天日志里详情页请求从每天十几条涨到四百多条,site 查询目录收录从一页扩到十几页,列表页与详情页的抓取比例回到正常水平。
抓取深度问题九成出在链接不可见,先确认 href 能被解析出来,再去调 sitemap 和提交接口。报错文案容易误导,真正的原因往往在相邻那一层的日志里。
