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.

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.
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.
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.
- TypeScript
- JavaScript
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;
}
}
const { BaseParser } = require("a-parser-types");
class JS_v2_example_js extends BaseParser {
static 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 = [];
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']]
comboboxmet 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 tekstveldtextarea- 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
- TypeScript
- JavaScript
this.defaultConf: typeof BaseParser.defaultConf = {
version: '0.1.1',
...
}
this.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.
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.
Handige links
📄️ Voorbeeld bulkQueries
Voorbeeld van het gebruik van bulkQueries met een aanroep naar een ingebouwde scraper
🔗 Voorbeelden en discussie
Topic op het forum met voorbeelden en discussie over de functionaliteit van JS-scrapers
🔗 Catalogus van JS-scrapers
Sectie in de bronnencatalogus gewijd aan JS-scrapers
🔗 Overzicht van de basismogelijkheden van ES6
Artikel op habrahabr gewijd aan een overzicht van de basismogelijkheden van ES6