Описание методов (v1)
Данное JavaScript API считается устаревшим, рекомендуем использовать API версии 2
Обратите внимание что часть методов требуют указания ключевого слова yield
yield this.request()
yield this.request(method, url, queryParams, opts)
Получение HTTP ответа по запросу, в качестве аргументов указывается:
method
- метода запроса (GET, POST...)url
- ссылка для запросаqueryParams
- хэш с get параметрами или хэш с телом post-запросаopts
- хэш с опциями запроса
Если используется метод POST, то тело запроса можно передать двумя способами:
- просто перечислив названия переменных и их значения в
queryParams
. Например:
{
key: set.query,
id: 1234,
type: 'text'
}
- через переменную body в
opts
. Например:
body: 'key=' + set.query + '&id=1234&type=text'
opts.check_content
check_content: [ условие1, условие2, ...]
- массив условий для проверки получаемого контента, если проверка не проходит, то запрос будет повторен с другим прокси.
Возможности:
- использование в качестве условий строк (поиск по вхождению строки)
- использование в качестве условий регулярных выражений
- использование своих функций проверок, в которые передаются данные и хедеры ответа
- можно задать сразу несколько разных типов условий
- для логического отрицания поместите условие в массив, т.е.
check_content: ['xxxx', [/yyyy/]]
означает что запрос будет считаться успешным, если в полученных данных содержится подстрока xxxx и при этом регулярное выражение /yyyy/ не находит совпадений на странице
Для успешного запроса должны пройти все указанные в массиве проверки
Пример (в комментариях указано что нужно для того, чтобы запрос считался успешным):
let response = yield this.request('GET', set.query, {}, {
check_content: [
/<\/html>|<\/body>/, //на полученной странице должно сработать это регулярное выражение
['XXXX'], //на полученной странице не должно быть этой подстроки
'</html>', //на полученной странице должна быть такая подстрока
(data, hdr) => {
return hdr.Status == 200 && data.length > 100;
} //эта функция должна вернуть true
]
});
opts.decode
decode: 'auto-html'
- автоматическое определение кодировки и преобразование в utf8
Возможные значения:
auto-html
- на основе заголовков, тегов meta и по содержимому страници (оптимальный рекомендуемый вариант)utf8
- указывает что документ в кодировке utf8<encoding>
- любая другая кодировка
opts.headers
headers: { ... }
- хэш с заголовками, название заголовка задается в нижнем регистре, можно указать в т.ч. cookie
Пример:
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', ...]
- позволяет переопределить порядок сортировки заголовков
opts.recurse
recurse: N
- максимальное число переходов по редиректам, по умолчанию 7, используйте 0 для отключения перехода по редиректам
opts.proxyretries
proxyretries: N
- число попыток выполнения запроса, по умолчанию берется из настроек парсера
opts.parsecodes
parsecodes: { ... }
- перечень кодов HTTP ответов, которые парсер будет считать удачными, по умолчанию берется из настроек парсера. Если указать '*': 1
то все ответы будут считаться удачными.
Пример:
parsecodes: {
200: 1,
403: 1,
500: 1
}
opts.timeout
timeout: N
- таймаут ответа в секундах, по умолчанию берется из настроек парсера
opts.do_gzip
do_gzip: 1
- определяет использовать ли компрессию (gzip/deflate/br), по умолчанию включено (1), для выключения нужно задать значение 0
opts.max_size
max_size: N
- максимальный размер ответа в байтах, по умолчанию берется из настроек парсера
opts.cookie_jar
cookie_jar: { ... }
- хэш с куками.
opts.attempt
attempt: N
- указывает на номер текущей попытки, при использовании этого параметра встроенный обработчик попыток для данного запроса игнорируется
opts.browser
browser: 1
- автоматическая эмуляция заголовков браузера (1 - включено, 0 - выключено)
opts.use_proxy
use_proxy: 1
- переопределяет использование прокси для отдельного запроса внутри JS парсера поверх глобального параметра Use proxy (1 - включено, 0 - выключено)
opts.noextraquery
noextraquery: 0
- отключает добавление Extra query string к урлу запроса (1 - включено, 0 - отключено)
opts.save_to_file
save_to_file: file
- позволяет скачать файл напрямую на диск, минуя запись в память. Вместо file указывается имя и путь под каким сохранить файл. При использовании этой опции игнорируется все, что связано с data (проверка контента в check_content, response.data будет пустой и т.д.).
opts.data_as_buffer
data_as_buffer: 0
- определяет возвращать data как строку String (0) или как объект Buffer (1), по умолчанию возвращается строка String
opts.bypass_cloudflare
bypass_cloudflare: 0
- автоматический обход JavaScript защиты CloudFlare используя браузер Chrome (1 - включено, 0 - выключено)
opts.follow_meta_refresh
follow_meta_refresh: 0
- позволяет переходить по редиректам, объявленным через HTML мета тег:
<meta http-equiv="refresh" content="time; url=..." />
opts.tlsOpts
tlsOpts: { ... }
– позволяет передавать настройки для https соединений
yield this.parser.request()
yield this.parser.request(parser, preset, overrideParams, query)
Получение результатов от другого парсера (встроенного или еще другого JS парсера), в качестве аргументов указывается
parser
- имя парсера (SE::Google, JS::Custom::Example)preset
- пресет настроек вызываемого парсераoverrideParams
- хэш с переопределениями настроек вызываемого парсераquery
- запрос
В overrideParams
можно переопределять параметры вызываемого парсера, также доступны такие флаги:
overrideParams.resultArraysWithObjects
resultArraysWithObjects: 0
- определяет в каком виде возвращать массивы результатов вызываемого парсера:
- если включено (1) - будут возвращаться массивы объектов
[{link: 'link1', anchor: 'anchor1'}, {link: 'link2', anchor: 'anchor2'}, ...]
- если выключено (0) - будут возвращаться стандартные массивы значений
['link1', 'anchor1', 'link2', 'anchor2', ...]
overrideParams.needData
needData: 1
- определяет передавать (1) или нет (0) в ответе data/pages[], может использоваться для оптимизации
tools.*
Глобальный объект tools, позволяет получить доступ к встроенным функциям A-Parser'а (аналог инструментов шаблонизатора $tools.*).
tools.query
не доступен, необходимо использовать this.query
this.doLog()
Показывает включено ли ведение лога задания, может использоваться как флаг для оптимизации, для случаев когда лог не ведется и аргументом к this.logger.put
идет сложное выражение
this.logger.*
.put()
this.logger.put(message)
- добавляет строчку message в лог задания
.putHTML()
this.logger.putHTML(code)
- вывод в лог задания HTML кода, который будет отображен в textarea
yield this.sleep()
yield this.sleep(sec)
Устанавливает задержку в потоке на число секунд sec, может быть дробным.
yield this.mutex.*
Мютекс для синхронизации между потоками, позволяет заблокировать секцию кода для одного потока
.lock()
Ожидание лока, исполнение продолжит первый поток, который захватил лок, остальные потоки будут ожидать освобождение лока
.unlock()
Освобождение лока, следующий поток продолжит выполнение, если он ожидал лок(.lock()
)
this.cookies.*
Работа с cookies для текущего запроса
.getAll()
Получение массива cookies
.setAll()
Установка cookies, в качестве аргумента должен быть передан массив с cookies
.set()
this.cookies.set(host, path, name, value)
- установка одиночного cookie
this.query.add()
this.query.add(query, maxLvl)
Добавление нового запроса (query) с возможностью опционально указать максимальный уровень (maxLvl), аналогично tools.query.add() Можно передавать в качестве запроса (query) хэш с параметрами, работает аналогично Конструктору запросов
Пример:
this.query.add({
query: "http://site.com",
param1: "..",
...
});
this.proxy.*
Работа с прокси
.next()
Сменить прокси на следующий, старый прокси больше не будет использован для текущего запроса
.ban()
Сменить и забанить прокси (необходимо использовать когда сервис блокирует работу по IP), прокси будет забанен на время, указанное в настройках парсера(proxybannedcleanup
)
.get()
Получить текущий прокси (последний прокси с которым был сделан запрос)
.set()
this.proxy.set('http://127.0.0.1:8080', noChange = false)
- установить прокси для следующего запроса, параметр noChange необязательный, если задан true то прокси не будет меняться между попытками
yield this.captcha.*
Работа с каптчей
.recognize()
yield this.captcha.recognize(preset, image, type, overrides)
- загрузка каптчи для распознавания
image
- бинарные данные картинки для распознаванияpreset
- указывает на пресет для Util::AntiGatetype
указывается один из: 'jpeg', 'gif', 'png'
Результатом будет хэш с полями:
answer
- текст из картинкиid
- id каптчи, для возможности в дальнейшем сообщить об ошибке черезreportBad
error
- текстовая ошибка, если answer не задан
.recognizeFromUrl()
yield this.captcha.recognizeFromUrl(preset, url, overrides)
- аналогично предыдущему методу, но загрузка каптчи будет выполнятся автоматически по ссылке (url), без использования прокси
.reportBad()
yield this.captcha.reportBad(preset, id, overrides)
- сообщить сервису что каптча разгадана неверно
this.utils.*
.updateResultsData()
this.utils.updateResultsData(results, data)
- метод для автоматического заполнения $pages.$i.data и $data, необходимо вызывать для добавления контента результирующей страницы
.urlFromHTML()
this.utils.urlFromHTML(url, base)
- обрабатывает ссылку полученную из HTML кода - декодирует entities (& и т.п.), опционально можно передавать base - базовый урл (например урл исходной страницы), таким образом может быть получена полная ссылка
.url.extractDomain()
this.utils.url.extractDomain(url, removeDefaultSubdomain)
- метод принимает в качестве первого параметра ссылку и возвращает домен из этой ссылки. Второй необязательный параметр определяет обрезать ли из домена субдомен www. По умолчанию 0 - то есть не обрезать.
.url.extractTopDomain()
this.utils.url.extractTopDomain(url)
- метод принимает в качестве первого параметра ссылку и возвращает домен из этой ссылки, без субдоменов.
.url.extractTopDomainByZone()
this.utils.url.extractTopDomainByZone(url)
- метод принимает в качестве первого параметра ссылку и возвращает домен из этой ссылки, без субдоменов в том числе. Работает cо всеми региональными зонами
.url.extractMaxPath()
this.utils.url.extractMaxPath(url)
- метод принимает строку и выбирает из нее урл
.url.extractWOParams()
this.utils.url.extractWOParams(url)
- метод принимает ссылку и возвращает эту же ссылку обрезанную до строки параметров. То есть вернет урл до ?
.removeHtml()
this.utils.removeHtml(string)
- метод принимает строку и возвращает её очищенной
от html тегов
.removeNoDigit()
this.utils.removeNoDigit(string)
- метод принимает строку, удаляет из неё все кроме цифр и возвращает результат
.removeComma()
this.utils.removeComma(string)
- метод принимает строку, удаляет из неё такие символы как .,\r\n и возвращает результат
this.sessionManager.*
Для использования сессий в JS парсере сначала нужно инициализировать Менеджер сессий. Делается это с помощью функции init()
init() {
this.sessionManager.init({
//здесь можно задать дополнительные параметры
});
}
В this.sessionManager.init()
можно использовать следующие параметры:
name
- необязательный параметр, позволяет переопределить имя парсера, которому принадлежат сессии, по-умолчанию равно имени парсера, в котором происходит инициализацияcanChangeProxy
- необязательный параметр, возможность менять прокси, по-умолчанию равно 1domain
- необязательный параметр, указывает искать сессии среди всех сохраненных для этого парсера (если значение не задано), или же только для конкретного домена (необходимо указывать домен с точкой спереди, например.site.com
)
Для работы с сессиями существует несколько функций:
.get()
this.sessionManager.get()
- получает новую сессию, необходимо вызывать перед осуществлением запроса
.reset()
this.sessionManager.reset()
- очистка куков и получение новой сессии. Необходимо вызывать, если с текущей сессией запрос не был удачным.
.save()
this.sessionManager.save()
- сохранение удачной сессии либо сохранение произвольных данных в сессии
results.<array>.addElement()
Метод results.<array>.addElement()
позволяет более удобно заполнять массивы в results. При его использовании не нужно помнить последовательность переменных в массиве и перечислять их вручную.
results.serp.addElement({
link: 'https://google.com',
anchor: 'Google',
snippet: 'Loreps ipsum...',
});
Методы init()
и destroy()
Метод init()
вызывается при старте задания, destroy()
- при завершении.
Пример использования:
const puppeteer = require("puppeteer");
let globalBrowser;
class Parser {
constructor() {
...
}
async init() {
globalBrowser = await puppeteer.launch();
};
async destroy() {
if(globalBrowser)
await globalBrowser.close();
}
}
Полезные ссылки
🔗 Пример сохранения файла на диск
Пример, демонстрирующий способ сохранения файлов напрямую на диск
🔗 Пример работы с сессиями
Использование функционала сессий в JavaScript парсерах
🔗 Пример сохранения данных в сессии
Демонстрация возможности хранить произвольные данные в сессии
🔗 Использование results.addElement()
Пример заполнения массива данных с помощью results.addElement() и демонстрация отличия от обычного .push()