Zum Hauptinhalt springen

Hook-Methoden

Diese Methoden funktionieren nach dem Prinzip von Hooks. Die Implementierung dieser Methoden ermöglicht die Kontrolle über die Arbeit des Parsers in verschiedenen Phasen, von der Initialisierung bis zur Zerstörung des Objekts.

Die Implementierung aller Methoden außer parse ist optional.

async parse(set, results)

Die Methode parse implementiert die Hauptlogik der Abfrageverarbeitung und den Erhalt des Ergebnisses der Datenerfassung, als Argumente werden übergeben:

  • set - Objekt mit Informationen über die Abfrage:
    • set.query - Textzeichenfolge der Abfrage
    • set.lvl - Ebene der Abfrage, standardmäßig 0
  • results - Objekt mit Ergebnissen, die ausgefüllt und von der Methode parse() zurückgegeben werden müssen
    • Der Parser sollte das Vorhandensein jedes Schlüssels im Objekt results prüfen und ihn nur bei Vorhandensein ausfüllen, auf diese Weise wird die Geschwindigkeit optimiert und es werden nur die Daten erfasst, die bei der Bildung des Ergebnisses verwendet werden
    • results enthält Schlüssel der erforderlichen flat Variablen mit dem Wert none, standardmäßig bedeutet dies, dass kein Ergebnis erhalten wurde, sowie Schlüssel von Array-Variablen (arrays) mit einem Wert in Form eines leeren Arrays, das zum Ausfüllen bereit ist
    • results.success muss bei erfolgreicher Verarbeitung der Abfrage auf den Wert 1 gesetzt werden, standardmäßig ist der Wert 0, was bedeutet, dass die Abfrage mit einem Fehler verarbeitet wurde

Betrachten wir es an einem Beispiel:

class JS_HTML_Tags extends BaseParser {
static defaultConf = {
results: {
flat: [
['title', 'Title'],
],
arrays: {
h2: ['H2 Headers List', [
['header', 'Header'],
]],
}
},
...
};

async parse(set, results) {
// Erhalten des Inhalts der HTML-Seite, deren Adresse in der Abfrage übergeben wurde
const {success, data, headers} = await this.request('GET', set.query);

// Prüfen des Erfolgs und des Typs von data; bei korrekter Verarbeitung von HTML-Seiten sollten wir den Typ 'string' erhalten, andernfalls gibt A-Parser ein Objekt vom Typ Buffer zurück
if (success && typeof data == 'string') {
let matches;

// Prüfen der Notwendigkeit, den Title zu erfassen, und Speichern des Werts
if (results.title && matches = data.match(/<title[^>]*>(.*?)<\/title>/))
results.title = matches[1];

// Prüfen der Notwendigkeit, h2 zu erfassen
if (results.h2) {
let count = 0;
const re = /<h2[^>]*>(.*?)<\/h2>/g;
while(matches = re.exec(data)) {
// Speichern aller gefundenen h2-Tags in einer Schleife
results.h2.push(matches[1]);
}
}

// Benachrichtigung über den Erfolg der Datenerfassung
results.success = 1;
}

// Rückgabe der verarbeiteten Ergebnisse
return results;
}
};

Beachten Sie, dass Sie eigene Funktionen und Methoden zur besseren Code-Organisation erstellen können:

function Answer() {
return 42;
}

class JS_HTML_Tags extends BaseParser {
...

async parse(set, results) {
results = await this.doWork(set, results);
return results;
}

async doWork(set, results) {
results.answer = Answer();
return results;
}
};

async processConf?(conf)

Diese Methode wird verwendet, um die Konfiguration nach bestimmten Regeln umzuwandeln, zum Beispiel müssen wir bei der Verwendung von Captcha immer Sitzungen verwenden:

async processConf(conf) {
if (conf.useCaptcha)
conf.useSessions = 1
}

async parse(set, results) {
if (conf.useSessions)
await this.login();
}

Die Existenz dieser Methode ist dadurch begründet, dass A-Parser dynamische Konfigurationsfelder unterstützt und innerhalb einer Aufgabe die Konfiguration unterschiedliche Werte haben kann; ein solches Szenario ist in zwei Fällen möglich:

  • Verwendung von Templates in Konfigurationsfeldern, zum Beispiel [% tools.ua.random() %] für das Feld User-Agent
  • Verwendung von overrides beim Aufruf eines Parsers aus einem anderen für this.parser.request

Die Methode processConf wird einmalig vor init() aufgerufen. Für die oben beschriebenen Fälle wird processConf zusätzlich vor der Verarbeitung jeder Abfrage aufgerufen

Grundregeln für die Anwendung von processConf:

  • Verwenden Sie sie nur, wenn die Umwandlung der Konfiguration Auswirkungen auf die Leistung hat
  • Bedenken Sie, dass init einmal ausgeführt wird, während processConf für jede Abfrage ausgeführt werden kann; in diesem Fall kann die Logik gestört werden, wenn init von sich ändernden Konfigurationsfeldern abhängt (siehe unten)

async init?()

Die Methode init wird einmal bei der Initialisierung des Basis-Parser-Objekts aufgerufen und dient zur Ausführung einmaliger Aktionen:

  • Starten des Browsers
  • Initialisierung des Sitzungsmanagers mit der Methode this.sessionManager.init()
  • Verbindung zur Datenbank und Erstellung von Tabellen in der DB
  • Lesen statischer Daten
  • Und so weiter.
Warnung

Da die Methode nur einmal aufgerufen wird, können alle Konfigurationsfelder, von denen init() abhängt, nicht zusammen mit Templates für Konfigurationsfelder oder mit overrides beim Aufruf von this.parsers.request verwendet werden.

async destroy?()

Die Methode destroy wird einmal beim Abschluss der Aufgabe aufgerufen und ist für die korrekte Zerstörung offener Ressourcen erforderlich:

  • Schließen des Browsers
  • Schließen der DB-Verbindung
  • Und so weiter.

async threadInit?()

Diese Methode wird bei der Initialisierung jedes Threads gestartet; jeder Thread stellt eine Kopie des Basis-Parser-Objekts mit seiner eigenen eindeutigen this.threadId dar, die bei 0 beginnt und bei threads_count - 1 endet.

Hauptanwendungsvarianten:

  • Erstellung einer Browserseite (Tab) für jeden Thread

async threadDestroy?()

Wird beim Beenden des Threads während des Abschlusses der Aufgabe ausgeführt und dient zur Freigabe von Ressourcen, die für diesen Thread zugewiesen wurden.

async afterResultsProcessor?(results)

Diese Methode wird nach der Verarbeitung der Ergebnisse durch den Ergebnis-Builder, die Filterung und die Unikalisierung ausgeführt. Der Hauptanwendungsfall ist das Hinzufügen von Abfragen zur Warteschlange mit der Methode this.query.add nach der Anwendung benutzerdefinierter Filter; auf diese Weise ist die Filterung von Links für den Übergang (followlinks) für den Parser HTML::LinkExtractorHTML::LinkExtractor implementiert.