Expand description
带查询的整站爬取:相关性优先的调度队列(best-first)、链接打分和自适应停止。
链接分数 = 锚文本、URL(主机名和路径)、链接所在那一行各自覆盖了多少查询词(加权),
再加上所在页面本身的相关度,最后按深度衰减。查询词的权重按已抓页面的文档频率调整
([weights]):每页都有的词不再算数,少见的词才是证据。家具页(新闻、关于、法律页脚、
带日期的路径)和枢纽页降权(furniture);队列出队时按簇分散([queue]),
一个子树吃不完预算;自适应停止只拿相关页面当证据([adaptive])。
分数相同的链接按发现顺序出队,所以完全不相关的站点上,顺序退化成广度优先。
Modules§
- furniture
- 家具页和内容集群的识别:新闻、活动、关于、法律页脚、搜索、标签、带日期的路径。
Structs§
- Adaptive
- 自适应爬取的状态:每个查询词的证据数、已经见过的相关段落、连续没有新信息的页数。
- Best
First - 相关性优先的待爬队列。容量由调用方按“还能再抓几页“给出,满了以后新链接只有比队里最差的
好才挤进来:队列长度不超过 limit,和广度优先一样内存有界。
每项带一个打分依据
S(super::LinkSignal),词权重变了以后按它重新打分(Self::rescore)。 - Focus
- 查询和从它派生的打分规则。
- Harvest
- 按某种分法(子树或簇)统计的收获。
- Link
Signal - 链接分数的组成(见
Focus::link_signal)。 - Page
Signal - 页面相关度的组成:各查询方面的证据([
facet]),枢纽页和家具页的折扣。fixed是直接给定的相关度(没有页面可看的链接,测试)。
Enums§
Constants§
- LIST_
FREE - 同一页上指向同一个簇的链接超过这个数(新闻列表、展品列表),每条按 sqrt(上限/条数) 打折。 [策略] 先验包 v0:0.81 的现值
- MIN_
RELEVANCE - 相关度低于它的页面算无关:不计入证据,而且找到相关内容之后连着出现就算“抓完了“。
附件收割也用它。0.81 换成按方面打分的相关度([
super::facet])后,两条门槛按 1,833 个 人工判过的页面换算:保留下来的有用页比例和换算前一样(0.12 → 0.05 都约 90%, 0.3 → 0.15 都约 52%),保留下来的页面里有用的比例略高。
Functions§
- cluster_
key - 簇的键:主机加第一段路径(
news、admissions、exhibition…)。 各个主机的首页(/、/en/、/index.html)同属一个簇:大学首页链着几十个院系子站, 每个子站首页都是不同的主机,不归到一起的话按簇分散反而会把预算摊给它们。 - is_
blind - 链接的分数不高于栏目保底分:它本身没有查询词的线索,抓它是“盲探“(自适应停止用,
见
Adaptive::observe)。种子页(分数无穷大)不算。 - link_
contexts - 从正文 Markdown 里找出每个链接(去掉 fragment 的绝对地址)的锚文本和上下文。 导航栏等不在正文里的链接没有上下文,调用方用 DOM 里的锚文本代替。同一链接取第一次出现。
- subtree
- 页面所在的子树:别的主机(子站)整个算一棵;种子主机上按页面的上级目录分,跳过开头的
语言段,最多两段(
/research-highlight/某篇→research-highlight,/en/education/programmes/x→education/programmes)。只按第一段分的话,整站都在/en/下的站点就成了一棵树,判它枯竭等于停掉整个爬取。seed_host已去掉www.、小写。 - url_
shape - 网址的“形状”:同一模板生成的页面(
/item/123、/item/456)形状相同。路径段全是数字的写成{n},含数字的写成{id},其余照原样;查询串只留参数名(排序)。结构化抽取缓存 LLM 生成的 schema 时用它作键的一部分(0.97)。