Hoppa till huvudinnehåll

Scrapers i JavaScript: Översikt av funktioner

JavaScript-scrapers - detta är en möjlighet att skapa egna fullfjädrade scrapers med hur komplex logik som helst med hjälp av språket JavaScript. Samtidigt kan man i JS-scrapers även använda all funktionalitet från standard-scrapers.

Översikt

Funktioner

Genom att använda hela kraften i A-Parser kan man nu skriva sin egen scraper/registrerare/poster med hur komplex logik som helst. För att skriva kod används JavaScript med ES6-funktioner (v8-motor).

Scraper-koden är maximalt kortfattad, vilket gör att man kan fokusera på att skriva logik; A-Parser tar hand om arbete med flertrådning, nätverk, proxy, resultat, loggar osv. Kod kan skrivas direkt i scraperns gränssnitt genom att lägga till en ny scraper i Scraper-redigeraren. Man kan även använda externa redigerare för att skriva scrapers, till exempel VSCode.

Automatisk versionshantering används när scraper-koden sparas via den inbyggda redigeraren.

anteckning

Arbete med JavaScript-scrapers är tillgängligt för licenserna Pro och Enterprise

Åtkomst till JS-scraper-redigeraren

Om A-Parser används fjärrstyrt är JS-scraper-redigeraren som standard inte tillgänglig av säkerhetsskäl. För att öppna åtkomst till den måste du:

  • Ställa in ett lösenord under fliken Settings -> Global Settings
  • Lägga till följande rad i config/config.txt: allow_javascript_editor: 1
  • Starta om A-Parser

Instruktioner för arbete

I Scraper-redigeraren skapar vi en ny scraper och anger scraperns namn. Som standard laddas ett enkelt exempel som man snabbt kan utgå ifrån för att skapa sin egen scraper.

anteckning

Om en extern redigerare används för att skriva kod måste man öppna filen för den scraper som redigeras i mappen /parsers/. Filstruktur för det installerade programmet.

När koden är klar sparar vi den och använder den som en vanlig scraper: i Uppgiftsredigeraren väljer vi den skapade scrapern, vid behov kan man ange önskade parametrar, trådkonfiguration, filnamn osv.

Den skapade scrapern kan redigeras när som helst. Alla ändringar som rör gränssnittet visas efter att scrapern valts igen i scraper-listan eller efter omstart av A-Parser; ändringar i scraperns logik tillämpas vid nästa körning av uppgiften med scrapern.

För varje skapad scraper visas en standardikon, man kan lägga till en egen i formatet png eller ico genom att placera den i scraperns mapp i /parsers/:

Allmänna funktionsprinciper

Som standard skapas ett exempel på en enkel scraper, redo för vidare redigering.

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;
}
}

Konstruktorn anropas en gång för varje uppgift. Det är obligatoriskt att ange this.defaultConf.results och this.defaultConf.results_format, övriga fält är valfria och kommer att anta standardvärden.

Arrayen this.editableConf definierar vilka inställningar som kan ändras av användaren från A-Parsers gränssnitt. Följande fälttyper kan användas:

  • combobox - rullgardinsmeny för val. Man kan även skapa en meny för att välja en förinställning för en standard-scraper, till exempel:
['Util_AntiGate_preset', ['combobox', 'AntiGate preset']]
  • combobox med möjlighet till flerval. Man måste dessutom ange parametern {'multiSelect': 1}:
['proxyCheckers', ['combobox', 'Proxy Checkers', {'multiSelect': 1}, ['*', 'All']]]
  • checkbox - kryssruta, för parametrar som bara kan ha 2 värden (true/false)
  • textfield - textfält
  • textarea - textfält med flerradig inmatning

Metoden parse är en asynkron funktion, och för varje blockerande operation måste den returnera await (detta är den huvudsakliga och enda skillnaden från en vanlig funktion). Metoden anropas för varje förfrågan som tas emot för bearbetning. set (hash med förfrågan och dess parametrar) och results (tom mall för resultat) skickas alltid med. Det är också obligatoriskt att returnera ett ifyllt results, efter att flaggan success har satts.

Automatisk versionshantering

Versionen har formatet Major.Minor.Revision

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

Värdet för Revision (den sista siffran) ökar automatiskt vid varje sparning. Övriga värden (Major, Minor) kan ändras manuellt, och man kan även återställa Revision till 0.

tips

Om man av någon anledning behöver ändra Revision endast manuellt, måste versionen inneslutas i dubbla citattecken ""

Paketbearbetning av förfrågningar

I vissa fall kan det krävas att man tar flera förfrågningar från kön samtidigt och bearbetar dem på en gång. Detta läge används i inbyggda scrapers när man i en genomgång behöver begära data för flera nycklar samtidigt (i ett paket).

För att implementera samma funktionalitet i en JS-scraper måste man i this.defaultConf ange värdet bulkQueries: N, där N är det önskade antalet förfrågningar i paketet. I detta fall kommer scrapern att ta förfrågningar i paket om N stycken och alla förfrågningar i den aktuella iterationen kommer att finnas i arrayen set.bulkQueries (inklusive alla standardvariabler: query.first, query.orig, query.prev osv.). Nedan visas ett exempel på en sådan array:

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

Resultaten vid paketbearbetning måste fyllas i arrayen results.bulkResults, där varje element är ett results-objekt. Elementen i results.bulkResults är placerade i samma ordning som de var i set.bulkQueries.