Веб-скрейпинг с помощью Crawlee – пошаговое руководство

Узнайте, как использовать Crawlee для эффективного веб-скрейпинга с помощью Node.js, охватывая все: от базовой настройки до расширенной ротации прокси-серверов и динамической обработки контента.
5 min read
Web Scraping With Crawlee blog image

Если вы заинтересованы в веб-скрейпинге, 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 (Проверить элемент):

Проверьте элемент HTML

Вкладка Elements (Элементы) должна быть активна по умолчанию, и эта вкладка представляет собой HTML-макет веб-страницы. В этом примере каждая отображаемая книга помещается в HTML-тег статьи с классом product_pod. В каждой статье название книги содержится в теге h3 . Фактическое название книги содержится в атрибуте title тега a , расположенном в элементе h3 . Стоимость книги указана внутри тега p с классом price_color:

Изучите элементы HTML на сайте Books to Scrape

В корневом каталоге проекта создайте файл с именем 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, перейдите в раздел «Прокси-серверы и инфраструктура скрейпинга» и добавьте новый прокси-сервер, выбрав «Резидентные прокси-серверы»:

Добавьте резидентный прокси-сервер

Сохраните настройки по умолчанию и завершите создание вашего резидентного прокси-сервера, нажав «Добавить».

Если вас попросят установить сертификат, вы можете выбрать «Продолжить без сертификата». Однако для производственных и реальных случаев использования сертификат следует настроить таким образом, чтобы предотвратить несанкционированное использование, если информация о вашем прокси-сервере когда-либо будет раскрыта.

После создания запишите учетные данные прокси-сервера, включая хост, порт, имя пользователя и пароль. Они понадобятся вам на следующем этапе:

Учетные данные прокси-сервера 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/"]);

Примечание: обязательно замените HOSTPORTUSERNAMEи 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, предлагающую готовые к использованию наборы данных и расширенные прокси-сервисы для оптимизации сбора данных.

Зарегистрируйтесь сейчас и начните бесплатное опробование!

Кредитная карта не требуется