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.

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.
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.
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.
- 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;
}
}
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']]
comboboxmed 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älttextarea- 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
- TypeScript
- JavaScript
this.defaultConf: typeof BaseParser.defaultConf = {
version: '0.1.1',
...
}
this.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.
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.
Användbara länkar
📄️ Exempel på bulkQueries
Exempel på användning av bulkQueries med anrop av en inbyggd scraper
🔗 Exempel och diskussion
Tråd på forumet med exempel och diskussion om funktionaliteten för JS-scrapers
🔗 Katalog över JS-scrapers
Avsnitt i resurskatalogen dedikerat till JS-scrapers
🔗 Översikt av grundläggande ES6-funktioner
Artikel på habrahabr dedikerad till en översikt av grundläggande ES6-funktioner