Heim  >  Artikel  >  Web-Frontend  >  Ein leistungsstarker Crawler basierend auf Node.js, der gecrawlte Articles_node.js direkt veröffentlichen kann

Ein leistungsstarker Crawler basierend auf Node.js, der gecrawlte Articles_node.js direkt veröffentlichen kann

WBOY
WBOYOriginal
2016-05-16 15:20:421685Durchsuche

1. Umgebungskonfiguration

1) Erstellen Sie einen Server, jedes Linux reicht aus, ich verwende CentOS 6.5;

2) Installieren Sie eine MySQL-Datenbank, entweder 5.5 oder 5.6. Um Ärger zu vermeiden, können Sie sie direkt mit lnmp oder Lamp installieren. Sie können die Protokolle auch später direkt im Browser lesen

3) Installieren Sie zuerst eine node.js-Umgebung. Ich habe keine späteren Versionen ausprobiert

4) Führen Sie npm -g install forever aus, um die Installation für immer durchzuführen, damit der Crawler im Hintergrund laufen kann

5) Organisieren Sie den gesamten Code lokal (Integration = Git-Klon);

6) Führen Sie npm install im Projektverzeichnis aus, um abhängige Bibliotheken zu installieren

7) Erstellen Sie zwei leere Ordner, json und avatar, im Projektverzeichnis

8) Erstellen Sie eine leere MySQL-Datenbank und einen Benutzer mit vollständigen Berechtigungen, führen Sie setup.sql und startusers.sql nacheinander im Code aus, erstellen Sie die Datenbankstruktur und importieren Sie den anfänglichen Seed-Benutzer

9) Bearbeiten Sie config.js. Die mit (erforderlich) markierten Konfigurationselemente müssen ausgefüllt oder geändert werden, und die übrigen Elemente können vorerst unverändert bleiben:


Speichern Sie und fahren Sie mit dem nächsten Schritt fort.
exports.jsonPath = "./json/";//生成json文件的路径
exports.avatarPath = "./avatar/";//保存头像文件的路径
exports.dbconfig = {
  host: 'localhost',//数据库服务器(必须)
  user: 'dbuser',//数据库用户名(必须)
  password: 'dbpassword',//数据库密码(必须)
  database: 'dbname',//数据库名(必须)
  port: 3306,//数据库服务器端口
  poolSize: 20,
  acquireTimeout: 30000
};
  
exports.urlpre = "http://www.jb51.net/";//脚本网址
exports.urlzhuanlanpre = "http://www.jb51.net/list/index_96.htm/";//脚本网址
  
exports.WPurl = "www.xxx.com";//要发布文章的wordpress网站地址
exports.WPusername = "publishuser";//发布文章的用户名
exports.WPpassword = "publishpassword";//发布文章用户的密码
exports.WPurlavatarpre = "http://www.xxx.com/avatar/";//发布文章中替代原始头像的url地址
  
exports.mailservice = "QQ";//邮件通知服务类型,也可以用Gmail,前提是你访问得了Gmail(必须)
exports.mailuser = "12345@qq.com";//邮箱用户名(必须)
exports.mailpass = "qqpassword";//邮箱密码(必须)
exports.mailfrom = "12345@qq.com";//发送邮件地址(必须,一般与用户名所属邮箱一致)
exports.mailto = "12345@qq.com";//接收通知邮件地址(必须)
2. Crawler-Benutzer

Das Prinzip des Crawlers besteht eigentlich darin, einen echten Zhihu-Benutzer zu simulieren, der auf der Website herumklickt und Daten sammelt. Wir benötigen also einen echten Zhihu-Benutzer. Zum Testen können Sie Ihr eigenes Konto verwenden. Aus langfristigen Gründen ist es jedoch besser, ein spezielles Konto zu registrieren. Eins reicht aus, und der aktuelle Crawler unterstützt nur eines. Unser Simulationsprozess muss sich nicht wie ein echter Benutzer von der Homepage aus anmelden, sondern leiht sich direkt den Cookie-Wert aus: Gehen Sie nach der Registrierung, Aktivierung und Anmeldung auf Ihre Homepage, verwenden Sie einen beliebigen Browser mit Entwicklermodus oder Cookie-Plugin und öffnen Sie Ihre eigenen Cookies in Zhihu. Es mag eine sehr komplexe Liste sein, aber wir brauchen nur einen Teil davon, nämlich „z_c0“. Kopieren Sie den z_c0-Teil Ihres eigenen Cookies und lassen Sie die Gleichheitszeichen, Anführungszeichen und Semikolons weg. Das endgültige Format sieht ungefähr so ​​aus:


Fügen Sie eine Zeile mit Datensätzen in die Cookies-Tabelle der MySQL-Datenbank ein, wobei die Werte jedes Felds wie folgt lauten:
z_c0="LA8kJIJFdDSOA883wkUGJIRE8jVNKSOQfB9430=|1420113988|a6ea18bc1b23ea469e3b5fb2e33c2828439cb";


E-Mail: Die Login-E-Mail-Adresse des Crawler-Benutzers
  • Passwort: das Passwort des Crawler-Benutzers
  • Name: Crawler-Benutzername
  • Hash: der Hash des Crawler-Benutzers (eine eindeutige Kennung, die nicht von jedem Benutzer geändert werden kann. Tatsächlich wird er hier nicht verwendet und kann vorübergehend leer gelassen werden)
  • Cookie: das Cookie, das Sie gerade kopiert haben
  • Dann kann es offiziell losgehen. Wenn das Cookie abläuft oder der Benutzer blockiert ist, ändern Sie einfach das Cookie-Feld in dieser Datensatzzeile.
3. Bedienung

Es wird empfohlen, für die Ausführung „Forever“ zu verwenden, was nicht nur die Ausführung und Protokollierung im Hintergrund erleichtert, sondern auch nach einem Absturz automatisch neu startet. Beispiel:


Die Adresse nach -l ist der Ort, an dem das Protokoll aufgezeichnet wird. Wenn es im Webserververzeichnis abgelegt wird, kann im Browser über
http://www.xxx.com/log.txt Überprüfen Sie direkt das Protokoll. Fügen Sie nach index.js Parameter (durch Leerzeichen getrennt) hinzu, um verschiedene Crawler-Anweisungen auszuführen:
forever -l /var/www/log.txt index.js
1. -i wird sofort ausgeführt, wenn dieser Parameter nicht hinzugefügt wird, wird er standardmäßig zum nächsten angegebenen Zeitpunkt ausgeführt, z. B. jeden Morgen um 0:05 Uhr 2. -ng überspringt die Phase des Abrufens neuer Benutzer, also getnewuser; 3. -ns überspringt die Snapshot-Phase, also den Usersnapshot; 4. -nf überspringt die Phase der Datendateigenerierung, d. h. saveviewfile
5. -db zeigt Debugging-Protokolle an.

Die Funktionen jeder Stufe werden im nächsten Abschnitt vorgestellt. Um die Bedienung zu erleichtern, können Sie diese Befehlszeile als SH-Skript schreiben, zum Beispiel:


Bitte ersetzen Sie den spezifischen Pfad durch Ihren eigenen. Auf diese Weise können Sie den Crawler starten, indem Sie Parameter zu ./zhihuspider.sh hinzufügen: Beispielsweise startet ./zhihuspider.sh -i -ng -nf die Aufgabe sofort und überspringt die Phasen des Speicherns neuer Benutzer und Dateien. Die Methode zum Stoppen des Crawlers ist „forever stopall“ (oder „Stopp-Seriennummer“).

4. Übersicht der Grundsätze

Stellen Sie sicher, dass die Eintragsdatei für den Zhihu-Crawler index.js ist. Es führt Crawler-Aufgaben täglich zu bestimmten Zeiten in einer Schleife aus. Es gibt drei Aufgaben, die jeden Tag nacheinander ausgeführt werden, nämlich:

1) getnewuser.js: Erfassen Sie neue Benutzerinformationen, indem Sie die Liste der Benutzer-Follower in der aktuellen Bibliothek vergleichen und automatisch die würdigen Benutzer auflisten Zhihu Neue Leute werden zur Bibliothek hinzugefügt

2) usersnapshot.js: Schleifen zum Erfassen von Benutzerinformationen und Antwortlisten in der aktuellen Bibliothek und zum Speichern dieser in Form von täglichen Snapshots.

3) saveviewfile.js: Generieren Sie eine Benutzeranalyseliste basierend auf dem Inhalt des neuesten Snapshots, filtern Sie gestrige, aktuelle und historische Essenzantworten heraus und veröffentlichen Sie sie im „Kanzhihu“-Website.

Nachdem die oben genannten drei Aufgaben abgeschlossen sind, aktualisiert der Hauptthread alle paar Minuten die Zhihu-Homepage, um zu überprüfen, ob das aktuelle Cookie noch gültig ist. Wenn es ungültig ist (Sprung zur Nicht-Anmeldeseite), wird eine Benachrichtigungs-E-Mail gesendet werden an das angegebene Postfach gesendet und erinnern Sie daran, Cookies rechtzeitig zu ändern. Die Methode zum Ändern von Cookies ist die gleiche wie bei der Initialisierung. Sie müssen sich nur einmal manuell anmelden und dann den Cookie-Wert entfernen. Wenn Sie an der spezifischen Code-Implementierung interessiert sind, können Sie die darin enthaltenen Kommentare sorgfältig lesen, einige Konfigurationen anpassen oder sogar versuchen, den gesamten Crawler selbst zu rekonstruieren.

Tipps

1) Das Prinzip von getnewuser besteht darin, die Erfassung durch den Vergleich der Anzahl der Benutzerfolgen in den Schnappschüssen der beiden Tage davor und danach festzulegen. Daher müssen mindestens zwei Schnappschüsse vorhanden sein, bevor sie gestartet werden können Wird zuvor ausgeführt, wird es automatisch übersprungen.

2) Die Hälfte des Snapshots kann wiederhergestellt werden. Wenn das Programm aufgrund eines Fehlers abstürzt, stoppen Sie es mit „Forever Stop“ und fügen Sie dann die Parameter -i -ng hinzu, um es sofort auszuführen und die neue Benutzerphase zu überspringen, sodass Sie mit dem halb erfassten Snapshot fortfahren können.

3) Erhöhen Sie nicht einfach die Anzahl der (Pseudo-)Threads, wenn Sie Snapshots erstellen, d. h. das Attribut „maxthreadcount“ in „usersnapshots“. Zu viele Threads verursachen 429-Fehler und die große erfasste Datenmenge wird möglicherweise nicht rechtzeitig in die Datenbank geschrieben, was zu einem Speicherüberlauf führt. Daher sollten Sie 10 Threads nicht überschreiten, es sei denn, Ihre Datenbank befindet sich auf einer SSD.

4) Das Speichern der Ansichtsdatei zum Generieren von Analyseergebnissen erfordert Snapshots von mindestens den letzten 7 Tagen. Wenn der Snapshot-Inhalt weniger als 7 Tage alt ist, wird ein Fehler gemeldet und übersprungen. Vorherige Analysearbeiten können durch manuelle Abfragen der Datenbank durchgeführt werden.

5) Da die meisten Leute kein „Kanzhihu“ kopieren müssen, wurde der Eintrag zur Funktion zur automatischen Veröffentlichung von WordPress-Artikeln auskommentiert. Wenn Sie WordPress eingerichtet haben, denken Sie daran, xmlrpc zu aktivieren, richten Sie dann einen Benutzer speziell für die Veröffentlichung von Artikeln ein, konfigurieren Sie die entsprechenden Parameter in config.js und kommentieren Sie den entsprechenden Code in saveviewfile aus.

6) Da Zhihu eine Anti-Leeching-Behandlung für Avatare implementiert hat, haben wir bei der Erfassung von Benutzerinformationen auch die Avatare abgerufen und sie lokal gespeichert. Beim Veröffentlichen von Artikeln haben wir die lokale Avatar-Adresse verwendet. Sie müssen den URL-Pfad im http-Server auf den Ordner verweisen, in dem der Avatar gespeichert ist, oder den Ordner, in dem der Avatar gespeichert ist, direkt im Website-Verzeichnis platzieren.

7) Der Code ist möglicherweise nicht leicht zu lesen. Neben der verwirrenden Rückrufstruktur von node.js selbst liegt der Grund auch darin, dass ich beim ersten Schreiben des Programms gerade erst mit node.js in Berührung gekommen bin. Es gab viele unbekannte Orte, die die Struktur verursachten Es war verwirrend und ich hatte keine Zeit, es zu korrigieren. Ein weiterer Teil war, dass sich nach vielen Malen viele hässliche Beurteilungsbedingungen und Wiederholungsregeln im Patchwork angesammelt hatten. Wenn sie alle entfernt würden, könnte sich das Codevolumen um zwei Drittel reduzieren. Um den stabilen Betrieb eines Systems zu gewährleisten, führt jedoch kein Weg daran vorbei.

8) Dieser Crawler-Quellcode basiert auf dem WTFPL-Protokoll und unterliegt keinen Einschränkungen hinsichtlich Änderung und Veröffentlichung.

Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, er wird für das Studium aller hilfreich sein.

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn