Ga naar de hoofdinhoud

Scrapers in JavaScript: Overzicht van mogelijkheden

JavaScript-scrapers bieden de mogelijkheid om eigen volwaardige scrapers te maken met een willekeurig complexe logica, gebruikmakend van de taal JavaScript. Hierbij kan in JS-scrapers ook gebruik worden gemaakt van de volledige functionaliteit van de standaard scrapers.

Overzicht

Kenmerken

Door gebruik te maken van de volledige kracht van A-Parser is het nu mogelijk om een eigen scraper/reger/poster te schrijven met een willekeurig complexe logica. Voor het schrijven van de code wordt JavaScript met ES6-mogelijkheden gebruikt (v8-engine).

De code van de scrapers is maximaal beknopt, waardoor de focus kan liggen op het schrijven van de logica; het werken met multithreading, netwerk, proxy's, resultaten, logs, enz. neemt A-Parser voor zijn rekening. Code kan direct in de interface van de scraper worden geschreven door een nieuwe scraper toe te voegen in de Scraper-editor. Ook kunnen externe editors, zoals VSCode, worden gebruikt voor het schrijven van scrapers.

Er wordt gebruikgemaakt van automatische versionering bij het opslaan van de scraper-code via de ingebouwde editor.

opmerking

Het werken met JavaScript-scrapers is beschikbaar voor Pro- en Enterprise-licenties.

Toegang tot de JS Scraper-editor

Als A-Parser op afstand wordt gebruikt, is de JS Scraper-editor om veiligheidsredenen standaard niet beschikbaar. Om de toegang te openen, moet u het volgende doen:

  • Stel een wachtwoord in op het tabblad Settings -> Global Settings
  • Voeg de volgende regel toe aan config/config.txt: allow_javascript_editor: 1
  • Start A-Parser opnieuw op

Gebruiksaanwijzing

Maak in de Scraper-editor een nieuwe scraper aan en geef de scraper een naam. Standaard wordt er een eenvoudig voorbeeld geladen, op basis waarvan u snel aan de slag kunt met het maken van uw eigen scraper.

opmerking

Als er een externe editor wordt gebruikt voor het schrijven van de code, moet u het bestand van de te bewerken scraper openen in de map /parsers/. Bestandsstructuur van het geïnstalleerde programma.

Wanneer de code klaar is, slaat u deze op en gebruikt u deze als een gewone scraper: selecteer de gemaakte scraper in de Taak-editor, waarbij u indien nodig de gewenste parameters, thread-configuratie, bestandsnaam, enz. kunt instellen.

De gemaakte scraper kan op elk moment worden bewerkt. Alle wijzigingen met betrekking tot de interface verschijnen nadat de scraper opnieuw is geselecteerd in de lijst met scrapers of nadat A-Parser opnieuw is opgestart; wijzigingen in de logica van de scraper worden toegepast bij het opnieuw starten van de taak met de scraper.

Voor elke gemaakte scraper wordt standaard een standaardicoon weergegeven. U kunt uw eigen icoon toevoegen in png- of ico-formaat door deze in de map van de scraper in /parsers/ te plaatsen:

Algemene werkingsprincipes

Standaard wordt er een voorbeeld van een eenvoudige scraper gemaakt, klaar voor verdere bewerking.

files/parsers/v2-example/v2-example.ts

import { BaseParser } from 'a-parser-types';

export class JS_v2_example extends BaseParser {
static defaultConf: typeof BaseParser.defaultConf = {
version: '0.0.1',
results: {
flat: [
['title', 'HTML title'],
]
},
max_size: 2 * 1024 * 1024,
parsecodes: {
200: 1,
},
results_format: '$query: $title\\n',
};

static editableConf: typeof BaseParser.editableConf = [];

async parse(set, results) {
this.logger.put("Start scraping query: " + set.query);

let response = await this.request('GET', set.query, {}, {
check_content: ['<\/html>'],
decode: 'auto-html',
});

if (response.success) {
let matches = response.data.match(/<title>(.*?)<\/title>/i);
if (matches)
results.title = matches[1];
}

results.success = response.success;

return results;
}
}

De constructor wordt eenmalig aangeroepen voor elke taak. Het is verplicht om this.defaultConf.results en this.defaultConf.results_format in te stellen; de overige velden zijn optioneel en nemen standaardwaarden aan.

De array this.editableConf bepaalt welke instellingen door de gebruiker kunnen worden gewijzigd vanuit de A-Parser interface. De volgende veldtypen kunnen worden gebruikt:

  • combobox - een vervolgkeuzemenu. Het is ook mogelijk om een keuzemenu te maken voor een preset van een standaard scraper, bijvoorbeeld:
['Util_AntiGate_preset', ['combobox', 'AntiGate preset']]
  • combobox met de mogelijkheid voor meervoudige selectie. U moet de extra parameter {'multiSelect': 1} opgeven:
['proxyCheckers', ['combobox', 'Proxy Checkers', {'multiSelect': 1}, ['*', 'All']]]
  • checkbox - een selectievakje voor parameters die slechts 2 waarden kunnen hebben (true/false)
  • textfield - een tekstveld
  • textarea - een tekstveld voor invoer over meerdere regels

De methode parse is een asynchrone functie en moet voor elke blokkerende operatie await retourneren (dit is het belangrijkste en enige verschil met een gewone functie). De methode wordt aangeroepen voor elke query die in behandeling wordt genomen. set (een hash met de query en de bijbehorende parameters) en results (een leeg sjabloon voor resultaten) worden verplicht meegegeven. Het is ook verplicht om de ingevulde results te retourneren, nadat de vlag success is ingesteld.

Automatische versionering

De versie heeft het formaat Major.Minor.Revision

this.defaultConf: typeof BaseParser.defaultConf = {
version: '0.1.1',
...
}

De waarde van Revision (het laatste cijfer) wordt automatisch verhoogd bij elke opslag. De overige waarden (Major, Minor) kunnen handmatig worden gewijzigd, en de Revision kan ook worden gereset naar 0.

tip

Als het om een of andere reden nodig is om de Revision alleen handmatig te wijzigen, moet de versie tussen dubbele aanhalingstekens "" worden geplaatst.

Batchverwerking van query's

In sommige gevallen kan het nodig zijn om meerdere query's tegelijk uit de wachtrij te halen en deze in één keer te verwerken. Deze modus wordt bij ingebouwde scrapers gebruikt wanneer gegevens voor meerdere sleutels tegelijk (in een batch) moeten worden opgevraagd in één doorgang.

Om dezelfde functionaliteit in een JS-scraper te implementeren, moet u in this.defaultConf de waarde bulkQueries: N instellen, waarbij N het gewenste aantal query's in de batch is. In dit geval zal de scraper query's in batches van N stuks nemen en alle query's van de huidige iteratie zullen worden opgenomen in de array set.bulkQueries (inclusief alle standaardvariabelen: query.first, query.orig, query.prev, enz.). Hieronder een voorbeeld van zo'n array:

[
{
"first": "test",
"prev": "",
"lvl": 0,
"num": 0,
"query": "test",
"queryUid": "6eb301",
"orig": "test"
},
{
"first": "controle",
"prev": "",
"lvl": 0,
"num": 1,
"query": "controle",
"queryUid": "774563",
"orig": "controle"
},
{
"first": "third query",
"prev": "",
"lvl": 0,
"num": 2,
"query": "third query",
"queryUid": "2bc8ed",
"orig": "third query"
}
]

Resultaten bij batchverwerking moeten worden ingevuld in de array results.bulkResults, waarbij elk element een results-object is. De elementen in results.bulkResults staan in dezelfde volgorde als in set.bulkQueries.