Grundlegende Ideen
Ursprung: Master: Aus einer bestimmten Kategorie von Wikipedia (wie Flugzeugträger (Schlüssel) finden Sie alle Ziele, die Schlüssel (Flugzeugträger) im Titelattribut des Links enthalten, und fügen Sie sie hinzu, um die Warteschlange zu krochet. Auf diese Weise, während Sie den Code greifen, und die Bilder, die sich mit den von den Schlüssel, in denen sich auf die Schlüsselpagne befindliche Adressen auf die Schlüsselpage befassen, und die von den Weths, in denen sich die Webpages auf die Website befinden, und die auf dem Webpagent auf die Seite "Webpages" -Alg -ALG -ALG -ALG -ALG -ALG -ALG -ALG -ALG -ALG -PAGE -PAGE -ALG -ALG -ALG -ALG -ALG -PAGE -PAGE -PAGE ANGEBUCHEN. Durchqueren der Klassenbreite, um diese Aufgabe zu erledigen.
Idee 2 (Ursprung: Katze): Kriechen durch Klassifizierung. Beachten Sie, dass Kategorien auf Wikipedia mit der Kategorie beginnen:. Da Wikipedia eine gute Dokumentstruktur hat, ist es einfach, mit jeder Kategorie zu beginnen und immer alle darunter liegenden Kategorien zu kriechen. Dieser Algorithmus extrahiert Unterkategorisierungen für Klassifizierungsseiten und greift parallel darunter alle Seiten. Es ist schnell und kann die Klassifizierungsstruktur speichern, aber tatsächlich gibt es viele doppelte Seiten, aber dies kann leicht verarbeitet werden, indem ein Skript in der späteren Phase geschrieben wird.
Auswahl der Bibliothek
Ich wollte JSDOM benutzen. Obwohl ich das Gefühl hatte, dass es mächtig war, war es auch ziemlich "schwer". Das Ernsthaftes war, dass das Erklärungsdokument nicht gut genug war. Ich habe nur seine Vorteile erwähnt, hatte aber keine umfassende Erklärung. Wenn Sie also zu Cheerio wechseln, ist es leicht und hat relativ vollständige Funktionen. Zumindest können Sie ein umfassendes Konzept auf einen Blick haben. Nachdem ich es getan hatte, wurde mir klar, dass Bibliotheken überhaupt keine Notwendigkeit haben, und Sie können alles mit regelmäßigen Ausdrücken tun! Ich habe gerade ein bisschen Regelmäßigkeit in der Bibliothek geschrieben.
Schlüsselpunkte
Globale variable Einstellungen:
var r regkey = ['Flugzeugträger', "Flugzeugträger", "Flugzeugträger"]; // Wenn die Schlüsselwörter im Link enthalten sind, ist es das Ziel var Allkeys = []; // Der Titel des Links ist auch die Seitenkennung, wobei wiederholtes Kriechen von VAR -Schlüssel = ['Kategorie:%e8%88%AA%E7%A9%BA%E6%AF%8D%E8%88%b0'] vermieden wird. // Warten auf Warteschlangen, Startseite
Bilddownload
Verwenden Sie den Streaming -Betrieb der Anforderungsbibliothek, um jedes Download -Betrieb zu einem Verschluss zu machen. Achten Sie auf die möglichen Nebenwirkungen asynchroner Operationen. Zusätzlich muss der Bildname zurückgesetzt werden. Am Anfang nahm ich den ursprünglichen Namen. Aus einigen Gründen gibt es eindeutig einige Bilder, aber sie können nicht angezeigt werden. und das SRCSet -Attribut muss gelöscht werden, andernfalls kann die ursprüngliche Oberfläche nicht angezeigt werden.
$ = Cheer.load (Downhtml); var rshtml = $ .html (); var imgs = $ ('#BodyContent .image'); // Die Bilder werden durch diesen Stil für (IMG in IMGs) {if (typeof imgs [img] .attribs === 'undefined' || typeof imgs [img] .Attribs.Href === 'undfinierter') {Fortsetzung; IMGS [IMG] .Children [0] .attribs.src; // Die Bildadresse var Dirs = picurl.split ('.'); var Filename = basiertIR+uUid.v1 ()+'.'+Dirs [Dir.Length -1]; // Anfrage umbenennen ("https:"+picurl) .pipe (fs.createwritestream ('Seiten/'+Dateiname)); // rshtml = rshtml.replace (picurl, Dateiname) herunterladen; // lokale Pfad ersetzen // console.log (picurl); }}Breite Priorität Traversal
Zuerst habe ich das Konzept der Asynchronität nicht vollständig verstanden und es in einer Schleife gemacht. Ich dachte, dass die Verwendung von Versprechen bereits in die Synchronisation umgewandelt worden wäre, aber tatsächlich stellt sie nur sicher, dass die Operationen, die an Versprechen übergeben wurden, ordentlich durchgeführt werden und diese Operationen nicht mit anderen Operationen bestellt werden können! Beispielsweise ist der folgende Code falsch.
var keys = ['Flugzeugträger']; var key = keys.shift (); while (key) {data.get ({url: cododeuri (taste), qs: null}). Dann (function (function (downhtml) {... keys.push (taste); // (1)}}); taste = keys.shift (); // (2)}Die obige Operation ist normal, aber tatsächlich (2) wird zwischen (1) durchgeführt! Was zu tun?
Ich habe Rekursion verwendet, um dieses Problem zu lösen. Der folgende Beispielcode:
var key = keys.shift (); (Funktion DEDEXT (Schlüssel) {data.get ({url: key, qs: null}). Dann (function (downhtml) {... keys.push (href); })})(Schlüssel);Regelmäßige Reinigung
Verwenden Sie regelmäßige Ausdrücke, um nutzlosen Seitencode zu reinigen, da viele Muster verarbeitet werden müssen. Deshalb habe ich eine Schleife geschrieben, um sie gleichmäßig zu verarbeiten.
var regs = [/<link rel =/"stylesheet/" href =/"? [^/"]*/">/g,/<script>? [^<]*<// script>/g,/<style>? [^<]*<// style>/g,/<a? Regs.foreach (Funktion (rs) {var mactches = rshtml.match (rs); für (var i = 0; i <mactches.length; i ++) {rshtml = rshtml.replace (mactches [i], mactches [i]. href = "wiki '+(i+1)+'. CSS" ':' ');Laufeffekt
Ich brauche FQ auf Wiki Chinese. Ich probierte es aus und griff nach der Klassifizierung der Flugzeugträgerin. Während der Operation fand ich ungefähr 300 verwandte Links (einschließlich Klassifizierungsseiten. Ich habe nur gültige Links genommen und sie nicht heruntergeladen). Schließlich habe ich 209 richtig heruntergeladen. Ich habe einige Fehlerverbindungen manuell getestet und festgestellt, dass es sich um ungültige Links handelte. Es zeigte sich, dass der Eintrag noch nicht festgestellt worden war. Der gesamte Vorgang dauerte ungefähr fünfzehn Minuten. Nach der Komprimierung war es fast dreißig m und es war der Ansicht, dass der Effekt ziemlich gut war.
Quellcode
https://github.com/zhoutk/wikispider
Zusammenfassung
Als ich die Aufgabe letzte Nacht im Grunde erledigt hatte, kann Idea 1 Seiten mit relativ genauem Inhalt kriechen, und die Seiten werden nicht wiederholt, aber die Kriechungseffizienz ist nicht hoch, und die klassifizierten Informationen können nicht genau erhalten werden. Idea 2 kann nach Wikipedia automatisch in Kategorien in Kategorien kriechen und speichern, was sehr effizient ist (tatsächliche Messung, Krabbeln [Kriegsschiff] und insgesamt fast 6.000 Seiten, die etwa 50 Minuten dauern, und mehr als 100 Seiten können per Minute gekrabbelt werden) und können genaue Informationen genau sparen.
Der größte Gewinn ist ein tiefes Verständnis der Gesamtprozesskontrolle der asynchronen Programmierung.