Got Scraping
Введение
При использовании BasicCrawler
нам необходимо отправлять запросы вручную. Для этого мы можем использовать контекстно-зависимую функцию sendRequest()
:
import { BasicCrawler } from 'crawlee';
const crawler = new BasicCrawler({
async requestHandler({ sendRequest, log }) {
const res = await sendRequest();
log.info('получено тело ответа', res.body);
},
});
Внутри используется got-scraping
.
Got Scraping - это расширение Got, разработанное для имитации запросов браузера, что значительно повышает шансы успешного доступа к веб-странице без блокировки.
API функции sendRequest
async sendRequest(overrideOptions?: GotOptionsInit) => {
return gotScraping({
url: request.url,
method: request.method,
body: request.payload,
headers: request.headers,
proxyUrl: crawlingContext.proxyInfo?.url,
sessionToken: session,
responseType: 'text',
...overrideOptions,
retry: {
limit: 0,
...overrideOptions?.retry,
},
cookieJar: {
getCookieString: (url: string) => session!.getCookieString(url),
setCookie: (rawCookie: string, url: string) => session!.setCookie(rawCookie, url),
...overrideOptions?.cookieJar,
},
});
}
url
По умолчанию это URL текущей задачи. При необходимости его можно переопределить, используя string
или экземпляр URL
.
Подробнее в документации Got.
method
По умолчанию это HTTP-метод текущей задачи. Возможные значения: 'GET', 'POST', 'HEAD', 'PUT', 'PATCH', 'DELETE'
.
Подробнее в документации Got.
body
По умолчанию это полезная нагрузка HTTP текущей задачи.
Подробнее в документации Got.
headers
По умолчанию это HTTP-заголовки текущей задачи. Представляет собой объект со значениями типа string
.
Подробнее в документации Got.
proxyUrl
Строка, представляющая прокси-сервер в формате protocol://username:password@hostname:port
.
Например, прокси-сервер Apify выглядит так: http://auto:[email protected]:8000
.
BasicCrawler не имеет встроенной концепции сессии или прокси, поэтому нам нужно вручную передавать параметр proxyUrl
:
import { BasicCrawler } from 'crawlee';
const crawler = new BasicCrawler({
async requestHandler({ sendRequest, log }) {
const res = await sendRequest({
proxyUrl: 'http://auto:[email protected]:8000',
});
log.info('получено тело ответа', res.body);
},
});
Прокси используются для скрытия нашего реального IP-адреса.
Подробнее в документации Got Scraping.
sessionToken
Непримитивный объект, используемый как ключ при генерации отпечатка браузера. Отпечатки с одинаковым токеном не меняются.
Это можно использовать для сохранения заголовка user-agent
при использовании одной и той же сессии Apify.
Подробнее в документации Got Scraping.
responseType
Этот параметр определяет, как должен быть обработан ответ.
По умолчанию мы получаем HTML-сайты - это обычный текст. Поэтому responseType
установлен как 'text'
. Также возможна работа с JSON:
import { BasicCrawler } from 'crawlee';
const crawler = new BasicCrawler({
async requestHandler({ sendRequest, log }) {
const res = await sendRequest({ responseType: 'json' });
log.info('получено тело ответа', res.body);
},
});
Подробнее в документации Got.
cookieJar
Got
использует cookieJar
для управления куки. Это объект с интерфейсом пакета tough-cookie
.
Пример:
import { BasicCrawler } from 'crawlee';
import { CookieJar } from 'tough-cookie';
const cookieJar = new CookieJar();
const crawler = new BasicCrawler({
async requestHandler({ sendRequest, log }) {
const res = await sendRequest({ cookieJar });
log.info('получено тело ответа', res.body);
},
});
Подробнее в:
retry.limit
Этот параметр определяет максимальное количество повторных попыток Got
.
По умолчанию retry.limit
установлен на 0
. Это связано с тем, что Crawlee имеет собственную (достаточно сложную) систему управления повторными попытками.
Мы рекомендуем НЕ менять это значение для обеспечения стабильности.
useHeaderGenerator
Логический параметр, определяющий, генерировать ли заголовки браузера. По умолчанию установлен в true
, и мы рекомендуем оставить его включенным для лучших результатов.
headerGeneratorOptions
Этот параметр представляет объект с настройками генерации отпечатка браузера. Пример:
import { BasicCrawler } from 'crawlee';
const crawler = new BasicCrawler({
async requestHandler({ sendRequest, log }) {
const res = await sendRequest({
headerGeneratorOptions: {
devices: ['mobile', 'desktop'],
locales: ['en-US'],
operatingSystems: ['windows', 'macos', 'android', 'ios'],
browsers: ['chrome', 'edge', 'firefox', 'safari'],
},
});
log.info('получено тело ответа', res.body);
},
});
Подробнее в документации HeaderGeneratorOptions
.
Полезные ссылки