
Hochgeschwindigkeit/Niedrige Kosten CommonCrawl RegExp in Node.js
Image
WARCannon wurde entwickelt, um den Prozess des 'Grepens des Internets' zu vereinfachen und zu verbilligen.
Mit WARCannon können Sie:
WARCannon nutzt geschickt AWS-Technologien, um horizontal auf jede Kapazität zu skalieren, Kosten durch Spot-Flotten und Datenübertragung in derselben Region zu minimieren, mit unglaublichen Geschwindigkeiten (bis zu 100 Gbit/s pro Knoten) aus S3 zu ziehen, über Hunderte von CPU-Kernen zu parallelisieren, den Status über DynamoDB und CloudFront zu melden und Ergebnisse über S3 zu speichern.
Insgesamt kann WARCannon mehrere reguläre Ausdrucksmuster über 400 TB in wenigen Stunden für etwa 30 Dollar verarbeiten.
Der schnellste und einfachste Weg, um loszulegen, ist die Verwendung des AWS CloudShell. Fügen Sie einfach diesen Einzeiler ein:
source <(curl https://raw.githubusercontent.com/c6fc/warcannon/master/cloudshell/deploy.sh)
Wenn Sie einen anderen Branch als den Master von WARCannon verwenden möchten, geben Sie einfach ein:
export GIT_BRANCH=branch_name
source <(curl https://raw.githubusercontent.com/c6fc/warcannon/$GIT_BRANCH/cloudshell/deploy.sh)
Hinweis: Die CloudShell-Bereitstellung verwendet flüchtigen Speicher, was bedeutet, dass benutzerdefinierte Regex-Muster verloren gehen, wenn CloudShell beendet wird. Wenn Sie WARCannon häufig verwenden möchten, empfehle ich die 'Lokale Installation' unten.
WARCannon erfordert, dass Folgendes installiert ist:
ProTipp: Um die Dinge sauber und von anderen Dingen, die Sie möglicherweise in AWS haben, getrennt zu halten, wird STRKST empfohlen, WARCannon in einem frischen Konto bereitzustellen. Sie können ein neues Konto einfach über die 'Organizations'-Konsole in AWS erstellen. Mit 'STRKST empfohlen' meine ich 'installieren Sie dies ernsthaft nicht neben anderen Sachen'.
Klonen Sie zuerst das Repo und kopieren Sie die Beispiel-Einstellungen.
$ git clone [email protected]:c6fc/warcannon.git
$ cd warcannon
warcannon$ cp settings.json.sample settings.json
Bearbeiten Sie settings.json nach Belieben:
Erforderliche Einstellungen
nodeInstanceType: Ein Array von Instanztypen, die für die parallele Verarbeitung verwendet werden sollen. 'c'-Typen bieten für diesen Zweck das beste Preis-Leistungs-Verhältnis, und jede Größe kann verwendet werden. ["c5n.18xlarge"] ist der empfohlene Wert für echte Kampagnen.nodeCapacity: Die Anzahl der Knoten, die während der parallelen Verarbeitung angefordert werden sollen. Die resultierenden Knoten werden eine beliebige Verteilung der von Ihnen angegebenen nodeInstanceTypes sein.nodeParallelism: Die Anzahl der gleichzeitig zu verarbeitenden WARCs pro vCPU. 2 ist hier eine gute Zahl. Wenn Knoten nicht genügend RAM haben, um auf dieser Parallelitätsebene zu laufen (wie es bei 'c'-Typ-Instanzen der Fall sein kann), laufen sie stattdessen mit der höchsten sicheren Parallelität.nodeMaxDuration: Die maximale Lebensdauer von Rechenknoten in Sekunden. Knoten werden nach dieser Zeit automatisch beendet, wenn der Job noch nicht abgeschlossen ist. Standardwert ist 24 Stunden.Optionale Einstellungen (bei Nichtgebrauch vollständig weglassen)
sshKeyName: Der Name eines EC2-SSH-Keys, der bereits in us-east-1 existiert.allowSSHFrom: Eine CIDR-Maske, um SSH zu erlauben. Normalerweise ist dies <yourpublicip>/32Um es zu installieren, führen Sie dies aus:
$ npm install
$ npm link
$ warcannon deploy
Das Ausführen einer Kampagne in WARCannon verwendet einen einfachen, leicht verständlichen Arbeitsablauf, der am besten in diesen wenigen Schritten beschrieben werden kann:
warcannon deploywarcannon testLocal -swarcannon testwarcannon list 2022warcannon populate 2022-21warcannon firewarcannon syncResults abrufenLesen Sie weiter, um ein detaillierteres Verständnis der einzelnen Schritte zu erhalten.
WARCannon wird von Common Crawl über das AWS Open Data-Programm gespeist. Common Crawl ist einzigartig, da die von ihren Spiders abgerufenen Daten nicht nur Website-Text, sondern auch andere textbasierte Inhalte wie JavaScript, TypeScript, vollständiges HTML, CSS usw. erfassen. Durch die Erstellung geeigneter regulärer Ausdrücke, die einzigartige Komponenten identifizieren können, können Forscher Websites anhand der von ihnen verwendeten Technologien identifizieren, ohne jemals die Website selbst zu berühren. Das Problem ist, dass dafür Hunderte von Terabytes an Daten analysiert werden müssen, was unabhängig von den verfügbaren Ressourcen eine große Herausforderung darstellt. Glücklicherweise bietet WARCannon mehrere Tools, mit denen Sie dies bewerkstelligen können!
Das Internet zu greppen ist nichts für schwache Nerven, aber der erste Schritt ist ein effektives Sieb. WARCannon unterstützt dies, indem es die lokale Überprüfung von regulären Ausdrücken anhand realer Common-Crawl-Daten ermöglicht. Öffnen Sie zuerst lambda_functions/warcannon/matches.js und ändern Sie das Objekt regex_patterns, um die gewünschten regulären Ausdrücke im Format name: pattern aufzunehmen. Hier ist ein Beispiel aus dem Standard-Suchset:
exports.regex_patterns = {
"access_key_id": /(\'A|"A)(SIA|KIA|IDA|ROA)[JI][A-Z0-9]{14}[AQ][\'"]/g,
};
Zeichenfolgen, die diesem Ausdruck entsprechen, werden unter dem entsprechenden Schlüssel in den Ergebnissen gespeichert; in diesem Fall access_key_id. Protipp: Verwenden Sie RegExr mit dem Format 'JavaScript', um reguläre Ausdrücke zu erstellen und gegen bekannte gute Treffer zu testen.
Sie haben auch die Möglichkeit, nur Ergebnisse von bestimmten Domänen zu erfassen. Füllen Sie dazu einfach das Array domains mit den FQDNs, die Sie einschließen möchten. Es wird empfohlen, dies leer [] zu lassen, da es fast nie lohnenswert ist (der eingesparte Verarbeitungsaufwand ist sehr gering), aber es kann in einigen Nischenfällen nützlich sein.
exports.domains = ["example1.com", "example2.com"];
Sobald matches.js ausgefüllt ist, führen Sie den folgenden Befehl aus:
warcannon$ warcannon testLocal -s
Sie können optional einen Pfad zu einem WARC im commoncrawl S3-Bucket hinzufügen, wenn Sie möchten, ansonsten wird eine hartcodierte Standardeinstellung verwendet.
WARCannon streamt die Verarbeitung der WARC-Datei (oder lädt sie vollständig herunter, wenn Sie -s weglassen), um Ihre konfigurierten Treffer zu finden. WARCannon speichert die Ergebnisse im Ordner ~/.warcannon/, wenn Sie mit ctrl+c unterbrechen oder wenn die Verarbeitung abgeschlossen ist. Dies erleichtert das schnelle Testen gängiger Treffer mit minimaler Bandbreite.
Darüber hinaus versucht WARCannon, die gesamten Rechenkosten Ihrer regulären Ausdrücke zu bewerten, wenn sie lokal ausgeführt werden. Auf diese Weise können Sie erfahren, ob ein bestimmter regulärer Ausdruck die Leistung erheblich beeinträchtigt, bevor Sie Ihre Kampagne ausführen.

Manchmal reicht ein einfaches Regex-Muster allein nicht aus, und Sie benötigen einige zusätzliche Schritte, um sicherzustellen, dass Sie die richtigen Informationen zurückgeben. In diesem Fall können Sie durch einfaches Hinzufügen einer Funktion zum Objekt exports.custom_functions mit demselben Schlüsselnamen jede zusätzliche Verarbeitung durchführen, die Sie für angemessen halten.
exports.regex_patterns = {
"access_key_id": /(\'A|"A)(SIA|KIA|IDA|ROA)[JI][A-Z0-9]{14}[AQ][\'"]/g,
};
exports.custom_functions = {
"access_key_id": function(match) {
// Ignore matches with 'EXAMPLE' in the text, since this is common for documentation.
if (match.text(/EXAMPLE/) != null) {
// Returning a boolean 'false' discards the match.
return false
}
}
}
Hinweis: WARCannon ist dafür gedacht, Text mit wahnsinnigen Geschwindigkeiten zu verarbeiten. Obwohl es sicherlich möglich ist, jede Art von Operation durchzuführen, die Sie möchten, kann das Hinzufügen von latenzintensiven benutzerdefinierten Funktionen wie Netzwerkaufrufen die Verarbeitungszeit und -kosten erheblich erhöhen. Netzwerkaufrufe könnten auch zu SEHR vielen Aufrufen gegen eine Website führen, was Sie in Schwierigkeiten bringen könnte. Seien Sie klug, wie Sie diese Funktionen einsetzen.
Die Kosten von AWS können Angst auslösen, besonders wenn Sie nur etwas recherchieren möchten. WARCannon wurde entwickelt, um sowohl einmalige Ausführungen als auch vollständige Kampagnen zu ermöglichen, sodass Sie sich der Ergebnisse sicher sein können, die Sie zurückerhalten. Sobald Sie mit den Ergebnissen von testLocal zufrieden sind, können Sie Ihre aktualisierten Treffer bereitstellen und einen cloudgestützten Test einfach ausführen:
warcannon$ warcannon deploy
warcannon$ warcannon test
Auch hier können Sie optional einen WARC-Pfad angeben, falls gewünscht, es ist jedoch nicht erforderlich.
Dies führt eine Lambda-Funktion mit den von Ihnen konfigurierten regulären Ausdrücken synchron aus und gibt sofort die Ergebnisse zurück. Dieser Vorgang dauert etwa 2,5 Minuten, also haben Sie keine Angst zu warten, während er seine Magie entfaltet.
Sobald Sie mit den Ergebnissen in Lambda zufrieden sind, sind Sie bereit, das Internet wirklich zu greppen. Wir werden zuerst einige grundlegende Hausarbeiten durchgehen und dann loslegen.
WARCannon verwendet AWS Simple Queue Service, um Arbeit an die Rechenknoten zu verteilen. Um sicherzustellen, dass Ihre Ergebnisse nicht durch vorherige Läufe verunreinigt werden, können Sie WARCannon anweisen, die Warteschlange zu leeren:
warcannon$ warcannon emptyQueue
[+] Cleared [ 15 ] messages from the queue
Sie können dann den Status der Warteschlange überprüfen:
warcannon$ warcannon status
Deployed: [ YES ]; SQS Status: [ EMPTY ]
Job Status: [ INACTIVE ]
Active job url: https://d201offlnmhkmd.cloudfront.net
Überprüfen Sie Folgendes, bevor Sie fortfahren:
Um die Warteschlangennachrichten zu erstellen, die die Rechenknoten verarbeiten werden, müssen Sie zuerst SQS mit Crawl-Daten füllen. WARCannon bietet mehrere Befehle, die dabei helfen, beginnend mit der Möglichkeit, die verfügbaren Scans anzuzeigen. In diesem Fall schauen wir uns die für das Jahr 2021 verfügbaren Scans an:
warcannon$ warcannon list 2021
CC-MAIN-2021-04
CC-MAIN-2021-10
Wir haben zwei Scans, die mit der Zeichenfolge "2021" übereinstimmen. Wir können WARCannon nun anweisen, die Warteschlange basierend auf einem dieser Scans zu füllen. Dieses Mal müssen wir einen Parameter angeben, der einen der Scans eindeutig identifiziert. "2021-04" wird den Trick tun. Wir könnten wählen, nur einen Teilscan zu füllen, indem wir auch eine Anzahl von Chunks und eine Chunk-Größe angeben, aber das überspringen wir vorerst.
warcannon$ warcannon populate 2021-04
{Created 799 chunks of 100 from 79840 available segments"
"StatusCode": 200,
"ExecutedVersion": "$LATEST"
}
Während der Bereitstellung richtet WARCannon automatisch eine Datenbank (warcannon_commoncrawl) und eine Arbeitsgruppe (warcannon) in Athena ein, die zum schnellen Abfragen von Informationen aus CommonCrawl verwendet werden können. Dies kann besonders nützlich sein, um spärliche Kampagnen basierend auf bestimmten Abfragen zu füllen. Zum Beispiel sucht die folgende Abfrage nach WARCs, die Antworten von 'example.com' enthalten:
SELECT
warc_filename,
COUNT(url_path) as num
FROM
warcannon_commoncrawl.ccindex
WHERE
subset = 'warc' AND
url_host_registered_domain IN ('example.com') AND
crawl = 'CC-MAIN-2021-04'
GROUP BY warc_filename
ORDER BY num DESC
Sie können die Athena-Konsole verwenden, um Ihre Ergebnisse zu verfeinern, aber Sie müssen die Abfrage über die WARCannon-Kommandozeile ausführen, wenn Sie einen Job damit füllen möchten:
warcannon queryAthena "SELECT warc_filename, COUNT(url_path) as num FROM warcannon_commoncrawl.ccindex WHERE subset = 'warc' AND url_host_registered_domain IN ('example.com') AND crawl = 'CC-MAIN-2021-04' GROUP BY warc_filename ORDER BY num DESC"
[+] Query Exec Id: 0319486e-1846-491c-badf-2e23ae213974 .. SUCCEEDED
WARCannon kann dann die Ergebnisse einer Abfrage verwenden, um die Warteschlange zu füllen, und tut dies basierend auf der Spalte warc_filename aus dem Resultset. Daher wird empfohlen, entweder nach dieser Spalte zu group by oder distinct() zu verwenden, um Duplikate zu vermeiden. WARCannon gibt einen Fehler aus, wenn dieses Feld nicht vorhanden ist. Füllen Sie die Warteschlange mit Athena-Ergebnissen, indem Sie die Query Execution ID an den Befehl populateAthena übergeben.
warcannon populateAthena 0319486e-1846-491c-badf-2e23ae213974
{Created 26 chunks of 10 from 251 available segments"
"StatusCode": 200,
"ExecutedVersion": "$LATEST"
}
Hinweis: Das Füllen eines spärlichen Jobs für eine einzelne Domäne mag wie eine gute Idee erscheinen, ist es aber oft nicht. Die Antworten einer einzelnen Domäne sind tendenziell weit über eine große Teilmenge von WARCs verteilt. Dies kann deutlich anhand der obigen Beispielabfrage gesehen werden: Von den ~150.000 Datensätzen in jedem WARC kann der größte einzelne Treffer für mittelgroße Websites im einstelligen Bereich liegen.
Nachdem die Warteschlange gefüllt ist, sind wir bereit zu feuern. WARCannon führt einige Plausibilitätsprüfungen durch, um sicherzustellen, dass alles in Ordnung ist, zeigt Ihnen dann die Konfiguration der Kampagne und gibt Ihnen eine letzte Gelegenheit, abzubrechen, bevor Sie die Bestellung abschließen.
warcannon$ warcannon fire
[!] This will request [ 6 ] spot instances of type [ m5n.24xlarge, m5dn.24xlarge ]
lasting for [ 86400 ] seconds.
To change this, edit your settings in settings.json and run warcannon deploy
--> Ready to fire? [Yes]:
Lösen Sie aus, indem Sie mit 'Yes' antworten.
--> Ready to fire? [Yes]: Yes
{
"SpotFleetRequestId": "sfr-03dd32b8-51f7-4c8e-802b-a702fc3c8c95"
}
[+] Spot fleet request has been sent, and nodes should start coming online within ~5 minutes.
Monitor node status and progress at https://d201offlnmhkmd.cloudfront.net
Die Antwort enthält einen Link zu Ihrer eindeutigen Status-URL, unter der Sie den Fortschritt Ihrer Kampagne und die Leistung jedes Knotens überwachen können.

WARCannon-Ergebnisse werden in S3 im JSON-Format gespeichert, aufgeschlüsselt nach jedem Knoten, der für die Ergebnisse verantwortlich ist. Athena-Ergebnisse werden im selben Bucket unter dem Präfix /athena/ gespeichert. Sie können die Ergebnisse einer Kampagne mit dem Befehl syncResults in den Ordner ~/.warcannon/ auf Ihrem lokalen Rechner synchronisieren.
warcannon syncResults
sync: s3://warcannon-results-202...
sync: s3://warcannon-results-202...
sync: s3://warcannon-results-202...
...
Sie können dann die Ergebnis-Buckets mit clearResults leeren
warcannon clearResults
delete: s3://warcannon-results-202...
delete: s3://warcannon-results-202...
delete: s3://warcannon-results-202...
...
[+] Deleted [ 21 ] files from S3.
Haben Sie Fragen, brauchen Hilfe, möchten Sie beitragen oder mit einem Erfolg prahlen? Kommen Sie auf Discord vorbei!