Если вы заинтересованы в веб-скрейпинге, Crawlee может вам помочь. Это быстрый интерактивный механизм очистки, используемый специалистами по обработке данных, разработчиками и исследователями для сбора веб-данных. Crawlee прост в настройке и предлагает такие функции, как ротация прокси-серверов и обработка сеансов. Эти функции крайне важны для скрейпинга больших или динамических веб-сайтов без блокировки вашего IP-адреса, обеспечивая беспрепятственный и бесперебойный сбор данных.
Из этого руководства вы узнаете, как использовать Crawlee для веб-скрейпинга. Вы начнете с простого примера веб-скрейпинга и перейдете к более продвинутым концепциям, таким как управление сеансами и очистка динамических страниц.
Как выполнять веб-скрейпинг с помощью Crawlee
Прежде чем приступить к изучению этого руководства, убедитесь, что на вашем компьютере установлены следующие компоненты:
- Node.js.
- npm: обычно поставляется с приложением Node.js. Вы можете проверить установку, запустив
node -v
илиnpm -v
в своем терминале. - Редактор кода по вашему выбору: в этом руководстве используется Visual Studio Code.
Базовый парсинг веб-страниц с помощью Crawlee
После того, как вы установите все необходимые компоненты, давайте начнем со скрейпинга сайта Books to Scrape , который идеально подходит для обучения, поскольку имеет простую структуру HTML.
Откройте терминал или оболочку и начните с инициализации проекта Node.js с помощью следующих команд:
mkdir crawlee-tutorial
cd crawlee-tutorial
npm init -y
Затем установите библиотеку Crawlee с помощью следующей команды:
npm install crawlee
Чтобы эффективно выполнять скрейпинг данных с любого сайта, вам необходимо проверить веб-страницу, скрейпинг которой вы хотите выполнить, чтобы получить подробную информацию о HTML-тегах сайта. Для этого откройте сайт в браузере и перейдите в раздел Developer Tools (Инструменты разработчика) , щелкнув правой кнопкой мыши в любом месте веб-страницы. Затем нажмите Inspect (Проверить) или Inspect Element (Проверить элемент):
Вкладка Elements (Элементы) должна быть активна по умолчанию, и эта вкладка представляет собой HTML-макет веб-страницы. В этом примере каждая отображаемая книга помещается в HTML-тег статьи
с классом product_pod
. В каждой статье название книги содержится в теге h3
. Фактическое название книги содержится в атрибуте title
тега a
, расположенном в элементе h3
. Стоимость книги указана внутри тега p
с классом price_color
:
В корневом каталоге проекта создайте файл с именем scrape.js
и добавьте следующий код:
const { CheerioCrawler } = require('crawlee');
const crawler = new CheerioCrawler({
async requestHandler({ request, $ }) {
const books = [];
$('article.product_pod').each((index, element) => {
const title = $(element).find('h3 a').attr('title');
const price = $(element).find('.price_color').text();
books.push({ title, price });
});
console.log(books);
},
});
crawler.run(['https://books.toscrape.com/']);
В этом коде вы используете CheerioCrawler
из crawlee
для скрейпинга названий книг и цен с сайта https://books.toscrape.com/
. Сканер индексирует HTML-контент, извлекает данные из элементов <article class="product_pod">
, используя синтаксис, подобный jQuery, и записывает результаты в консоль.
После добавления предыдущего кода в файл scrape.js
его можно запустить с помощью следующей команды:
node scrape.js
На вашем терминале должен быть распечатан массив названий книг и цен:
…output omitted…
{
title: 'The Boys in the Boat: Nine Americans and Their Epic Quest for Gold at the 1936 Berlin Olympics',
price: '£22.60'
},
{ title: 'The Black Maria', price: '£52.15' },
{
title: 'Starving Hearts (Triangular Trade Trilogy, #1)',
price: '£13.99'
},
{ title: "Shakespeare's Sonnets", price: '£20.66' },
{ title: 'Set Me Free', price: '£17.46' },
{
title: "Scott Pilgrim's Precious Little Life (Scott Pilgrim #1)",
price: '£52.29'
},
…output omitted…
Ротация прокси-серверов с помощью Crawlee
Прокси-сервер — это посредник между вашим компьютером и Интернетом. Когда вы используете прокси, он отправляет ваши веб-запросы на прокси-сервер, который перенаправляет их на целевой сайт. Прокси-сервер отправляет ответ с сайта, а прокси скрывает ваш IP-адрес и предотвращает ограничение скорости или блокировку IP-адресов.
Crawlee упрощает внедрение прокси, поскольку имеет встроенную функцию обработки прокси, которая эффективно обрабатывает повторные попытки и ошибки. Crawlee также поддерживает ряд конфигураций прокси-серверов для реализации ротационных прокси.
В следующем разделе вы настроите прокси-сервер, сначала получив действительный прокси-сервер. Затем вы убедитесь, что ваши запросы проходят через прокси-серверы.
Настройка прокси-сервера
Бесплатные прокси-серверы обычно не рекомендуются, поскольку они могут работать медленно и небезопасно, а также могут не обеспечивать необходимую поддержку конфиденциальных веб-задач. Вместо этого попробуйте использовать Bright Data, безопасный, стабильный и надежный прокси-сервис. Он также предлагает бесплатные пробные версии, так что вы можете протестировать его перед покупкой.
Чтобы использовать Bright Data, нажмите кнопку Начать бесплатное пробное использование на главной странице и введите необходимую информацию для создания учетной записи.
После создания учетной записи войдите в панель управления Bright Data, перейдите в раздел «Прокси-серверы и инфраструктура скрейпинга» и добавьте новый прокси-сервер, выбрав «Резидентные прокси-серверы»:
Сохраните настройки по умолчанию и завершите создание вашего резидентного прокси-сервера, нажав «Добавить».
Если вас попросят установить сертификат, вы можете выбрать «Продолжить без сертификата». Однако для производственных и реальных случаев использования сертификат следует настроить таким образом, чтобы предотвратить несанкционированное использование, если информация о вашем прокси-сервере когда-либо будет раскрыта.
После создания запишите учетные данные прокси-сервера, включая хост, порт, имя пользователя и пароль. Они понадобятся вам на следующем этапе:
В корневом каталоге проекта выполните следующую команду для установки библиотеки axios :
npm install axios
Вы используете библиотеку axios для запроса GET на http://lumtest.com/myip.json
, который возвращает сведения об используемом прокси-сервере при каждом запуске скрипта.
Затем в корневом каталоге проекта создайте файл с именем scrapeWithProxy.js
и добавьте следующий код:
const { CheerioCrawler } = require("crawlee");
const { ProxyConfiguration } = require("crawlee");
const axios = require("axios");
const proxyConfiguration = new ProxyConfiguration({
proxyUrls: ["http://USERNAME:PASSWORD@HOST:PORT"],
});
const crawler = new CheerioCrawler({
proxyConfiguration,
async requestHandler({ request, $, response, proxies }) {
// Make a GET request to the proxy information URL
try {
const proxyInfo = await axios.get("http://lumtest.com/myip.json", {
proxy: {
host: "HOST",
port: PORT,
auth: {
username: "USERNAME",
password: "PASSWORD",
},
},
});
console.log("Proxy Information:", proxyInfo.data);
} catch (error) {
console.error("Error fetching proxy information:", error.message);
}
const books = [];
$("article.product_pod").each((index, element) => {
const title = $(element).find("h3 a").attr("title");
const price = $(element).find(".price_color").text();
books.push({ title, price });
});
console.log(books);
},
});
crawler.run(["https://books.toscrape.com/"]);
Примечание: обязательно замените
HOST
,PORT
,USERNAME
иPASSWORD
своими учетными данными.
В этом коде вы используете CheerioCrawler
из Crawlee
для скрейпинга информации с сайта https://books.toscrape.com/
с помощью указанного прокси-сервера. Вы настраиваете прокси-сервер с помощью ProxyConfiguration
, затем извлекаете и регистрируете данные прокси-сервера с помощью запроса GET на адрес http://lumtest.com/myip.json
. Наконец, вы извлекаете названия книг и цены на них, используя синтаксис Cheerio, подобный jQuery, и записываете полученные в результате скрейпинга данные в консоль.
Теперь вы можете запустить и протестировать код, чтобы убедиться, что прокси-серверы работают:
node scrapeWithProxy.js
Результаты будут аналогичны предыдущим, но на этот раз ваши запросы маршрутизируются через прокси-серверы Bright Data. Вы также должны увидеть сведения о прокси-сервере, зарегистрированном в консоли:
Proxy Information: {
country: 'US',
asn: { asnum: 21928, org_name: 'T-MOBILE-AS21928' },
geo: {
city: 'El Paso',
region: 'TX',
region_name: 'Texas',
postal_code: '79925',
latitude: 31.7899,
longitude: -106.3658,
tz: 'America/Denver',
lum_city: 'elpaso',
lum_region: 'tx'
}
}
[
{ title: 'A Light in the Attic', price: '£51.77' },
{ title: 'Tipping the Velvet', price: '£53.74' },
{ title: 'Soumission', price: '£50.10' },
{ title: 'Sharp Objects', price: '£47.82' },
{ title: 'Sapiens: A Brief History of Humankind', price: '£54.23' },
{ title: 'The Requiem Red', price: '£22.65' },
…output omitted..
Если вы снова запустите скрипт с помощью node scrapingWithBrightData.js
, вы должны увидеть другое местоположение IP-адреса, используемого прокси-сервером Bright Data. Это подтверждает, что Bright Data меняет местоположения и IP-адреса при каждом запуске скрипта скрейпинга. Эта ротация важна для обхода блокировок или запретов на IP-адреса целевых сайтов.
Примечание: в
ProxyConfiguration
вы могли передавать разные IP-адреса прокси-серверов, но, поскольку Bright Data делает это за вас, вам не нужно указывать IP-адреса.
Управление сеансами с помощью Crawlee
Сеансы помогают поддерживать состояние нескольких запросов, что удобно для сайтов, использующих файлы cookie или сеансы входа в систему.
Для управления сеансом создайте файл с именем scrapeWithSessions.js
в корневом каталоге проекта и добавьте следующий код:
const { CheerioCrawler, SessionPool } = require("crawlee");
(async () => {
// Open a session pool
const sessionPool = await SessionPool.open();
// Ensure there is a session in the pool
let session = await sessionPool.getSession();
if (!session) {
session = await sessionPool.createSession();
}
const crawler = new CheerioCrawler({
useSessionPool: true, // Enable session pool
async requestHandler({ request, $, response, session }) {
// Log the session information
console.log(`Using session: ${session.id}`);
// Extract book data and log it (for demonstration)
const books = [];
$("article.product_pod").each((index, element) => {
const title = $(element).find("h3 a").attr("title");
const price = $(element).find(".price_color").text();
books.push({ title, price });
});
console.log(books);
},
});
// First run
await crawler.run(["https://books.toscrape.com/"]);
console.log("First run completed.");
// Second run
await crawler.run(["https://books.toscrape.com/"]);
console.log("Second run completed.");
})();
Здесь вы используете CheerioCrawler
и SessionPool
из Crawlee
для скрейпинга данных с сайта https://books.toscrape.com/
. Вы инициализируете пул сеансов, а затем настраиваете сканер для использования этого сеанса. Функция requestHandler
регистрирует информацию о сеансе и извлекает названия книг и цены с помощью селекторов Cheerio, похожих на jQuery. Код выполняет два последовательных запуска скрейпинга и регистрирует идентификатор сеанса при каждом запуске.
Запустите и протестируйте код, чтобы убедиться, что используются разные сеансы:
node scrapeWithSessions.js
Вы должны увидеть те же результаты, что и раньше, но на этот раз вы также должны видеть идентификатор сеанса для каждого запуска:
Using session: session_GmKuZ2TnVX
[
{ title: 'A Light in the Attic', price: '£51.77' },
{ title: 'Tipping the Velvet', price: '£53.74' },
…output omitted…
Using session: session_lNRxE89hXu
[
{ title: 'A Light in the Attic', price: '£51.77' },
{ title: 'Tipping the Velvet', price: '£53.74' },
…output omitted…
Если вы снова запустите код, вы увидите, что используется другой идентификатор сеанса.
Динамическая обработка контента с помощью Crawlee
Если вы имеете дело с динамическими сайтами (то есть сайтами с контентом, заполненным JavaScript), выполнение веб-скрейпинга может оказаться чрезвычайно сложной задачей, так как для доступа к данным требуется рендеринг JavaScript. Чтобы справиться с такими ситуациями, Crawlee интегрируется с Puppeteer, браузером без интерфейса, который может отображать JavaScript и взаимодействовать с целевым сайтом так же, как это делает человек.
Чтобы продемонстрировать эту функциональность, давайте соберем контент с этой страницы YouTube. Как всегда, прежде чем выполнять скрейпинг, обязательно ознакомьтесь с правилами и условиями обслуживания для этой страницы .
Ознакомившись с условиями обслуживания, создайте файл с именем scrapeDynamicContent.js
в корневом каталоге вашего проекта и добавьте следующий код:
const { PuppeteerCrawler } = require("crawlee");
async function scrapeYouTube() {
const crawler = new PuppeteerCrawler({
async requestHandler({ page, request, enqueueLinks, log }) {
const { url } = request;
await page.goto(url, { waitUntil: "networkidle2" });
// Scraping first 10 comments
const comments = await page.evaluate(() => {
return Array.from(document.querySelectorAll("#comments #content-text"))
.slice(0, 10)
.map((el) => el.innerText);
});
log.info(`Comments: ${comments.join("\n")}`);
},
launchContext: {
launchOptions: {
headless: true,
},
},
});
// Add the URL of the YouTube video you want to scrape
await crawler.run(["https://www.youtube.com/watch?v=wZ6cST5pexo"]);
}
scrapeYouTube();
Затем запустите код с помощью следующей команды:
node scrapeDynamicContent.js
В этом коде вы используете PuppeteerCrawler
из библиотеки Crawlee для скрейпинга комментариев к видео на YouTube. Сначала вы инициализируете сканер, который переходит по определенному URL-адресу видео на YouTube и ожидает полной загрузки страницы. После загрузки страницы код оценивает содержимое страницы и извлекает первые десять комментариев, выбирая элементы с помощью указанного селектора CSS #comments #content -text
. Затем комментарии регистрируются в консоли.
Результат должен содержать первые десять комментариев, относящихся к выбранному видео:
INFO PuppeteerCrawler: Starting the crawler.
INFO PuppeteerCrawler: Comments: Who are you rooting for?? US Marines or Ex Cons
Bro Mateo is a beast, no lifting straps, close stance.
ex convict doing the pushups is a monster.
I love how quick this video was, without nonsense talk and long intros or outros
"They Both have combat experience" is wicked
That military guy doing that deadlift is really no joke.. ...
One lives to fight and the other fights to live.
Finally something that would test the real outcome on which narrative is true on movies
I like the comradery between all of them. Especially on the Bench Press ... Both team members quickly helped out on the spotting to protect from injury. Well done.
I like this style, no youtube funny business. Just straight to the lifts
…output omitted…
Весь код, использованный в этом руководстве, можно найти на GitHub.
Заключение
Из этой статьи вы узнали, как использовать Crawlee для веб-скрейпинга, и увидели, как это может помочь повысить эффективность и надежность ваших проектов по веб-скрейпингу.
Выполняя скрейпинг данных, не забывайте всегда соблюдать условия, изложенные в файле robots.txt
целевого сайта, и условия обслуживания.
Готовы усовершенствовать свои проекты по веб-скрейпингу с помощью данных, инструментов и прокси-серверов профессионального уровня? Изучите комплексную платформу для веб-скрейпинга Bright Data, предлагающую готовые к использованию наборы данных и расширенные прокси-сервисы для оптимизации сбора данных.
Зарегистрируйтесь сейчас и начните бесплатное опробование!
Кредитная карта не требуется