Ga naar de hoofdinhoud

Hook-methoden

Deze methoden werken volgens het hook-principe. De implementatie van deze methoden maakt het mogelijk om de werking van de scraper op verschillende stadia te controleren, van initialisatie tot de vernietiging van het object.

De implementatie van alle methoden behalve parse is optioneel.

async parse(set, results)

De methode parse implementeert de hoofdlogica voor het verwerken van de query en het verkrijgen van het resultaat van de gegevensextractie. De volgende argumenten worden doorgegeven:

  • set - een object met informatie over de query:
    • set.query - de tekststring van de query
    • set.lvl - het niveau van de query, standaard 0
  • results - een object met resultaten die moeten worden ingevuld en geretourneerd vanuit de methode parse()
    • de scraper moet de aanwezigheid van elke sleutel in het results-object controleren en deze alleen invullen als deze aanwezig is; op deze manier wordt de snelheid geoptimaliseerd en worden alleen die gegevens verwerkt die worden gebruikt bij de vorming van het resultaat
    • results bevat sleutels van de benodigde flat variabelen met de waarde none, wat standaard betekent dat er geen resultaat is verkregen, evenals sleutels voor array-variabelen (arrays) met een lege array als waarde, klaar om te worden ingevuld
    • results.success moet op de waarde 1 worden ingesteld bij een succesvolle verwerking van de query, de standaardwaarde is 0, wat betekent dat de query met een fout is verwerkt

Laten we dit bekijken met een voorbeeld:

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

async parse(set, results) {
// Verkrijg de inhoud van de HTML-pagina waarvan het adres in de query is doorgegeven
const {success, data, headers} = await this.request('GET', set.query);

// Controleer het succes en het type data; bij correcte verwerking van HTML-pagina's moeten we het type 'string' ontvangen, anders retourneert A-Parser een object van het type Buffer
if (success && typeof data == 'string') {
let matches;

// Controleer de noodzaak om de title te verzamelen en sla de waarde op
if (results.title && matches = data.match(/<title[^>]*>(.*?)<\/title>/))
results.title = matches[1];

// Controleer de noodzaak om h2 te verzamelen
if (results.h2) {
let count = 0;
const re = /<h2[^>]*>(.*?)<\/h2>/g;
while(matches = re.exec(data)) {
// Sla alle gevonden h2-tags op in een lus
results.h2.push(matches[1]);
}
}

// Meld dat de gegevensextractie succesvol is
results.success = 1;
}

// Retourneer de verwerkte resultaten
return results;
}
};

Houd er rekening mee dat u uw eigen functies en methoden kunt maken voor een betere organisatie van de code:

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)

Deze methode wordt gebruikt om de configuratie volgens bepaalde regels aan te passen, bijvoorbeeld wanneer bij het gebruik van een captcha altijd sessies moeten worden gebruikt:

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

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

Het bestaan van deze methode is te danken aan het feit dat A-Parser dynamische configuratievelden ondersteunt en binnen één taak de configuratie verschillende waarden kan hebben. Dit scenario is mogelijk in twee gevallen:

  • Gebruik van sjablonen in configuratievelden, bijvoorbeeld [% tools.ua.random() %] voor het veld User-Agent
  • Gebruik van overrides bij het aanroepen van de ene scraper vanuit de andere voor this.parser.request

De methode processConf wordt eenmalig aangeroepen vóór init(). Voor de hierboven beschreven gevallen wordt processConf extra aangeroepen vóór de verwerking van elke query

Belangrijkste regels voor het gebruik van processConf:

  • Gebruik dit alleen als de aanpassing van de configuratie effect heeft op de prestaties
  • Houd er rekening mee dat init één keer wordt uitgevoerd, terwijl processConf voor elke query kan worden uitgevoerd; in dat geval kan de logica worden verstoord als init afhankelijk is van veranderende configuratievelden (zie hieronder)

async init?()

De methode init wordt één keer aangeroepen bij de initialisatie van het basisobject van de scraper en dient voor het uitvoeren van eenmalige acties:

  • Starten van de browser
  • Initialisatie van de sessiemanager met de methode this.sessionManager.init()
  • Verbinding maken met de database en tabellen aanmaken in de DB
  • Lezen van statische gegevens
  • Enzovoort
waarschuwing

Aangezien de methode één keer wordt aangeroepen, kunnen alle configuratievelden waarvan init() afhankelijk is, niet worden gebruikt in combinatie met sjablonen voor configuratievelden of met overrides bij het aanroepen van this.parsers.request

async destroy?()

De methode destroy wordt één keer aangeroepen bij het beëindigen van de taak en is nodig voor het correct vernietigen van geopende bronnen:

  • Sluiten van de browser
  • Sluiten van de databaseverbinding
  • Enzovoort

async threadInit?()

Deze methode wordt gestart bij de initialisatie van elke thread. Elke thread is een kopie van het basisobject van de scraper met zijn eigen unieke this.threadId, die begint bij 0 en eindigt bij threads_count - 1

Belangrijkste toepassingen:

  • Het aanmaken van een browserpagina (tabblad) voor elke thread

async threadDestroy?()

Wordt uitgevoerd bij het beëindigen van de thread tijdens het afronden van de taak; dient voor het vrijgeven van bronnen die voor deze thread zijn toegewezen

async afterResultsProcessor?(results)

Deze methode wordt uitgevoerd na de verwerking van de resultaten door de resultaten-constructor, filtering en deduplicatie. De belangrijkste toepassing is het toevoegen van query's aan de wachtrij met de methode this.query.add na het toepassen van gebruikersfilters; op deze manier is de filtering van links voor navigatie (followlinks) geïmplementeerd voor de scraper HTML::LinkExtractorHTML::LinkExtractor