Ich habe bei mir im Serverlog den Eintrag »CCBot/2.0 (https://commoncrawl.org/faq/)« entdeckt und neugierig mal die Webseite geschaut. Common Crawl (Wikipedia-Eintrag) ist ein gemeinnütziger Webcrawler, der durchs Internet wandert und die Webseiten archiviert. Ähnlich wie es auch die Bots von DuckDuckGo, Google, Bing u. s. w. tun, nur eben steht das Archiv von Common Crawl der Öffentlichkeit zur Verfügung, auf dass man damit eigene Projekte verwirklichen kann.

Ein Abrufergebnis extrahieren

Laut der Anleitung sind Datensätze seit 2008 im Archiv und regelmäßig werden neue Datensätze hinzugefügt. Die reinen Metadaten der Einträge (ohne die Seiteninhalte) lassen sich direkt herunterladen, aber die Datenmenge ist zu groß, wenn man nur etwas bestimmtes sucht. Günstiger ist es, den Katalog über index.commoncrawl.org zu durchsuchen1. Als Antwort erhält man dann eine Folge von JSON-Objekten2 und kann diese zum Beispiel mit jq auswerten:

  1. Bei mir schlugen die Anfragen beim ersten Aufruf mit 502 fehl und beim zweiten Aufruf nach etwa 10 Sekunden kam das Ergebnis. 

  2. Leider kein Array von JSON-Objekten, weshalb Firefox die Antwort nicht auswerten kann. 

% jq  -r '.timestamp + "    " + .url' /tmp/CC-MAIN-2020-24-index.json |head -n5
20200602142543    https://jo-so.de/2017-03/android-commands.html
20200602142320    https://jo-so.de/2017-03/gtk-highres-monitor.html
20200602141557    https://jo-so.de/2017-05/dbus-aufruf.html
20200602132715    https://jo-so.de/2017-05/needrestart-f%C3%BCr-Paketaktualisierung.html
20200602152944    https://jo-so.de/2017-05/Verschl%C3%BCsseltes-Dateisystem-erstellen.html

Die Objekte in der Ergebnisliste enthalten im Feld filename immer den Pfad auf dem Server https://commoncrawl.s3.amazonaws.com/ zum Web-Archiv, das die Daten enthält:

% jq -C 'select(.url == "https://jo-so.de/2018-01/interessante-rust-crates.html")' /tmp/CC-MAIN-2020-24-index.json
{
  "urlkey": "de,jo-so)/2018-01/interessante-rust-crates.html",
  "timestamp": "20200606032358",
  "offset": "402256648",
  "status": "200",
  "languages": "deu",
  "digest": "7UVWI2HEP644NDIU4X7FMN5WFP7AVPPI",
  "length": "4668",
  "mime-detected": "application/xhtml+xml",
  "filename": "crawl-data/CC-MAIN-2020-24/segments/1590348509972.80/warc/CC-MAIN-20200606031557-20200606061557-00452.warc.gz",
  "charset": "UTF-8",
  "mime": "text/html",
  "url": "https://jo-so.de/2018-01/interessante-rust-crates.html"
}

Das Archiv ist eine komprimierte Datei, die mehr als einen Abruf enthält. Deshalb ist in dem Indexeintrag bei offset die Position und bei length die Länge des Datensatzes in der komprimierten Datei angegeben:

% dd status=none skip=402256648 count=4668 iflag=skip_bytes,count_bytes bs=1M if=CC-MAIN-20200606031557-20200606061557-00452.warc.gz |zcat |sed '/<title>/q'
WARC/1.0
WARC-Type: response
WARC-Date: 2020-06-06T03:23:58Z
WARC-Record-ID: <urn:uuid:0a00c92e-9e82-4751-a270-1a0db2142859>
Content-Length: 10905
Content-Type: application/http; msgtype=response
WARC-Warcinfo-ID: <urn:uuid:c16fe5f9-0d04-4da3-bb4a-14218dfece31>
WARC-Concurrent-To: <urn:uuid:b9f6d23f-f4c0-4487-a2b7-cdf24c1a032e>
WARC-IP-Address: 37.221.195.157
WARC-Target-URI: https://jo-so.de/2018-01/interessante-rust-crates.html
WARC-Payload-Digest: sha1:7UVWI2HEP644NDIU4X7FMN5WFP7AVPPI
WARC-Block-Digest: sha1:5SDR2YXSTMCLAJ2UITRIIC7Y5XEGMLHV
WARC-Identified-Payload-Type: application/xhtml+xml

HTTP/1.1 200 OK
Server: nginx/1.14.2
Date: Sat, 06 Jun 2020 03:23:58 GMT
Content-Type: text/html
Last-Modified: Mon, 01 Jun 2020 15:44:18 GMT
X-Crawler-Transfer-Encoding: chunked
Connection: keep-alive
ETag: W/"5ed52252-292b"
Strict-Transport-Security: max-age=15552000; includeSubdomains; preload
X-Crawler-Content-Encoding: gzip
Content-Length: 10539

<!DOCTYPE html>
<html lang="de" xmlns="http://www.w3.org/1999/xhtml">
<head>
  <meta charset="utf-8" />
  <meta name=author content="Jörg Sommer &lt;joerg@alea.gnuu.de&gt;" />
  <meta name=license content="CC BY-SA 4.0" />
  <meta name=generator content="Ikiwiki" />
  <title>Liste von interessanten Paketen f&#xFC;r Rust • Am Interneteingang 8</title>

Im Blogeintrag habe ich sogar noch eine effizientere Möglichkeit entdeckt, an die Daten zu kommen:

curl -H "range: bytes=402256648-$((402256648 + 4668))" -O \
  https://commoncrawl.s3.amazonaws.com/crawl-data/CC-MAIN-2020-24/segments/1590348509972.80/warc/CC-MAIN-20200606031557-20200606061557-00452.warc.gz

Weitere Informationen

Es gibt eine Erklärung zu den Datenformaten, eine Liste mit Präsentationen, Publikationen und Videos und eine List mit Beispielprojekten.

Unter anderem hat jemand mithilfe der Daten die Häufigkeitsverteilung der z-index-Werte bei CSS analysiert.

Art