助力大语言模型训练,无压力爬取六百亿网页

ChatGPT一炮而红,让国内很多公司开始做大语言模型。然后他们很快就遇到了第一个问题,训练数据怎么来。有些公司去买数据,有些公司招聘爬虫工程师。但如果现在才开发爬虫,那恐怕已经来不及了。

即使爬虫工程师非常厉害,可以破解任意反爬虫机制,可以让爬虫跑满网络带宽,可是要训练出GPT-3这种规模的大语言模型,这个数据并不是一天两天就能爬完的。并且,有很多老网站的数据,早就被删除了,爬虫想爬也爬不到。

如果你看了今天这篇文章,那么恭喜你,你即将知道如何快速获取600亿网站的数据。从2008年开始爬取,这些网站数据横跨40多种语言。截止我写这篇文章的时候,最新的数据积累到了2023年2月。只要是Google现在或者曾经搜索得到的网站,你在这里都能找到。唯一制约你的,就是你的硬盘大小——仅仅2023年1月和2月的网页加到一起,就有400TB。而且所有这些数据,完全免费!不需要注册登录!不需要梯子!不需要下载任何额外软件!只需要浏览器或者Linux中的wget命令就能直接下载。

这个项目叫做Common Crawl,官网长这样:

获取数据的方法,网站已经写到了Get Started中。我们来看看这个页面的第一段话:

The Common Crawl corpus contains petabytes of data collected since 2008. It contains raw web page data, extracted metadata and text extractions.

Common Crawl语料库包含了上PB的数据。这些数据从2008年开始收集。他包含了网页的原始页面HTML、提取出来的元信息和纯文本。

Common Crawl的数据保存在亚马逊S3上面,我们可以直接通过HTTP来下载。当然如果你硬盘够大,你可以写代码来批量下载全部数据,这个时候可以使用Python的boto3模块访问S3.

我用HTTP下载的方式,来给大家演示一下这个数据怎么下载和使用。我们在上面提到的Get Started页面,找到你想下载数据的时间点。例如我想下载2023年1月和2月的网站数据,如下图所示:

点击红框中的链接,进入一个新的页面。如下图所示:

从这个页面上,我们可以看到这个数据集的简介。2023年1月到2月的数据,从1月26号开始抓取,到2月9号截止。包含315亿个页面。原始数据不压缩的情况下有400TB。这些网站来自3300万个域名,130亿个之前没有抓过的URL。

在这个页面,我们可以看到一个表格,这里面显示了不同的数据类型:

其中WARC files文件,记录的是网页的原始HTML代码。WET files文件,记录的是简单处理后,提取出来的网页所有纯文本。

大家不要被最后一列的数据大小吓到了。你不需要一次性下载这么大的数据。

以WARC文件为例,点击File List中的链接,会自动下载一个很小的压缩文件warc.paths.gz。这个文件需要使用gunzip命令来解压缩。这个命令理论上在macOS和Linux中都是自带的。使用如下命令解压缩:

1
gunzip warc.paths.gz

解压完成以后,会生成一个warc.paths的文件。这个文件有9.2MB,也非常的小。我们可以使用vim或者less命令查看里面的内容,如下图所示:

这里面列出来的是不同时间段的文件。我们可以依次下载每个文件,分别解压缩。这样分文件,是Common Crawl为了方便大家下载而做的。否则一次性下载几十TB,谁受得了。

我们随便找一个地址,例如crawl-data/CC-MAIN-2023-06/segments/1674764494826.88/warc/CC-MAIN-20230126210844-20230127000844-00001.warc.gz。把这个地址前面拼接上域名https://data.commoncrawl.org/,因此完整的URL应该是:https://data.commoncrawl.org/crawl-data/CC-MAIN-2023-06/segments/1674764494826.88/warc/CC-MAIN-20230126210844-20230127000844-00001.warc.gz。这就是能够下载这个时间段数据的URL了。这个压缩文件有好几个G,因此不建议直接在浏览器上面打开这个URL。我们可以使用wget命令来下载。当然你也可以用迅雷来下。

下载完成以后,会得到一个CC-MAIN-20230126210844-20230127000844-00001.warc.gz文件,继续使用gunzip命令解压缩,得到CC-MAIN-20230126210844-20230127000844-00001.warc文件。这个文件本质上是一个文本文件,可以使用vim或者less命令查看:

这里面记录的是网站的元信息和HTML。数据是以WARC格式储存的。关于这个格式,在上面提到的Get Started页面可以看到具体的说明:

你可以直接写一个程序来解析,或者安装一些现成的程序来解析,并转成JSON或者其他格式。Ubuntu下面可以使用apt命令安装warcat来解析,这里就不多说了。如果不知道怎么解析也可以问一问ChatGPT。

我们再来看一下WET文件,打开以后如下图所示:

算是一个比较粗糙的正文提取方法,仅仅是把页面上的所有文本全部提取出来了而已。

如果你想让新闻类、博客类文章的提取效果更好,那么可以试一试把这个WARC格式里面的HTML提取出来,然后使用我的GNE来提取正文,提取效果就会好非常多:

总结

众所周知,中文互联网是封闭的互联网。但不要因此就觉得整个互联网上现在已经没有良心网站了。Common Crawl就属于这样的良心网站,完全免费,不需要注册登录,没有任何限制,不需要安装任何软件,直接获取15年来绝大部分网站的原始数据。

希望这些数据,能让我们自己的大模型更进一步。