e06084's Blog

Common Crawl数据集探索(二)索引系统

Published at 2025-05-02 | Last Update 2025-05-02

在上一篇文章中,我们介绍了Common Crawl这个庞大的互联网存档项目及其基本构成。今天,我们将深入探讨Common Crawl的索引系统,这是高效访问和利用这个海量数据集的关键。Common Crawl目前提供了两种主要索引:URL索引和主机索引(Host Index),它们各自针对不同的使用场景提供了优化的访问方式。

Common Crawl索引的重要性

想象一下,如果没有索引,要在几百TB的数据中找到特定网站的内容将如同大海捞针。根据Common Crawl官方数据,2025年3月的爬虫存档就包含了约2.74亿个网页,未压缩内容达455 TiB。在如此庞大的数据集中,高效的索引系统变得尤为重要。

索引不仅能够帮助用户快速定位到特定的内容,还能够大幅降低数据处理的复杂度和成本。以AWS Athena为例,用户只需要支付查询所扫描数据的费用,而索引可以帮助将扫描的数据范围缩小到最小。

URL索引:精确定位网页内容

URL索引(CDX/Capture Index)是Common Crawl从2015年开始提供的一种索引形式,它允许用户根据URL快速定位到具体的网页内容。

URL索引的技术细节

URL索引采用了一种称为”ZipNum”的CDX格式,这与互联网档案馆(Internet Archive)的Wayback Machine使用的格式相同。索引由两部分组成:

  1. 主索引:压缩的纯文本索引,每行代表一个条目
  2. 次级索引:压缩块的索引,用于加速查询

每个索引条目包含以下关键信息:

  • 网页URL
  • 抓取时间
  • HTTP状态码
  • 内容摘要(digest)
  • WARC文件名
  • 记录在WARC文件中的偏移量和长度

URL索引的查询API

为了简化索引的使用,Common Crawl提供了一个名为”CDX Server API”的查询接口。例如,以下查询可以查找2015年2月爬虫中的维基百科网页:

https://index.commoncrawl.org/CC-MAIN-2015-11-index?url=wikipedia.org

URL索引支持多种高级查询功能:

  • 通配符查询:查找域名下的所有URL
    https://index.commoncrawl.org/CC-MAIN-2015-11-index?url=*.wikipedia.org/
    
  • 分页:大型查询结果的分页处理
    https://index.commoncrawl.org/CC-MAIN-2015-11-index?url=*.wikipedia.org/&page=2
    
  • 字段选择:仅返回特定字段
    https://index.commoncrawl.org/CC-MAIN-2015-11-index?url=wikipedia.org&fl=url,warc_filename,warc_record_offset
    

从列格式读取URL索引

从2018年开始,Common Crawl还提供了列式格式(Apache Parquet)的URL索引,这为大数据处理带来了显著的性能提升。列式格式允许用户:

  1. 仅读取需要的列,大大减少数据扫描量
  2. 使用AWS Athena等服务直接运行SQL查询,而无需启动服务器
  3. 利用Spark、Presto等现代大数据工具进行高效处理

使用Athena查询索引的SQL示例:

SELECT COUNT(*) AS count,
       url_host_registered_domain
FROM "ccindex"."ccindex"
WHERE crawl = 'CC-MAIN-2018-05'
  AND subset = 'warc'
  AND url_host_tld = 'no'
GROUP BY  url_host_registered_domain
HAVING (COUNT(*) >= 100)
ORDER BY  count DESC

这种查询方式特别高效,上述查询仅扫描2.12MB数据就能完成,成本极低。

主机索引:宏观分析互联网结构

2023年,Common Crawl引入了主机索引(Host Index),这是一种更加宏观的索引形式,专注于网站级别的统计和分析。

主机索引的特点

主机索引为每个爬虫中的每个主机提供一行数据,每行包含以下信息:

  • 主机名及其组成部分(TLD、注册域等)
  • 抓取统计信息(URL数量、内容大小等)
  • HTTP状态码分布
  • 语言分布
  • 机器人排除协议(robots.txt)信息
  • 主机间链接关系

这种索引形式特别适合网络规模分析、语言分布研究和发现新网站。

主机索引的技术实现

主机索引以Parquet列式格式存储,分为以下数据集:

  1. 主机元数据:所有主机的基本信息
  2. 语言数据:语言识别结果
  3. 链接数据:网站间的链接关系

使用Athena查询主机索引

主机索引同样可以通过AWS Athena进行高效查询:

SELECT
    fetch_status_main,
    COUNT(*) AS count,
    COUNT(*) * 100.0 / SUM(COUNT(*)) OVER () AS percentage
FROM
    "ccindex"."host_metadata"
WHERE
    crawl = 'CC-MAIN-2023-40'
GROUP BY
    fetch_status_main
ORDER BY
    count DESC

两种索引的使用场景

URL索引适用于:

  1. 内容检索:当需要获取特定URL或域名下的网页内容时
  2. 历史研究:研究特定网站随时间变化的情况
  3. 数据挖掘:从特定类型的网页中提取结构化信息
  4. 语料库构建:为NLP模型训练构建特定领域的语料库

主机索引适用于:

  1. 互联网宏观分析:研究网络结构、域名分布等
  2. 语言地图绘制:分析不同语言在互联网上的分布
  3. 网络拓扑研究:基于链接关系研究网站之间的连接模式
  4. 新网站发现:识别特定类别或语言的网站
  5. 抓取计划优化:根据主机特性优化网络爬虫

实际应用案例

使用URL索引构建特定领域语料库

假设我们想要构建一个学术网站的语料库,可以使用URL索引查找所有edu域名的网页:

import requests
import json
import gzip
import io
import boto3

# 查询所有.edu域名的URL
url = 'https://index.commoncrawl.org/CC-MAIN-2023-06-index?url=*.edu&output=json'
response = requests.get(url)
results = [json.loads(line) for line in response.text.strip().split('\n')]

# 处理结果
for item in results[:5]:  # 仅处理前5条结果作为示例
    # 获取WARC文件
    s3 = boto3.client('s3')
    warc_path = item['filename']
    offset = int(item['offset'])
    length = int(item['length'])
    
    # 使用范围请求获取仅所需的数据块
    range_header = f'bytes={offset}-{offset+length-1}'
    response = s3.get_object(Bucket='commoncrawl', Key=warc_path, Range=range_header)
    content = response['Body'].read()
    
    # 处理内容...
    print(f"Retrieved {len(content)} bytes from {warc_path}")

使用主机索引分析语言分布

# 使用Athena查询分析各语言网站分布
query = """
SELECT
    language,
    COUNT(*) AS host_count,
    SUM(content_bytes) AS total_bytes
FROM
    "ccindex"."host_languages"
WHERE
    crawl = 'CC-MAIN-2023-40'
    AND language_score > 0.5
GROUP BY
    language
ORDER BY
    host_count DESC
LIMIT 20
"""

# 使用boto3执行Athena查询
# ...处理结果

结语

Common Crawl的索引系统极大地提高了这个海量数据集的可用性和价值。URL索引提供了精确定位网页内容的能力,而主机索引则提供了宏观分析互联网结构的视角。根据您的具体需求,可以选择最适合的索引类型进行数据访问和分析。

随着互联网和大数据技术的发展,Common Crawl也在不断改进其索引系统。最新的列式格式索引和主机索引都代表了数据科学领域的最佳实践,为互联网研究提供了强大的工具。

在后续文章中,我们将深入探讨如何使用这些索引来实现具体的应用场景,敬请期待!


参考资料: