Opis metod (v1)
To JavaScript API jest uważane za przestarzałe, zalecamy korzystanie z API wersji 2
Należy pamiętać, że niektóre metody wymagają użycia słowa kluczowego yield
yield this.request()
yield this.request(method, url, queryParams, opts)
Pobieranie odpowiedzi HTTP na zapytanie, jako argumenty podaje się:
method- metoda zapytania (GET, POST...)url- link do zapytaniaqueryParams- hash z parametrami get lub hash z ciałem zapytania postopts- hash z opcjami zapytania
Jeśli używana jest metoda POST, ciało zapytania można przekazać na dwa sposoby:
- po prostu wymieniając nazwy zmiennych i ich wartości w
queryParams. Na przykład:
{
key: set.query,
id: 1234,
type: 'text'
}
- poprzez zmienną body w
opts. Na przykład:
body: 'key=' + set.query + '&id=1234&type=text'
opts.check_content
check_content: [ warunek1, warunek2, ...] - tablica warunków do sprawdzenia otrzymanej treści, jeśli sprawdzenie nie powiedzie się, zapytanie zostanie powtórzone z innym proxy.
Możliwości:
- użycie ciągów znaków jako warunków (wyszukiwanie wystąpienia ciągu)
- użycie wyrażeń regularnych jako warunków
- użycie własnych funkcji sprawdzających, do których przekazywane są dane i nagłówki odpowiedzi
- można zdefiniować kilka różnych typów warunków jednocześnie
- dla negacji logicznej umieść warunek w tablicy, tj.
check_content: ['xxxx', [/yyyy/]]oznacza, że zapytanie zostanie uznane za udane, jeśli otrzymane dane zawierają podciąg xxxx, a jednocześnie wyrażenie regularne /yyyy/ nie znajduje dopasowań na stronie
Aby zapytanie zakończyło się sukcesem, muszą zostać zaliczone wszystkie sprawdzenia określone w tablicy
Przykład (w komentarzach wskazano, co jest potrzebne, aby zapytanie zostało uznane za udane):
let response = yield this.request('GET', set.query, {}, {
check_content: [
/<\/html>|<\/body>/, //na otrzymanej stronie musi zadziałać to wyrażenie regularne
['XXXX'], //na otrzymanej stronie nie może być tego podciągu
'</html>', //na otrzymanej stronie musi znajdować się taki podciąg
(data, hdr) => {
return hdr.Status == 200 && data.length > 100;
} //ta funkcja musi zwrócić true
]
});
opts.decode
decode: 'auto-html' - automatyczne wykrywanie kodowania i konwersja na utf8
Możliwe wartości:
auto-html- na podstawie nagłówków, tagów meta i zawartości strony (optymalna zalecana opcja)utf8- wskazuje, że dokument jest w kodowaniu utf8<encoding>- dowolne inne kodowanie
opts.headers
headers: { ... } - hash z nagłówkami, nazwa nagłówka musi być podana małymi literami, można określić m.in. cookie
Przykład:
headers: {
accept: 'image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8',
'accept-encoding': 'gzip, deflate, br',
cookie: 'a=321; b=test',
'user-agent' 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36'
}
opts.headers_order
headers_order: ['cookie', 'user-agent', ...] - pozwala nadpisać kolejność sortowania nagłówków
opts.recurse
recurse: N - maksymalna liczba przekierowań, domyślnie 7, użyj 0 aby wyłączyć podążanie za przekierowaniami
opts.proxyretries
proxyretries: N - liczba prób wykonania zapytania, domyślnie pobierana z ustawień scrapera
opts.parsecodes
parsecodes: { ... } - lista kodów odpowiedzi HTTP, które scraper będzie uważał za udane, domyślnie pobierana z ustawień scrapera. Jeśli podasz '*': 1, wszystkie odpowiedzi będą uważane za udane.
Przykład:
parsecodes: {
200: 1,
403: 1,
500: 1
}
opts.timeout
timeout: N - limit czasu odpowiedzi w sekundach, domyślnie pobierany z ustawień scrapera
opts.do_gzip
do_gzip: 1 - określa, czy używać kompresji (gzip/deflate/br), domyślnie włączone (1), aby wyłączyć należy ustawić wartość 0
opts.max_size
max_size: N - maksymalny rozmiar odpowiedzi w bajtach, domyślnie pobierany z ustawień scrapera
opts.cookie_jar
cookie_jar: { ... } - hash z ciasteczkami.
opts.attempt
attempt: N - wskazuje numer bieżącej próby, przy użyciu tego parametru wbudowany mechanizm obsługi prób dla tego zapytania jest ignorowany
opts.browser
browser: 1 - automatyczna emulacja nagłówków przeglądarki (1 - włączone, 0 - wyłączone)
opts.use_proxy
use_proxy: 1 - nadpisuje użycie proxy dla pojedynczego zapytania wewnątrz scrapera JS ponad globalnym parametrem Use proxy (1 - włączone, 0 - wyłączone)
opts.noextraquery
noextraquery: 0 - wyłącza dodawanie Extra query string do adresu URL zapytania (1 - włączone, 0 - wyłączone)
opts.save_to_file
save_to_file: file - pozwala pobrać plik bezpośrednio na dysk, pomijając zapis do pamięci. Zamiast file podaje się nazwę i ścieżkę, pod jaką zapisać plik. Przy użyciu tej opcji ignorowane jest wszystko związane z data (sprawdzanie treści w check_content, response.data będzie puste itp.).
opts.data_as_buffer
data_as_buffer: 0 - określa, czy zwracać data jako ciąg String (0) czy jako obiekt Buffer (1), domyślnie zwracany jest ciąg String
opts.bypass_cloudflare
bypass_cloudflare: 0 - automatyczne omijanie ochrony JavaScript CloudFlare przy użyciu przeglądarki Chrome (1 - włączone, 0 - wyłączone)
opts.follow_meta_refresh
follow_meta_refresh: 0 - pozwala podążać za przekierowaniami zadeklarowanymi przez tag HTML meta:
<meta http-equiv="refresh" content="time; url=..." />
opts.tlsOpts
tlsOpts: { ... } – pozwala przekazywać ustawienia dla połączeń https
yield this.parser.request()
yield this.parser.request(parser, preset, overrideParams, query)
Pobieranie wyników z innego scrapera (wbudowanego lub innego scrapera JS), jako argumenty podaje się:
parser- nazwa scrapera (SE::Google, JS::Custom::Example)preset- preset ustawień wywoływanego scraperaoverrideParams- hash z nadpisaniami ustawień wywoływanego scraperaquery- zapytanie
W overrideParams można nadpisywać parametry wywoływanego scrapera, dostępne są również takie flagi:
overrideParams.resultArraysWithObjects
resultArraysWithObjects: 0 - określa, w jakiej formie zwracać tablice wyników wywoływanego scrapera:
- jeśli włączone (1) - będą zwracane tablice obiektów
[{link: 'link1', anchor: 'anchor1'}, {link: 'link2', anchor: 'anchor2'}, ...] - jeśli wyłączone (0) - będą zwracane standardowe tablice wartości
['link1', 'anchor1', 'link2', 'anchor2', ...]
overrideParams.needData
needData: 1 - określa, czy przekazywać (1) czy nie (0) w odpowiedzi data/pages[], może być używane do optymalizacji
tools.*
Globalny obiekt tools, pozwala uzyskać dostęp do wbudowanych funkcji A-Parser (odpowiednik narzędzi silnika szablonów $tools.*).
tools.query nie jest dostępny, należy używać this.query
this.doLog()
Pokazuje, czy prowadzenie logu zadania jest włączone, może być używane jako flaga optymalizacji w przypadkach, gdy log nie jest prowadzony, a argumentem dla this.logger.put jest złożone wyrażenie
this.logger.*
.put()
this.logger.put(message) - dodaje wiersz message do logu zadania
.putHTML()
this.logger.putHTML(code) - wyprowadza do logu zadania kod HTML, który zostanie wyświetlony w textarea
yield this.sleep()
yield this.sleep(sec)
Ustawia opóźnienie w wątku na liczbę sekund sec, może być ułamkowa.
yield this.mutex.*
Muteks do synchronizacji między wątkami, pozwala zablokować sekcję kodu dla jednego wątku
.lock()
Oczekiwanie na blokadę, wykonanie będzie kontynuował pierwszy wątek, który przejął blokadę, pozostałe wątki będą oczekiwać na zwolnienie blokady
.unlock()
Zwolnienie blokady, następny wątek będzie kontynuował wykonanie, jeśli oczekiwał na blokadę (.lock())
this.cookies.*
Praca z ciasteczkami dla bieżącego zapytania
.getAll()
Pobieranie tablicy ciasteczek
.setAll()
Ustawianie ciasteczek, jako argument musi zostać przekazana tablica z ciasteczkami
.set()
this.cookies.set(host, path, name, value) - ustawianie pojedynczego ciasteczka
this.query.add()
this.query.add(query, maxLvl)
Dodawanie nowego zapytania (query) z opcjonalną możliwością określenia maksymalnego poziomu (maxLvl), analogicznie do tools.query.add() Jako zapytanie (query) można przekazać hash z parametrami, działa to analogicznie do Kreatora zapytań
Przykład:
this.query.add({
query: "http://site.com",
param1: "..",
...
});
this.proxy.*
Praca z proxy
.next()
Zmień proxy na następne, stare proxy nie będzie już używane dla bieżącego zapytania
.ban()
Zmień i zbanuj proxy (należy używać, gdy serwis blokuje pracę po IP), proxy zostanie zbanowane na czas określony w ustawieniach scrapera (proxybannedcleanup)
.get()
Pobierz bieżące proxy (ostatnie proxy, z którym wykonano zapytanie)
.set()
this.proxy.set('http://127.0.0.1:8080', noChange = false) - ustaw proxy dla następnego zapytania, parametr noChange jest opcjonalny, jeśli ustawiony na true, proxy nie będzie zmieniane między próbami
yield this.captcha.*
Praca z captchą
.recognize()
yield this.captcha.recognize(preset, image, type, overrides) - przesyłanie captchy do rozpoznania
image- dane binarne obrazka do rozpoznaniapreset- wskazuje na preset dla
Util::AntiGatetypeokreśla się jeden z: 'jpeg', 'gif', 'png'
Wynikiem będzie hash z polami:
answer- tekst z obrazkaid- id captchy, aby móc później zgłosić błąd przezreportBaderror- błąd tekstowy, jeśli answer nie został podany
.recognizeFromUrl()
yield this.captcha.recognizeFromUrl(preset, url, overrides) - analogicznie do poprzedniej metody, ale pobieranie captchy zostanie wykonane automatycznie z linku (url), bez użycia proxy
.reportBad()
yield this.captcha.reportBad(preset, id, overrides) - zgłoś serwisowi, że captcha została rozwiązana błędnie
this.utils.*
.updateResultsData()
this.utils.updateResultsData(results, data) - metoda do automatycznego wypełniania $pages.$i.data oraz $data, należy ją wywołać w celu dodania treści strony wynikowej
.urlFromHTML()
this.utils.urlFromHTML(url, base) - przetwarza link otrzymany z kodu HTML - dekoduje encje (& itp.), opcjonalnie można przekazać base - bazowy adres URL (np. URL strony źródłowej), w ten sposób można uzyskać pełny link
.url.extractDomain()
this.utils.url.extractDomain(url, removeDefaultSubdomain) - metoda przyjmuje jako pierwszy parametr link i zwraca domenę z tego linku. Drugi opcjonalny parametr określa, czy odciąć subdomenę www z domeny. Domyślnie 0 - czyli nie odcinać.
.url.extractTopDomain()
this.utils.url.extractTopDomain(url) - metoda przyjmuje jako pierwszy parametr link i zwraca domenę z tego linku, bez subdomen.
.url.extractTopDomainByZone()
this.utils.url.extractTopDomainByZone(url) - metoda przyjmuje jako pierwszy parametr link i zwraca domenę z tego linku, w tym bez subdomen. Działa ze wszystkimi strefami regionalnymi
.url.extractMaxPath()
this.utils.url.extractMaxPath(url) - metoda przyjmuje ciąg znaków i wybiera z niego adres URL
.url.extractWOParams()
this.utils.url.extractWOParams(url)- metoda przyjmuje link i zwraca ten sam link obcięty do ciągu parametrów. Czyli zwróci URL do znaku ?
.removeHtml()
this.utils.removeHtml(string) - metoda przyjmuje ciąg znaków i zwraca go oczyszczonego z tagów html
this.utils.removeNoDigit(string) - metoda przyjmuje ciąg znaków, usuwa z niego wszystko poza cyframi i zwraca wynik
.removeNoDigit()
this.utils.removeNoDigit(string) - metoda przyjmuje ciąg znaków, usuwa z niego wszystko poza cyframi i zwraca wynik
.removeComma()
this.utils.removeComma(string) - metoda przyjmuje ciąg znaków, usuwa z niego znaki takie jak .,\r\n i zwraca wynik
this.sessionManager.*
Aby korzystać z sesji w JS scraperze, należy najpierw zainicjować Menedżera sesji. Odbywa się to za pomocą funkcji init()
init() {
this.sessionManager.init({
//tutaj można zdefiniować dodatkowe parametry
});
}
W this.sessionManager.init() można użyć następujących parametrów:
name- parametr opcjonalny, pozwala przedefiniować nazwę scrapera, do którego należą sesje, domyślnie równa nazwie scrapera, w którym następuje inicjalizacjacanChangeProxy- parametr opcjonalny, możliwość zmiany proxy, domyślnie wynosi 1domain- opcjonalny parametr, wskazuje, aby wyszukiwać sesje wśród wszystkich zapisanych dla tego scrapera (jeśli wartość nie jest ustawiona), albo tylko dla konkretnej domeny (należy podawać domenę z kropką na początku, np..site.com)
Do pracy z sesjami istnieje kilka funkcji:
.get()
this.sessionManager.get() - pobiera nową sesję, należy wywołać przed wykonaniem zapytania
.reset()
this.sessionManager.reset() - czyszczenie plików cookie i pobieranie nowej sesji. Należy wywołać, jeśli zapytanie z bieżącą sesją nie powiodło się.
.save()
this.sessionManager.save() - zapisywanie udanej sesji lub zapisywanie dowolnych danych w sesji
results.<array>.addElement()
Metoda results.<array>.addElement() pozwala na wygodniejsze wypełnianie tablic w results. Przy jej użyciu nie trzeba pamiętać kolejności zmiennych w tablicy i wymieniać ich ręcznie.
results.serp.addElement({
link: 'https://google.com',
anchor: 'Google',
snippet: 'Loreps ipsum...',
});
Metody init() i destroy()
Metoda init() jest wywoływana przy starcie zadania, destroy() - przy zakończeniu.
Przykład użycia:
const puppeteer = require("puppeteer");
let globalBrowser;
class Parser {
constructor() {
...
}
async init() {
globalBrowser = await puppeteer.launch();
};
async destroy() {
if(globalBrowser)
await globalBrowser.close();
}
}
Przydatne linki
🔗 Przykład zapisywania pliku na dysk
Przykład demonstrujący sposób zapisywania plików bezpośrednio na dysk
🔗 Przykład pracy z sesjami
Wykorzystanie funkcjonalności sesji w scraperach JavaScript
🔗 Przykład zapisywania danych w sesji
Demonstracja możliwości przechowywania dowolnych danych w sesji
🔗 Użycie results.addElement()
Przykład wypełniania tablicy danych za pomocą results.addElement() i demonstracja różnicy w stosunku do zwykłego .push()