抓取规则
这一页说明 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这类)会被剥掉,分页参数会归一,所以同一个页面不会在结果里刷出几十条。