跳到主要内容

抓取规则

这一页说明 CaelLabSearchSpider 从哪里开始抓、多久抓一次、遵守哪些声明,以及一个页面被抓到之后我们留下什么。

从哪里开始​

  • 已收录的站点:优先读 sitemap.xml(遇到 sitemapindex 会往下递归),读不到就从首页开始;
  • 然后顺着页面里的链接逐层展开,只跟公开可访问的 HTML 页面;
  • 外部链接也认:别的页面链到你,我们可能就顺着找过来了。

请求频率​

  • 同一个域名两次请求之间至少间隔 2 秒;robots.txt 里写了 Crawl-delay 就按更大的那个来(最长 30 秒);
  • 同一时间对一个站最多一个请求在发,不会并发压站;
  • 收到 429 或 5xx 会退避重试;响应里带 Retry-After 就按它说的等。

页面级的声明​

除了 robots.txt,页面自己的声明我们也认,两种写法都算数。写在 HTML 里:

<meta name="robots" content="noindex,nofollow">

或者写在响应头里:

X-Robots-Tag: noindex

两种写法合并起来判 —— 任何一处写了 noindex,这个页面就不进索引。带 UA 前缀的写法(比如 googlebot: noindex)不会误伤我们。链接上的 rel="nofollow" 同样尊重,那条链接直接丢掉。

noindex 只决定这一页自己收不收,不影响我们顺着它的链接继续走;nofollow 才是不跟这一页上的链接。

一个页面被抓到之后,我们留什么​

只留标题、描述和正文的前 2000 字,用于匹配查询。正文全文不入库,也不对外提供。搜索结果里显示的那段摘要,就是从这段内容里取的和查询词相关的部分。

内容没变的页面不会重复入库 —— 我们按内容判断有没有改过,改过才更新那一份。抽取和索引的细节见它是怎么工作的。

它不做什么​

  • 不抓需要登录的内容 —— 没有登录态、不带 cookie、不提交任何表单。
  • 不执行 JavaScript —— 只读服务器直接返回的 HTML。纯前端渲染的页面,我们只能拿到页面标题和 meta description,脚本生成的内容抓不到。
  • 不硬闯人机验证 —— 站点用 Cloudflare 之类的托管质询挡住时,我们过不了要跑 JS 的那道关,就只留一条「读不到内容」的说明,不会反复重试。
  • 不在域名打不开时反复敲 —— 域名解析不出来就是不存在,不重试。
  • 不做压力测试 —— 只按上面那个频率逐页取。

抓不到、但结果里仍然出现​

跟 Google、Bing 一样:如果一个站在我们收录范围内、却明确挡住了我们(robots 屏蔽,或者验证质询过不去),搜索结果里可能仍会出现一条记录,告诉搜索的人「这个站在那儿,只是我们读不到」。那条记录只有域名和一句说明,没有页面标题、没有内容。等你把屏蔽放开,下一次抓取就会换成真实页面。

我们不收录哪些​

除了站点自己声明的 noindex 和 robots 屏蔽,这几类页面也不入库:

  • 维基类站点的特殊页(Special: / 特殊:)和讨论页名空间(Talk: / User talk: / 用户讨论:)—— 它们要么是列表页和动作页,要么同一篇内容会以无数个地址重复出现;
  • 操作型地址(?action= / oldid= / diff= 这类);
  • 同一篇内容的重复地址:跟踪参数(utm_*、from_spmid 这类)会被剥掉,分页参数会归一,所以同一个页面不会在结果里刷出几十条。