Przejdź do treści głównej

Opis metod (v1)

ostrzeżenie

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 zapytania
  • queryParams - hash z parametrami get lub hash z ciałem zapytania post
  • opts - 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 scrapera
  • overrideParams - hash z nadpisaniami ustawień wywoływanego scrapera
  • query - 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.*).

notatka

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 rozpoznania
  • preset - wskazuje na preset dla Util::AntiGateUtil::AntiGate
  • type określa się jeden z: 'jpeg', 'gif', 'png'

Wynikiem będzie hash z polami:

  • answer - tekst z obrazka
  • id - id captchy, aby móc później zgłosić błąd przez reportBad
  • error - 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 (&amp; 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 inicjalizacja
  • canChangeProxy - parametr opcjonalny, możliwość zmiany proxy, domyślnie wynosi 1
  • domain - 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