Обход сайта с относительными ссылками
При обходе веб-сайта вы можете столкнуться с различными типами ссылок, которые нужно обработать.
Для удобного обхода таких ссылок мы предоставляем метод enqueueLinks()
в контексте краулера, который
автоматически находит ссылки и добавляет их в RequestQueue
.
Мы предлагаем 3 стратегии обхода относительных ссылок:
All (или строка"all" ) - добавляет в очередь все найденные ссылки, независимо от домена.SameHostname (или строка"same-hostname" ) - добавляет в очередь ссылки с тем же хостом. Это стратегия по умолчанию.SameDomain (или строка"same-domain" ) - добавляет в очередь ссылки с тем же доменным именем, включая ссылки с поддоменов.
В этих примерах мы используем CheerioCrawler
, однако
тот же метод доступен для PuppeteerCrawler
и PlaywrightCrawler
, и используется
точно так же.
- Все ссылки
- Тот же хост
- Тот же поддомен
Эта стратегия обрабатывает любые найденные URL, даже если они ведут на другие сайты.
import { CheerioCrawler, EnqueueStrategy } from 'crawlee';
const crawler = new CheerioCrawler({
maxRequestsPerCrawl: 10, // Ограничение для только 10 запросов (не используйте, если хотите краулить все ссылки)
async requestHandler({ request, enqueueLinks, log }) {
log.info(request.url);
await enqueueLinks({
// Установка стратегии в 'all' добавит все найденные ссылки
strategy: EnqueueStrategy.All,
// Альтернативно вы можете передать строку 'all'
// strategy: 'all',
});
},
});
// Запускаем краулер с начальным запросом
await crawler.run(['https://crawlee.dev']);
Для URL вида https://example.com
, enqueueLinks()
будет обрабатывать относительные ссылки и ссылки,
указывающие на тот же хост.
Это стратегия по умолчанию при вызове
enqueueLinks()
, поэтому её не нужно указывать явно.
Например, ссылки вида https://example.com/some/path
, /absolute/example
или ./relative/example
будут обработаны.
А ссылки на поддомены, например https://subdomain.example.com/some/path
, обработаны не будут.
import { CheerioCrawler, EnqueueStrategy } from 'crawlee';
const crawler = new CheerioCrawler({
maxRequestsPerCrawl: 10, // Ограничение для только 10 запросов (не используйте, если хотите краулить все ссылки)
async requestHandler({ request, enqueueLinks, log }) {
log.info(request.url);
await enqueueLinks({
// Установка стратегии в 'same-hostname' добавит все найденные ссылки, которые находятся на том же хосте (включая поддомен) как request.loadedUrl или request.url
strategy: EnqueueStrategy.SameHostname,
// Альтернативно вы можете передать строку 'same-hostname'
// strategy: 'same-hostname',
});
},
});
// Запускаем краулер с начальным запросом
await crawler.run(['https://crawlee.dev']);
Для URL вида https://subdomain.example.com
, enqueueLinks()
будет обрабатывать относительные ссылки или ссылки,
указывающие на то же доменное имя, независимо от поддомена.
Например, будут обработаны ссылки вида https://subdomain.example.com/some/path
, /absolute/example
или ./relative/example
,
а также ссылки на другие поддомены или основной домен, например https://other-subdomain.example.com
или https://example.com
.
import { CheerioCrawler, EnqueueStrategy } from 'crawlee';
const crawler = new CheerioCrawler({
maxRequestsPerCrawl: 10, // Ограничение для только 10 запросов (не используйте, если хотите краулить все ссылки)
async requestHandler({ request, enqueueLinks, log }) {
log.info(request.url);
await enqueueLinks({
// Установка стратегии в 'same-domain' добавит все найденные ссылки, которые находятся на том же хосте, что и request.loadedUrl или request.url
strategy: EnqueueStrategy.SameDomain,
// Альтернативно вы можете передать строку 'same-domain'
// strategy: 'same-domain',
});
},
});
// Запускаем краулер с начальным запросом
await crawler.run(['https://crawlee.dev']);