Что такое Apify и зачем он нужен для парсинга?
Apify — это облачная платформа для автоматизации задач в интернете, включая веб-скрейпинг, автоматизацию рабочих процессов и интеграцию данных. Она предоставляет инструменты и инфраструктуру для сбора данных с веб-сайтов, их обработки и хранения. Для парсинга поисковой выдачи Google, Apify предлагает готовые решения и SDK, позволяющие извлекать структурированные данные, такие как заголовки, описания, URL-адреса и дополнительные элементы (например, расширенные сниппеты, блоки «Люди также спрашивают» и т.д.). Использование Apify упрощает процесс парсинга, избавляя от необходимости самостоятельно разрабатывать сложные алгоритмы обхода блокировок и обработки данных.
Обзор Apify SDK и Apify Cloud
- Apify SDK — это набор библиотек и инструментов, предназначенных для создания веб-скрейперов и автоматизированных задач на Node.js и Python. SDK предоставляет удобные функции для управления запросами, обработки страниц, хранения данных и масштабирования.
- Apify Cloud — это облачная платформа, на которой можно запускать и управлять скрейперами, разработанными с использованием Apify SDK. Apify Cloud обеспечивает инфраструктуру, необходимую для масштабирования парсинга, мониторинга производительности и автоматического повторного запуска задач в случае сбоев.
Преимущества использования Apify для парсинга Google
- Простота разработки: Apify SDK предоставляет удобные инструменты для создания скрейперов, даже для пользователей с небольшим опытом программирования.
- Масштабируемость: Apify Cloud позволяет легко масштабировать парсинг, обрабатывая большие объемы данных без необходимости управления инфраструктурой.
- Надежность: Apify Cloud обеспечивает мониторинг и автоматический перезапуск задач, гарантируя стабильную работу скрейпера.
- Обход блокировок: Apify предоставляет инструменты для обхода блокировок Google, такие как использование прокси и эмуляция поведения пользователя.
- Готовые решения: Apify предлагает готовые акторы (скрипты) для парсинга поисковой выдачи Google, которые можно использовать без необходимости написания кода.
Настройка Apify аккаунта и установка необходимых инструментов
Регистрация и настройка аккаунта Apify
Для начала работы с Apify необходимо зарегистрироваться на сайте apify.com. После регистрации необходимо создать новый проект (Actor) в Apify Console. В настройках аккаунта можно установить лимиты использования, настроить уведомления и управлять платежной информацией.
Установка Node.js и Apify CLI
Для разработки с использованием Apify SDK необходимо установить Node.js и npm (Node Package Manager). После установки Node.js нужно установить Apify CLI с помощью команды:
npm install -g apify-cli
Apify CLI позволяет создавать, запускать и развертывать акторы Apify из командной строки.
Создание нового проекта Apify для парсинга Google
С помощью Apify CLI можно создать новый проект Apify:
apify create google-search-scraper
cd google-search-scraper
Apify CLI предложит выбрать шаблон проекта. Для парсинга Google можно использовать шаблон «Basic actor».
Разработка парсера результатов поиска Google с помощью Apify SDK
Изучение структуры результатов поиска Google для парсинга
Прежде чем начать написание парсера, необходимо изучить структуру HTML-кода страницы результатов поиска Google. Необходимо определить CSS-селекторы, которые позволяют извлечь необходимые данные, такие как заголовки, описания, URL-адреса и другие элементы. Для этого можно использовать инструменты разработчика в браузере (например, Chrome DevTools).
Написание кода парсера с использованием Apify SDK (Node.js)
import { Actor, log } from 'apify';
import { CheerioCrawler } from 'apify';
interface Input {
searchQueries: string[];
maxPagesToCrawl: number;
}
interface Output {
title: string;
link: string;
snippet: string;
}
// Функция для парсинга результатов поиска на одной странице
async function parseSearchResults(context: any): Promise<Output[]> {
const { $, request } = context;
log.info(`Парсинг страницы: ${request.url}`);
const results: Output[] = [];
$('.g').each((index: number, element: any) => {
const el = $(element);
const title = el.find('h3').text();
const link = el.find('a').attr('href');
const snippet = el.find('.IsZvec').text();
if (title && link && snippet) {
results.push({
title,
link,
snippet,
});
}
});
return results;
}
Actor.main(async () => {
const input = await Actor.getInput() as Input;
if (!input) {
throw new Error('Необходимо указать входные данные!');
}
const { searchQueries, maxPagesToCrawl = 1 } = input;
const crawler = new CheerioCrawler({
requestQueue: await Actor.openRequestQueue(),
maxRequestsPerCrawl: maxPagesToCrawl * searchQueries.length, // Adjust as needed
// Функция для обработки каждой страницы
async requestHandler(context) {
const { request, enqueueLinks } = context;
const parsedResults = await parseSearchResults(context);
log.info(`Найдено ${parsedResults.length} результатов на странице: ${request.url}`);
await Actor.pushData(parsedResults);
// Пагинация (только для примера, требует адаптации под структуру Google)
// await enqueueLinks({
// selector: 'a.pn', // Селектор для кнопки "Следующая страница"
// strategy: 'same-domain',
// requestQueue: await Actor.openRequestQueue(), // Ensure the requestQueue is passed
// });
},
});
// Добавление поисковых запросов в очередь
for (const query of searchQueries) {
const encodedQuery = encodeURIComponent(query);
await crawler.addRequests([
`https://www.google.com/search?q=${encodedQuery}`,
]);
}
log.info('Запуск парсера...');
await crawler.run();
log.info('Парсинг завершен.');
});
Обработка пагинации и извлечение данных со всех страниц
Для обработки пагинации необходимо определить CSS-селектор для кнопки «Следующая страница» и использовать функцию enqueueLinks
для добавления новых URL-адресов в очередь запросов. В примере кода выше показано закомментированное решение. Важно помнить, что структура пагинации Google может меняться, поэтому необходимо адаптировать селектор под текущую структуру страницы.
Сохранение результатов парсинга в формате JSON или CSV
Apify автоматически сохраняет результаты парсинга в формате JSON. Результаты можно просмотреть и скачать из Apify Console. Для сохранения результатов в формате CSV можно использовать библиотеку json2csv
.
Запуск и масштабирование парсера в Apify Cloud
Развертывание парсера в Apify Cloud
Для развертывания парсера в Apify Cloud необходимо выполнить команду apify push
в каталоге проекта. Эта команда загрузит код парсера в Apify Cloud и создаст новый актор.
Настройка расписания запусков парсера
В Apify Console можно настроить расписание запусков парсера. Это позволяет автоматически запускать парсер с заданной периодичностью (например, каждый день или каждую неделю).
Мониторинг и управление ресурсами Apify Cloud
Apify Cloud предоставляет инструменты для мониторинга производительности парсера, такие как использование памяти, время выполнения и количество обработанных страниц. Также можно управлять ресурсами, выделенными для парсера, такими как объем памяти и количество параллельных запросов.
Масштабирование парсера для обработки больших объемов данных
Для обработки больших объемов данных можно увеличить количество параллельных запросов, выделенных для парсера. Также можно использовать несколько акторов для параллельного парсинга различных частей данных.
Продвинутые техники парсинга и обход блокировок Google
Использование прокси для обхода блокировок IP-адресов
Google может блокировать IP-адреса, с которых исходит большое количество запросов. Для обхода блокировок можно использовать прокси-серверы. Apify предлагает встроенную поддержку прокси-серверов.
Эмуляция пользовательского поведения для предотвращения блокировок
Для предотвращения блокировок можно эмулировать пользовательское поведение, например, устанавливать случайные задержки между запросами и использовать пользовательские агенты браузеров.
Обработка CAPTCHA с помощью сторонних сервисов
Если Google требует ввести CAPTCHA, можно использовать сторонние сервисы для автоматического распознавания и решения CAPTCHA.
Оптимизация парсера для повышения скорости и эффективности
Для повышения скорости и эффективности парсера можно оптимизировать код, использовать кеширование и уменьшить количество запросов к серверу.