Methodenbeschreibung (v1)
Diese JavaScript-API gilt als veraltet. Wir empfehlen die Verwendung der API-Version 2.
Beachten Sie, dass einige Methoden die Angabe des Schlüsselworts yield erfordern.
yield this.request()
yield this.request(method, url, queryParams, opts)
Abrufen einer HTTP-Antwort auf eine Anfrage. Als Argumente werden angegeben:
method- die Anfragemethode (GET, POST...)url- der Link für die AnfragequeryParams- ein Hash mit GET-Parametern oder ein Hash mit dem Body der POST-Anfrageopts- ein Hash mit Anfrageoptionen
Wenn die POST-Methode verwendet wird, kann der Body der Anfrage auf zwei Arten übergeben werden:
- durch einfaches Auflisten der Variablennamen und ihrer Werte in
queryParams. Beispiel:
{
key: set.query,
id: 1234,
type: 'text'
}
- über die Variable body in
opts. Beispiel:
body: 'key=' + set.query + '&id=1234&type=text'
opts.check_content
check_content: [ Bedingung1, Bedingung2, ...] - ein Array von Bedingungen zur Überprüfung des empfangenen Inhalts. Wenn die Überprüfung fehlschlägt, wird die Anfrage mit einem anderen Proxy wiederholt.
Möglichkeiten:
- Verwendung von Strings als Bedingungen (Suche nach Vorkommen des Strings)
- Verwendung von regulären Ausdrücken als Bedingungen
- Verwendung eigener Prüffunktionen, denen die Daten und Header der Antwort übergeben werden
- Es können mehrere verschiedene Typen von Bedingungen gleichzeitig festgelegt werden
- Für eine logische Negation platzieren Sie die Bedingung in ein Array, d.h.
check_content: ['xxxx', [/yyyy/]]bedeutet, dass die Anfrage als erfolgreich gilt, wenn die Daten den Substring xxxx enthalten und gleichzeitig der reguläre Ausdruck /yyyy/ keine Übereinstimmungen auf der Seite findet
Für eine erfolgreiche Anfrage müssen alle im Array angegebenen Prüfungen bestanden werden.
Beispiel (in den Kommentaren ist angegeben, was für eine erfolgreiche Anfrage erforderlich ist):
let response = yield this.request('GET', set.query, {}, {
check_content: [
/<\/html>|<\/body>/, //auf der empfangenen Seite muss dieser reguläre Ausdruck zutreffen
['XXXX'], //auf der empfangenen Seite darf dieser Substring nicht vorhanden sein
'</html>', //auf der empfangenen Seite muss dieser Substring vorhanden sein
(data, hdr) => {
return hdr.Status == 200 && data.length > 100;
} //diese Funktion muss true zurückgeben
]
});
opts.decode
decode: 'auto-html' - automatische Erkennung der Kodierung und Konvertierung in utf8
Mögliche Werte:
auto-html- basierend auf Headern, Meta-Tags und dem Seiteninhalt (die empfohlene optimale Variante)utf8- gibt an, dass das Dokument in utf8 kodiert ist<encoding>- jede andere Kodierung
opts.headers
headers: { ... } - Hash mit Headern, der Name des Headers wird in Kleinschreibung angegeben, es kann u.a. cookie angegeben werden
Beispiel:
headers: {
accept: 'image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8',
'accept-encoding': 'gzip, deflate, br',
cookie: 'a=321; b=test',
'user-agent' 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36'
}
opts.headers_order
headers_order: ['cookie', 'user-agent', ...] - ermöglicht es, die Sortierreihenfolge der Header zu überschreiben
opts.recurse
recurse: N - maximale Anzahl von Weiterleitungen (Redirects), standardmäßig 7. Verwenden Sie 0, um Weiterleitungen zu deaktivieren.
opts.proxyretries
proxyretries: N - Anzahl der Versuche zur Ausführung der Anfrage, standardmäßig aus den Parser-Einstellungen übernommen.
opts.parsecodes
parsecodes: { ... } - Liste der HTTP-Antwortcodes, die der Parser als erfolgreich betrachtet, standardmäßig aus den Parser-Einstellungen übernommen. Wenn '*': 1 angegeben wird, gelten alle Antworten als erfolgreich.
Beispiel:
parsecodes: {
200: 1,
403: 1,
500: 1
}
opts.timeout
timeout: N - Antwort-Timeout in Sekunden, standardmäßig aus den Parser-Einstellungen übernommen.
opts.do_gzip
do_gzip: 1 - bestimmt, ob Komprimierung (gzip/deflate/br) verwendet werden soll, standardmäßig aktiviert (1), zum Deaktivieren den Wert 0 setzen.
opts.max_size
max_size: N - maximale Größe der Antwort in Bytes, standardmäßig aus den Parser-Einstellungen übernommen.
opts.cookie_jar
cookie_jar: { ... } - Hash mit Cookies.
opts.attempt
attempt: N - gibt die Nummer des aktuellen Versuchs an. Bei Verwendung dieses Parameters wird der integrierte Versuchs-Handler für diese Anfrage ignoriert.
opts.browser
browser: 1 - automatische Emulation von Browser-Headern (1 - aktiviert, 0 - deaktiviert)
opts.use_proxy
use_proxy: 1 - überschreibt die Proxy-Verwendung für eine einzelne Anfrage innerhalb des JS-Parsers gegenüber dem globalen Parameter Use proxy (1 - aktiviert, 0 - deaktiviert)
opts.noextraquery
noextraquery: 0 - deaktiviert das Hinzufügen des Extra query string zur Anfrage-URL (1 - aktiviert, 0 - deaktiviert)
opts.save_to_file
save_to_file: file - ermöglicht das Herunterladen einer Datei direkt auf die Festplatte, ohne sie im Speicher abzulegen. Anstelle von file wird der Name und Pfad angegeben, unter dem die Datei gespeichert werden soll. Bei Verwendung dieser Option wird alles ignoriert, was mit data zusammenhängt (Inhaltsprüfung in check_content, response.data ist leer usw.).
opts.data_as_buffer
data_as_buffer: 0 - bestimmt, ob data als String (0) oder als Buffer-Objekt (1) zurückgegeben wird, standardmäßig wird ein String zurückgegeben.
opts.bypass_cloudflare
bypass_cloudflare: 0 - automatisches Umgehen des CloudFlare JavaScript-Schutzes unter Verwendung des Chrome-Browsers (1 - aktiviert, 0 - deaktiviert)
opts.follow_meta_refresh
follow_meta_refresh: 0 - ermöglicht das Verfolgen von Redirects, die über ein HTML-Meta-Tag deklariert wurden:
<meta http-equiv="refresh" content="time; url=..." />
opts.tlsOpts
tlsOpts: { ... } – ermöglicht die Übergabe von Einstellungen für HTTPS-Verbindungen.
yield this.parser.request()
yield this.parser.request(parser, preset, overrideParams, query)
Abrufen von Ergebnissen eines anderen Parsers (integriert oder ein anderer JS-Parser). Als Argumente werden angegeben:
parser- Name des Parsers (SE::Google, JS::Custom::Example)preset- Einstellungs-Preset des aufgerufenen ParsersoverrideParams- Hash mit Überschreibungen der Einstellungen des aufgerufenen Parsersquery- Anfrage
In overrideParams können Parameter des aufgerufenen Parsers überschrieben werden, außerdem sind folgende Flags verfügbar:
overrideParams.resultArraysWithObjects
resultArraysWithObjects: 0 - bestimmt, in welcher Form die Ergebnis-Arrays des aufgerufenen Parsers zurückgegeben werden:
- wenn aktiviert (1) - werden Arrays von Objekten zurückgegeben
[{link: 'link1', anchor: 'anchor1'}, {link: 'link2', anchor: 'anchor2'}, ...] - wenn deaktiviert (0) - werden Standard-Arrays von Werten zurückgegeben
['link1', 'anchor1', 'link2', 'anchor2', ...]
overrideParams.needData
needData: 1 - bestimmt, ob data/pages[] in der Antwort übertragen werden soll (1) oder nicht (0), kann zur Optimierung verwendet werden.
tools.*
Globales Objekt tools, ermöglicht den Zugriff auf die integrierten Funktionen von A-Parser (analog zu den Template-Toolkit-Tools $tools.*).
tools.query ist nicht verfügbar, stattdessen muss this.query verwendet werden.
this.doLog()
Zeigt an, ob das Logging für die Aufgabe aktiviert ist. Kann als Flag zur Optimierung verwendet werden, falls kein Log geführt wird und als Argument für this.logger.put ein komplexer Ausdruck übergeben wird.
this.logger.*
.put()
this.logger.put(message) - fügt die Zeile message zum Aufgaben-Log hinzu.
.putHTML()
this.logger.putHTML(code) - Ausgabe von HTML-Code im Aufgaben-Log, der in einer Textarea angezeigt wird.
yield this.sleep()
yield this.sleep(sec)
Setzt eine Verzögerung im Thread für eine Anzahl von Sekunden sec (kann ein Dezimalwert sein).
yield this.mutex.*
Mutex zur Synchronisation zwischen Threads, ermöglicht das Sperren eines Codeabschnitts für einen Thread.
.lock()
Warten auf den Lock; die Ausführung wird durch den ersten Thread fortgesetzt, der den Lock erhält, andere Threads warten auf die Freigabe des Locks.
.unlock()
Freigabe des Locks; der nächste Thread setzt die Ausführung fort, falls er auf den Lock gewartet hat (.lock()).
this.cookies.*
Arbeit mit Cookies für die aktuelle Anfrage.
.getAll()
Abrufen eines Arrays von Cookies.
.setAll()
Setzen von Cookies; als Argument muss ein Array mit Cookies übergeben werden.
.set()
this.cookies.set(host, path, name, value) - Setzen eines einzelnen Cookies.
this.query.add()
this.query.add(query, maxLvl)
Hinzufügen einer neuen Anfrage (query) mit der optionalen Möglichkeit, die maximale Ebene (maxLvl) anzugeben, analog zu tools.query.add(). Als Anfrage (query) kann ein Hash mit Parametern übergeben werden, was analog zum Abfrage-Builder funktioniert.
Beispiel:
this.query.add({
query: "http://site.com",
param1: "..",
...
});
this.proxy.*
Arbeit mit Proxys.
.next()
Proxy auf den nächsten wechseln; der alte Proxy wird für die aktuelle Anfrage nicht mehr verwendet.
.ban()
Proxy wechseln und sperren (zu verwenden, wenn der Dienst den Zugriff über die IP blockiert); der Proxy wird für die in den Parser-Einstellungen angegebene Zeit gesperrt (proxybannedcleanup).
.get()
Aktuellen Proxy abrufen (der letzte Proxy, mit dem eine Anfrage gestellt wurde).
.set()
this.proxy.set('http://127.0.0.1:8080', noChange = false) - Proxy für die nächste Anfrage setzen. Der Parameter noChange ist optional; wenn true gesetzt wird, ändert sich der Proxy zwischen den Versuchen nicht.
yield this.captcha.*
Arbeit mit Captchas.
.recognize()
yield this.captcha.recognize(preset, image, type, overrides) - Hochladen eines Captchas zur Erkennung.
image- binäre Bilddaten zur Erkennung.preset- gibt das Preset für
Util::AntiGate antype- einer der folgenden Werte: 'jpeg', 'gif', 'png'.
Das Ergebnis ist ein Hash mit den Feldern:
answer- der Text aus dem Bild.id- Captcha-ID, um später überreportBadeinen Fehler melden zu können.error- Textfehler, falls answer nicht gesetzt ist.
.recognizeFromUrl()
yield this.captcha.recognizeFromUrl(preset, url, overrides) - analog zur vorherigen Methode, aber das Laden des Captchas erfolgt automatisch über den Link (url), ohne Verwendung eines Proxys.
.reportBad()
yield this.captcha.reportBad(preset, id, overrides) - dem Dienst melden, dass das Captcha falsch gelöst wurde.
this.utils.*
.updateResultsData()
this.utils.updateResultsData(results, data) - Methode zum automatischen Befüllen von $pages.$i.data und $data; muss aufgerufen werden, um den Inhalt der Ergebnisseite hinzuzufügen.
.urlFromHTML()
this.utils.urlFromHTML(url, base) - verarbeitet einen aus HTML-Code erhaltenen Link - dekodiert Entities (& usw.), optional kann base (Basis-URL, z.B. URL der Ausgangsseite) übergeben werden, um einen vollständigen Link zu erhalten.
.url.extractDomain()
this.utils.url.extractDomain(url, removeDefaultSubdomain) - die Methode nimmt als ersten Parameter einen Link und gibt die Domain aus diesem Link zurück. Der zweite optionale Parameter bestimmt, ob die Subdomain www von der Domain abgeschnitten werden soll. Standardmäßig 0 - also nicht abschneiden.
.url.extractTopDomain()
this.utils.url.extractTopDomain(url) - die Methode nimmt als ersten Parameter einen Link und gibt die Domain aus diesem Link ohne Subdomains zurück.
.url.extractTopDomainByZone()
this.utils.url.extractTopDomainByZone(url) - die Methode nimmt als ersten Parameter einen Link und gibt die Domain aus diesem Link zurück, ebenfalls ohne Subdomains. Funktioniert mit allen regionalen Zonen.
.url.extractMaxPath()
this.utils.url.extractMaxPath(url) - die Methode nimmt einen String und extrahiert daraus eine URL.
.url.extractWOParams()
this.utils.url.extractWOParams(url)- die Methode nimmt einen Link und gibt denselben Link gekürzt bis zum Parameter-String zurück. Das heißt, sie gibt die URL bis zum ? zurück.
.removeHtml()
this.utils.removeHtml(string) - die Methode nimmt einen String und gibt ihn bereinigt von HTML-Tags zurück.
this.utils.removeNoDigit(string) - die Methode nimmt einen String, entfernt alles außer Ziffern und gibt das Ergebnis zurück.
.removeNoDigit()
this.utils.removeNoDigit(string) - die Methode nimmt einen String entgegen, entfernt alles außer Ziffern und gibt das Ergebnis zurück
.removeComma()
this.utils.removeComma(string) - die Methode nimmt einen String entgegen, entfernt Zeichen wie .,\r\n und gibt das Ergebnis zurück
this.sessionManager.*
Um Sessions in einem JS-Parser zu verwenden, muss zuerst der Session-Manager initialisiert werden. Dies geschieht mit der Funktion init()
init() {
this.sessionManager.init({
//hier können zusätzliche Parameter festgelegt werden
});
}
In this.sessionManager.init() können folgende Parameter verwendet werden:
name- optionaler Parameter, ermöglicht das Überschreiben des Namens des Parsers, dem die Sessions gehören; standardmäßig der Name des Parsers, in dem die Initialisierung erfolgtcanChangeProxy- optionaler Parameter, Möglichkeit zum Wechseln des Proxys, Standardwert ist 1domain- optionaler Parameter, gibt an, ob Sessions unter allen für diesen Parser gespeicherten gesucht werden sollen (wenn kein Wert angegeben ist) oder nur für eine bestimmte Domain (die Domain muss mit einem führenden Punkt angegeben werden, z. B..site.com)
Für die Arbeit mit Sessions gibt es mehrere Funktionen:
.get()
this.sessionManager.get() - ruft eine neue Session ab, muss vor dem Ausführen der Anfrage aufgerufen werden
.reset()
this.sessionManager.reset() - Löschen der Cookies und Abrufen einer neuen Session. Muss aufgerufen werden, wenn die Anfrage mit der aktuellen Session nicht erfolgreich war.
.save()
this.sessionManager.save() - Speichern einer erfolgreichen Session oder Speichern beliebiger Daten in der Session
results.<array>.addElement()
Die Methode results.<array>.addElement() ermöglicht ein bequemeres Befüllen von Arrays in results. Bei ihrer Verwendung muss man sich nicht an die Reihenfolge der Variablen im Array erinnern und diese manuell aufzählen.
results.serp.addElement({
link: 'https://google.com',
anchor: 'Google',
snippet: 'Loreps ipsum...',
});
Methoden init() und destroy()
Die Methode init() wird beim Start der Aufgabe aufgerufen, destroy() beim Beenden.
Beispiel für die Verwendung:
const puppeteer = require("puppeteer");
let globalBrowser;
class Parser {
constructor() {
...
}
async init() {
globalBrowser = await puppeteer.launch();
};
async destroy() {
if(globalBrowser)
await globalBrowser.close();
}
}
Nützliche Links
🔗 Beispiel für das Speichern einer Datei auf die Festplatte
Beispiel, das zeigt, wie Dateien direkt auf die Festplatte gespeichert werden
🔗 Beispiel für die Arbeit mit Sessions
Verwendung der Session-Funktionalität in JavaScript-Parsern
🔗 Beispiel für das Speichern von Daten in einer Session
Demonstration der Möglichkeit, beliebige Daten in einer Session zu speichern
🔗 Verwendung von results.addElement()
Beispiel für das Befüllen eines Daten-Arrays mit results.addElement() und Demonstration des Unterschieds zum normalen .push()