Веб-парсинг с помощью Ajax: полное руководство

Автор:

Реакция

Комментарий

Скрапинг сайта, который использует AJAX является более сложным, чем обычный веб-скрейпинг. Контент не находится в HTML первоначальный: появляется задним числом, через JavaScript. Простой скрейпер, таким образом, ничего не видит, и для извлечения этих динамических данных необходимо применять соответствующий подход.

Принцип работы веб-скрейпинга на сайте, использующем AJAX для загрузки данных с помощью JavaScript
Принцип работы веб-скрейпинга на сайте, использующем AJAX. ©Christina для Alucare.fr

AJAX и веб-парсинг: в чём разница?

в скраппинг заключается в анализе кода HTML веб-страницы для автоматического извлечения из неё нужных данных. На статическом сайте это работает очень хорошо. Проблема возникает при работе с AJAX (для Asynchronous JavaScript and XML), технология, позволяющая загружать или обновлять контент без перезагрузки всей страницы.

Как работает AJAX?

Браузер (или браузер) отправляет небольшие асинхронные запросы на сервер, работающий в фоновом режиме. Сервер возвращает данные, как правило, в формате JSON. Затем страница отображает эту информацию на лету, без перезагрузки остальной части. Именно это делает Интернет более быстрым и интерактивным.

Схема работы AJAX, который загружает данные в фоновом режиме без перезагрузки всей веб-страницы
Принцип работы веб-скрейпинга на сайте, использующем AJAX. ©Christina для Alucare.fr

Почему скрапинг с использованием AJAX является более сложным?

Когда сайт использует AJAX, загруженный контент не отображается в исходный HTML-код. Он вводится задним числом с помощью JavaScript, после открытия страницы. Обычный скрейпер извлекает только статическое содержимое : значит, он не видит динамические данные добавлены позже.

Чтобы их извлечь, тебе понадобится инструмент, способный выполнять JavaScript. На практике преобладают три подхода:

  • Непосредственно воспроизвести AJAX-запросы, то есть звонки XHR которые загружают данные.
  • Управлять безголовый браузер в качестве Selenium Где Playwright, который обеспечивает визуализацию (или рендеринг) страницы, как в настоящем браузере.
  • Обратиться в API для скрапинга «все в одном».

Какие существуют методы и инструменты для скрапинга AJAX?

Способ 1: воспроизведение AJAX-запросов

Это самый эффективный способ для получать динамические данные. Вместо того, чтобы отображать всю страницу, ты перехватывают AJAX-запросы отправляются на сервер, а затем ты их напрямую воспроизводишь, чтобы получить исходные данные, часто в формате JSON.

Чтобы найти эти вызовы, откройте инструменты разработчика в браузере, а затем вкладку Сеть с фильтром XHR. Там ты увидишь точный URL-адрес конечной точки, а также заголовки и формат ответа.

Преимущества этой методики:

  • Очень быстрая и легкая, поскольку для этого не требуется полный рендеринг страницы.
  • Она обходит проблемы связанные с рендерингом JavaScript.

Его ограничения:

  • Более сложный в реализации чем браузер без графического интерфейса.
  • Она просит тщательный анализ запросы, заголовки и параметры. Некоторые сайты требуют указания токена или обязательных заголовков.

Что касается библиотек, у тебя есть выбор в зависимости от языка:

Библиотеки requests (Python) и axios (JavaScript) для воспроизведения AJAX-запросов
В Python и JavaScript доступны две библиотеки для выполнения AJAX-запросов: requests и axios. ©Christina для Alucare.fr

Способ 2: использование браузера без графического интерфейса

Это самый простой способ скребковать динамические страницы. Ты автоматизируешь работу настоящего веб-браузера без графического интерфейса. Он отображает страницу точно так же, как это сделал бы пользователь, выполняет JavaScript, запускает AJAX-запросы и отображает окончательное содержимое.

Преимущества :

  • Ты скребешь точно то, что видит пользователь, включая загруженный контент.
  • Это простой в реализации, даже на очень динамичном сайте.

Неудобства:

  • Это медленнее чем прямой запрос.
  • Это требующий больших ресурсов, так как ты запускаешь полнофункциональный браузер.

Наиболее часто используемые инструменты для данного подхода:

  • Selenium : универсальный инструмент с богатой историей и обширной документацией.
  • Playwright : современный, быстрый и поддерживающий различные браузеры.
  • Puppeteer : специализируется на Chrome а также Chromium.

Сравнение бесконсольных браузеров Puppeteer, Playwright и Selenium для скрапинга страниц с AJAX
Puppeteer, Playwright и Selenium автоматизируют работу браузера без графического интерфейса для сбора данных с динамических страниц. ©Christina для Alucare.fr

Ты можешь использовать браузер без графического интерфейса в сочетании с BeautifulSoup (модуль bs4) : браузер загружает страницу и обеспечивает рендеринг JavaScript, а затем ты парсировать HTML, сгенерированный с помощью библиотеки.

Способ 3: универсальные API для скрапинга

Некоторые платформы предлагают комплексные услуги по скрапингусреди бесплатные инструменты или платные ресурсы рынка. Среди них можно назвать Bright Data, ZenRows, ScrapingBee Где Crawlbase. Они автоматически управляют Рендеринг JavaScript, их прокси иизвлечение данных : ты отправляешь URL, а они возвращают тебе готовый контент.

Преимущества :

  • Простые и надежные, даже в крупных масштабах.
  • С твоей стороны не требуется никакого управления инфраструктурой или прокси-серверами.

Неудобства:

  • в стоимость может быть высокой в зависимости от объема.
  • У тебя есть меньший контроль о процессе.

Интерфейс Bright Data — универсальный API для скрапинга сайтов, использующих AJAX
Bright Data — это универсальный API для скрапинга, который поддерживает рендеринг JavaScript и прокси. ©Christina для Alucare.fr

Как сканировать сайт с помощью AJAX?

Вот как на практике можно скопировать данные с сайта, который загружает свои статьи через AJAX, с двумя примерами кода на языке Python : один с requests, один с безголовый браузер.

1. Определение AJAX-запросов в инструментах разработчика

Контент, загруженный с помощью AJAX, отсутствует в Исходный HTML-код. Поэтому необходимо определить сетевой вызов, который запрашивает данные.

  • Открой их инструменты разработки в браузере (клавиша F12 или щелкните правой кнопкой мыши и выберите “Просмотреть”).
  • Перейди на вкладку Сеть (Network) затем обновите страницу.
  • Смотри на них запросы, инициированные сайтом, включая те, которые занимаются загрузкой товаров.
  • Фильтр по запросам типа XHR Где fetch : именно они осуществляют сбор данных в фоновом режиме.

Нажми на нужный запрос, чтобы увидеть его URL, его заголовки и его ответ. Чаще всего ответ имеет формат JSON, иногда в формате HTML.

2. Выбрать метод скрейпинга

Как только AJAX-запрос будет обнаружен, у тебя появится два варианта.

  • Повторить запрос : ты напрямую воспроизводишь вызов на Python с помощью библиотеки requests. Ты получаешь необработанные данные в JSON или в формате HTML, без использования браузера. Это самый быстрый способ.
  • Безграфический браузер : если сайт требует выполнения JavaScript или сложных взаимодействий (клик, прокрутка), вы используете Selenium Где Playwright. Инструмент загружает страницу так же, как это сделал бы реальный пользователь.

3. Воспроизвести AJAX-запрос с помощью requests

Ниже приведен базовый код для повторного воспроизведения вызова, указанного на вкладке «Сеть».

импорт запросов

# URL-адрес AJAX-запроса, определённый в инструментах разработчика
url = 'https://example.com/ajax-endpoint'

# Параметры запроса (подгонять под наблюдаемые данные)
params = {
    'page': 1,
    'category': 'technology'
}

# Заголовки, которые нужно скопировать из вкладки 'Сеть' (User-Agent, Referer, token...)
headers = {
    'User-Agent': 'Mozilla/5.0',
    'X-Requested-With': "XMLHttpRequest"
}

# Отправка запроса GET
response = requests.get(url, params=params, headers=headers)

# Проверка статуса ответа
if response.status_code == 200:
    data = response.json()
    print(data)
else:
    print(f"Ошибка {response.status_code}")

Подробная информация по каждой строке:

  • import requests : загружает библиотеку, которая отправляет HTTP-запросы.
  • url : замените этот адрес на конечную точку AJAX, указанную в вкладка «Сеть».
  • headers : копирует заголовки, отображаемые на вкладке «Сеть». Некоторые сайты требуют User-Agent, а Referer или токен CSRF чтобы удовлетворить запрос.
  • А статус 200 означает, что запрос выполнен успешно.
  • response.json() преобразует ответ в формате JSON в словарь Python.
  • print(data) : отображает извлеченные данные (список товаров, цены и т. д.).
  • else : отображает код ошибки в случае сбоя вызова (например, 403 Где 404).

4. Сбор данных с помощью браузера без пользовательского интерфейса (Selenium + BeautifulSoup)

Когда воспроизведение запроса оказывается недостаточным, браузер бездисплейный выполняет JavaScript за тебя. Затем ты получаешь сгенерированный HTML-код, после чего парсировать с BeautifulSoup (модуль bs4).

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup
import time

# Запуск Chrome в режиме headless (без графического интерфейса)
options = Options()
options.add_argument("--headless")
driver = webdriver.Chrome(options=options)

# Открыть страницу, которая загружает содержимое через AJAX
driver.get("https://example.com")

# Подождать, пока JavaScript загрузит данные
time.sleep(3)

# Проанализировать отображаемый HTML с помощью BeautifulSoup
soup = BeautifulSoup(driver.page_source, "html.parser")
articles = soup.find_all("div", class_="article")

for article in articles:
    print(article.get_text())

driver.quit()

Вот, Selenium настоящий пилот Chrome который обеспечивает рендеринг на странице, и driver.page_source возвращает HTML-код после загрузки содержимого AJAX. Playwright а также Puppeteer работают по одному и тому же принципу, но с разным синтаксисом.

5. Извлечь данные из JSON или сгенерированного HTML-кода

После получения ответа выделяешь нужную информацию в зависимости от её формата.

  • Ответ в формате JSON : использует response.json() чтобы получить словарь Python, а затем обращается к значениям по их ключам.
  • Ответ в формате HTML : проходит через BeautifulSoup (модуль bs4) с find Где select для выделения элементов по их классу или идентификатору.

Какой метод AJAX-скрейпинга выбрать?

У каждого подхода есть свои преимущества в зависимости от твоего уровня и поставленной задачи. Вот краткое сравнение.

Метод Скорость Сложность Расходы Лучше всего подходит для…
Воспроизведение запроса Очень быстро Высокий Слабый Масштабный скрейпинг, структурированные данные
Безграфический браузер Медленная Иметь в виду Слабый Сложные сайты, срочные проекты, начинающие
API для скрапинга Быстро Очень низкий Высокий Критически важные проекты, не требующие обслуживания инфраструктуры

На практике: начните с воспроизведение запроса если AJAX-конечная точка возвращает корректный JSON. Переходи к безголовый браузер как только JavaScript становится незаменимым.

Каковы проблемы скрапинга AJAX и их решения?

Скрапинг сайта с помощью AJAX создает проблемы, с которыми не сталкивается традиционный скрейпинг. Ниже приведены основные сложности и, что особенно важно, способы их преодоления.

Задача 1: контент, который на первый взгляд незаметен

Когда ты загружаешь страницу с помощью AJAX, Исходный HTML-код часто бывает пустым : данные поступают только после выполнения JavaScript. Решением является использование браузера без графического интерфейса, такого как Selenium, Playwright Где Puppeteer, который обеспечивает рендеринг полностью загрузить страницу, прежде чем читать её содержание.

Задача 2: простые запросы, которые завершаются сбоем

Не всегда достаточно просто повторить AJAX-вызов. Многие сайты защищают свой API, и твой запрос может вернуть ошибка 403 в то время как браузер, в свою очередь, получает ответ без проблем. В твоём запросе отсутствует часть информации. На практике часто требуется:

  • Скопировать headers обязательные отображаются на вкладке «Network» (например, User-Agent Где Referer).
  • Добавить токен CSRF или сессионные файлы cookie, если этого требует сервер.
  • Проверьте код состояния из ответа, чтобы быстро определить, в чём проблема.

Задача 3: управление сроками погрузки

Данные, загруженные с помощью AJAX, могут появляться с задержкой. Если скрейпер прочитывает страницу слишком рано, он ничего не найдет. В зависимости от ситуации можно использовать два подхода:

  • А фиксированная пауза (один sleep (в секундах) перед просмотром страницы. Просто, но ненадежно.
  • А условное ожидание, гораздо чище, через ожидает из Selenium : л’неявное ожидание автоматически ожидает, пока элементы станут доступны, в то время как…’явное ожидание дожидается именно определённого элемента или условия, прежде чем продолжить.

Задача 4: скрапинг в больших объемах без блокировки

Если речь идет о нескольких страницах, то проблем нет. Но если ты собираешь данные с тысячи страниц, сайт в конце концов обнаружит тебя и заблокирует. Чтобы не попасться:

  • Сделай направлять твои запросы через прокси-серверы для смены IP-адресов.
  • Соблюдайте интервал между звонками вместо того, чтобы отправлять всё сразу.
  • Управляет разбиение на страницы и бесконечная прокрутка постепенно, как настоящий гость.

Главное — вести себя незаметно. Чем больше твоё поведение похоже на поведение человека, тем меньше риск, что тебя отключат.

Часто задаваемые вопросы

Можно ли использовать BeautifulSoup для парсинга веб-сайта с AJAX?

Не напрямую. BeautifulSoup представляет собой библиотеку статический синтаксический анализ : она считывает только HTML-код, загруженный при запуске. Поскольку AJAX вставляет контент с помощью JavaScript, тебе нужно дополнить её инструментом, способным выполнять этот JavaScript, например Selenium Где Playwright. Безграфический браузер извлекает отрендеренный HTML-код, после чего ты передаёшь это содержимое в BeautifulSoup для разбор.

Еще один вариант: напрямую перехватить AJAX-запросы и получить ответ в формате JSON, который зачастую проще обрабатывать, чем HTML.

Как обрабатывать ошибки аутентификации или заголовки сеанса на сайте, использующем AJAX?

Защищенный сайт может выдать ошибку 401 (не разрешено) или 403 (запрещено), когда в твоих запросах не указаны нужные Печенье или HTTP-заголовки. Решение: перехватить эту информацию во время первоначального загрузки, а затем повторно использовать их в своих симулированных AJAX-запросах. Многие сайты также требуют CSRF-токен или заголовок X-Requested-With, без которого сервер отклоняет запрос. Именно поэтому простой запрос requests застревает там, где проходит браузер.

Как скопировать данные с сайта с бесконечной прокруткой или кнопкой “Загрузить ещё”?

Бесконечная загрузка — это один из видов AJAX-загрузки. Чтобы автоматизировать её, можно использовать два подхода:

  • Идентификация AJAX-запроса который загружает дополнительный контент, а затем напрямую его отображает (часто это URL-адрес с параметром пагинации).
  • Или симулировать нажатия кнопки «Загрузить еще» через браузер без графического интерфейса, например Selenium Где Puppeteer, пока не будут восстановлены все данные.

Существуют ли расширения Chrome для AJAX-скрапинга?

Да. Несколько расширения Chrome облегчают AJAX-скрейпинг для простых задач, не требуя написания ни одной строки кода. Наиболее известные из них:

  • Web Scraper
  • Data Miner
  • Instant Data Scraper

Расширение для Chrome «Instant Data Scraper», отображающее данные, извлеченные с веб-страницы с использованием AJAX.
Instant Data Scraper — расширение для Chrome, позволяющее собирать данные с веб-страниц без программирования. ©Christina для Alucare.fr

В чём разница между явным и неявным “wait” в Selenium или Playwright?

  • А неявная ожидание — это глобальное ожидание, применяемое ко всем элементам. Твой скрипт выжидает определённое время, прежде чем выдать ошибку, если какой-либо элемент не появится.
  • А явное ожидание — это условное ожидание, ориентированное на конкретный элемент. Оно продолжается только до тех пор, пока не будет выполнено условие.

На практике явное ожидание это предпочтительнее: так можно избежать ненужных задержек и сократить количество ошибок, когда AJAX-контент загружается долго.

Одним словом, парсинг сайтов с AJAX требует немного больше хитрости, но если использовать правильные методы, ничего не ускользнет от вашего внимания. А вы? Какой метод используете для парсинга сайтов с AJAX? Поделитесь своими советами в комментариях.

👍Ваше мнение
Статья информативна
Статья объективна
Статья отвечает на мой вопрос
Содержание актуально
🔍 Нашли ошибки? Скажите нам, где!

Понравилось? Поделитесь!

Это содержание изначально На французском (См. редактор чуть ниже). Он был переведен и вычитан на разных языках с помощью Deepl и/или Google Translate API, чтобы предложить помощь как можно большему числу стран. Этот перевод обходится нам в несколько тысяч евро в месяц. Если он не является 100 % идеальным, оставьте нам комментарий, чтобы мы могли его исправить. Если вы заинтересованы в вычитке и улучшении качества переведенных статей, пожалуйста, напишите нам, используя контактную форму!
Мы ценим ваши отзывы, чтобы улучшить наш контент. Если вы хотите предложить улучшения, пожалуйста, воспользуйтесь нашей контактной формой или оставьте комментарий ниже. Ваши комментарии всегда помогают нам улучшать качество нашего сайта Alucare.fr


Alucare является независимым СМИ. Поддержите нас, добавив в избранное Google News:

Опубликовать комментарий на дискуссионном форуме