Common Crawl数据集探索(二)索引系统
在上一篇文章中,我们介绍了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使用的格式相同。索引由两部分组成:
- 主索引:压缩的纯文本索引,每行代表一个条目
- 次级索引:压缩块的索引,用于加速查询
每个索引条目包含以下关键信息:
- 网页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索引,这为大数据处理带来了显著的性能提升。列式格式允许用户:
- 仅读取需要的列,大大减少数据扫描量
- 使用AWS Athena等服务直接运行SQL查询,而无需启动服务器
- 利用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列式格式存储,分为以下数据集:
- 主机元数据:所有主机的基本信息
- 语言数据:语言识别结果
- 链接数据:网站间的链接关系
使用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索引适用于:
- 内容检索:当需要获取特定URL或域名下的网页内容时
- 历史研究:研究特定网站随时间变化的情况
- 数据挖掘:从特定类型的网页中提取结构化信息
- 语料库构建:为NLP模型训练构建特定领域的语料库
主机索引适用于:
- 互联网宏观分析:研究网络结构、域名分布等
- 语言地图绘制:分析不同语言在互联网上的分布
- 网络拓扑研究:基于链接关系研究网站之间的连接模式
- 新网站发现:识别特定类别或语言的网站
- 抓取计划优化:根据主机特性优化网络爬虫
实际应用案例
使用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也在不断改进其索引系统。最新的列式格式索引和主机索引都代表了数据科学领域的最佳实践,为互联网研究提供了强大的工具。
在后续文章中,我们将深入探讨如何使用这些索引来实现具体的应用场景,敬请期待!
参考资料: