11 月 1 号晚上,我躺在沙发上用手机搜 site:moxiaoa.com。

结果出来一条。

就一条,还是首页。

那会儿站点上线快一个月了,48 篇文章,每一篇都老老实实写了 TDK,sitemap 也提交了,主动推送天天在跑。按理说不该是这个结果。

我第一反应是"是不是还没收",第二反应是"不对,我每天都推 10 条,它不可能没来抓"。

于是爬起来开电脑,进了宝塔后台,把访问日志拉下来。

先看蜘蛛到底来了没有

日志路径是 /www/wwwlogs/moxiaoa.com.log,combined 格式。我用 awk 筛出百度蜘蛛的请求:

sudo awk '$12 ~ /Baiduspider/ {print $7}' moxiaoa.com.log | sort | uniq -c | sort -rn | head -20

$7 是请求路径,$12 是 User-Agent。

结果是这样的:

指标数值
日志总行数23645
Baiduspider 请求次数377
独立 URL160 个
返回 200368 次
返回 4049 次

377 次抓取,160 个页面,368 次成功。

来了,而且来得挺勤。

那就不是"没抓"的问题,是"抓了不收"。

抓取的时间分布,暴露出一个规律

把抓取按天统计:

sudo awk '$12 ~ /Baiduspider/ {print substr($4,2,11)}' moxiaoa.com.log | sort | uniq -c
日期抓取次数
10-285
11-013
11-03144
11-0552
11-062
11-07109
11-0858
11-094

看出两个高峰:11 月 3 号和 11 月 7 号,各一百多次。

这两天我都做了什么?3 号发了一批文章,7 号改了 sitemap。

这说明蜘蛛是被"有新东西"触发来的,不是按固定节奏巡检。

平时一天三五次,几乎等于没来。所以指望"放着不管自然收录"是不现实的——新站没有权重,蜘蛛不会主动来。

第二个发现:65% 的抓取配额,被一个页面吃掉

这是最关键的一条。

我按 URL 前缀归了一下类:

sudo awk '$12 ~ /Baiduspider/ {print $7}' moxiaoa.com.log | \
  sed 's#/post/.*#/post/*#; s#/devkit/.*#/devkit/*#' | \
  sort | uniq -c | sort -rn

结果:

URL 前缀独立 URL 数占比
/devkit/ 及子路径10565.6%
/post/ 文章页4528.1%
扫描垃圾路径74.4%
主页面31.9%

一个工具箱页面,吃掉三分之二的抓取量。

我去查了下这个 /devkit/ 到底是什么情况。用 curl 抓几个子页面算 md5:

for u in /devkit/ /devkit/tool/pdf/pdf-split /devkit/tool/math/math-random \
         /devkit/cat/security /devkit/tool/text/text-dedup; do
  echo -n "$u  "
  curl -s "https://www.moxiaoa.com$u" | md5sum
done

输出:

/devkit/                          c4cb3bfeaefe845ebf03aac0a94e563a
/devkit/tool/pdf/pdf-split        c4cb3bfeaefe845ebf03aac0a94e563a
/devkit/tool/math/math-random     c4cb3bfeaefe845ebf03aac0a94e563a
/devkit/cat/security              c4cb3bfeaefe845ebf03aac0a94e563a
/devkit/tool/text/text-dedup      c4cb3bfeaefe845ebf03aac0a94e563a

五个不同的 URL,返回的 HTML 一字节不差,全是 18060 字节。

原因不复杂:这是个前端路由的工具箱,所有子页面都靠 JS 渲染。服务器对任何路径都返回同一个空壳 HTML,内容在浏览器里才生成。

而蜘蛛不执行 JS(百度对这个能力的支持很有限),它看到的永远是这个空壳。

于是它认为:这个站有一百多个一模一样的页面。

重复内容对新站是致命的。百度不会把抓取配额浪费在一堆相同的空壳上,但它一开始不知道,只能一个个爬,爬完发现全一样,就把这个站点的"内容质量"往下调。

65% 的配额,喂了一堆重复页。

第三件事:45 篇文章全抓了,但一篇没收

/post 下的 45 个页面(当时是 45 篇,后来补到 48),蜘蛛全都访问过,全是 200。

但 site 查询只有首页。

这说明收录卡在了"抓取"之后的环节——索引评估。

可能的原因我列了几条,逐条排查:

内容重复? 我抽了几篇比对,都是原创,没有抄。排除。

canonical 有问题? 这个查过,previously 修了 canonical,指向自身,正确。

站点权重太低? 新站,一个月,零外链。这条最可疑。

抓取配额被稀释? 前面已经证实,65% 被 devkit 吃了。

最致命的一条:外链是零

我把日志里所有请求的 referer 抽出来,筛掉站内的:

sudo awk '{print $11}' moxiaoa.com.log | grep -v 'moxiaoa.com' | \
  grep -v '-' | sort | uniq -c | sort -rn | head

一条外部 referer 都没有。

也就是说,一个月里没有任何一个外站链接过来过。

这件事的含义比想象中严重。搜索引擎判断一个站值不值得收录,除了内容本身,还看"有没有别人提到你"。零外链的站,在算法眼里就是一个孤岛——内容再好,也没有第三方背书。

这也是为什么我天天推 10 条,蜘蛛来了,还是只收首页。

主动推送解决的是"让它知道有这个 URL",解决不了"让它相信这个 URL 值得收"。

我做了什么

三条,按优先级:

第一,给 /devkit/ 加 canonical,并且在 robots 里禁掉大部分子路径。

robots.txt 改成:

User-agent: *
Allow: /
Disallow: /devkit/tool/
Disallow: /devkit/cat/
Sitemap: https://www.moxiaoa.com/sitemap.xml

只留 /devkit/ 首页可抓。这样蜘蛛不会再被一百多个空壳牵着走,配额能还给文章页。

第二,补 canonical。

给 /devkit/ 首页加了指向自身的 canonical。之前没有,现在每个页面都有。

第三,开始做外链。

这一条最难也最有效。我的做法是:在知乎的每篇文章末尾带上站址(这也是为什么你在我知乎文里能看到站址),另外找了一个朋友的站换了友链。

修完之后的变化

robots 和 canonical 是 11 月 8 号改的,之后两天的抓取数据:

日期抓取次数其中 /devkit
11-085812
11-0940

/devkit 的占比从 65% 掉到接近 0。

但收录还没立刻变——修改和收录之间有个滞后期,通常一到三周。搜索引擎要重新抓、重新评估,不是改完立刻生效。

几个我现在的判断

一、抓 ≠ 收。 这是最容易被误解的一点。后台看到蜘蛛来了、状态码 200,不代表页面被收录。抓取只是"它来看了一眼"。

二、新站的抓取配额很少。 一个月 377 次,平均一天 12 次。这 12 次怎么分配,决定了你能不能把新内容送进去。重复页、参数页、404,全在偷配额。

三、零外链是根因。 内容、TDK、sitemap 都是"必要条件",不是"充分条件"。没有外部信号,算法没有理由给你权重。

四、推送有用,但不是万能。 它能让蜘蛛更快发现新 URL,但决定收不收的是页面质量和站点权重。

接下来打算做的

这件事没有捷径,只能一项项排。

最后

如果你的站也遇到"抓了不收",别急着怀疑内容。先去翻日志,看蜘蛛把配额花在哪儿了。

十有八九,问题不在文章里,在你没注意的那几个页面上。


如果你也在折腾这套东西,碰到卡住的地方,可以加我微信 lige0552 聊聊。白天要上班,消息回得慢,看到都会回。