Превращение веб-страницы в чистые структурированные данные, это две задачи, а не одна. Сначала нужно получить страницу, что кажется тривиальным до тех пор, пока целевой ресурс не выдаст CAPTCHA или пустую оболочку. Затем нужно прочитать разметку и извлечь нужные поля, то, что традиционно означает написание хрупких парсеров для каждого сайта вручную. В этом руководстве используются два инструмента, каждый из которых берёт на себя одну половину: Crawlbase Crawling API собирает страницу, а Perplexity AI преобразует её в JSON.
Результат, небольшой работающий Python-скрипт для веб-скрапинга с Perplexity AI: получить HTML через Crawling API, обрезать его до нужной части, преобразовать в Markdown для экономии токенов, а затем передать в API Perplexity с подсказкой, точно описывающей, что нужно извлечь. Важно сохранять чёткое разделение труда. Perplexity не обходит сайт в этой схеме. Он читает текст, который вы ему передаёте. Загрузка, рендеринг и обход блокировок, всё это происходит на шаге Crawling API.
Зачем использовать Perplexity AI для веб-скрапинга
Классический Python-скрапинг опирается на requests и BeautifulSoup: вы получаете HTML, затем пишете селекторы, обходящие DOM до нужных полей. Это прекрасно работает на аккуратных стабильных страницах. Но когда разметка глубоко вложена, непоследовательна в разных листингах или переписывается каждые несколько недель, всё ломается, поскольку каждое изменение требует переписывать селекторы.
LLM вроде Perplexity меняет вторую половину уравнения. Вместо того чтобы говорить ему, где цена находится в DOM, вы говорите ему, что вам нужно ("название товара, цена и краткое резюме"), и он читает содержимое как человек. Он хорошо умеет извлекать структуру из беспорядочного текста и возвращать её в виде JSON, именно тот формат, который нужен для конвейера. Это та же идея, что лежит в основе извлечения данных с помощью AI в целом, а модели Sonar от Perplexity добавляют к этому веб-заземление.
Что Perplexity здесь делает, а что нет
API Perplexity совместим с OpenAI, поэтому вы обращаетесь к нему через тот же клиент openai, но с другим базовым URL. В этом скрапере он выполняет ровно одну роль: читает текст страницы, который мы собрали, и возвращает структурированные поля. Он не является вашим краулером, он не обходит блокировки и не является вашим прокси. Держите эту границу чёткой, и архитектура остаётся простой: Crawlbase получает байты, Perplexity разбирается в них.
Настройка окружения Python
Вам нужен Python 3.8 или новее. Создайте виртуальное окружение, чтобы зависимости этого проекта были изолированы, затем активируйте его.
python -m venv perplexity_env # Windows perplexity_env\Scripts\activate # macOS / Linux source perplexity_env/bin/activate
Теперь установите четыре библиотеки, используемые скриптом.
pip install crawlbase beautifulsoup4 markdownify openai
- crawlbase клиент для Crawling API, который загружает и рендерит страницу.
- beautifulsoup4 обрезает HTML до нужного раздела перед тем, как тратить на него токены.
- markdownify преобразует этот раздел в Markdown, чтобы модель получила чистый текст, а не суп из тегов.
- openai OpenAI-совместимый клиент, с которым работает API Perplexity.
Также понадобятся два ключа. Получите токен Crawlbase в дашборде после регистрации и API-ключ Perplexity в настройках вашего аккаунта Perplexity. Храните оба вне системы контроля версий, в переменных окружения или файле секретов, и никогда не вставляйте их в общий код.
Crawlbase выдаёт два токена. Обычный токен возвращает статический HTML; JavaScript (JS) токен сначала рендерит страницу в настоящем браузере. Если ваш целевой ресурс строит контент на стороне клиента (большинство современных магазинов и дашбордов), используйте JS-токен, иначе страница вернётся как пустая оболочка. Для страниц с серверным рендерингом обычный токен быстрее и дешевле.
Шаг 1: Получите страницу через Crawling API
Это шаг сбора данных, и именно здесь обрабатываются блокировки. Вы отправляете Crawling API URL; он направляет запрос через ротирующие резидентские IP, при необходимости рендерит JavaScript, справляется с CAPTCHA и другими вызовами, которые остановили бы обычный requests.get, и возвращает готовый HTML. Вы никогда не касаетесь пула прокси или headless-браузера самостоятельно.
Сохраните это как crawl.py. В качестве примера используется страница товара на Amazon.
from crawlbase import CrawlingAPI api = CrawlingAPI({'token': 'YOUR_CRAWLBASE_JS_TOKEN'}) def crawl(url: str) -> str: response = api.get(url, {'ajax_wait': 'true', 'page_wait': 3000}) if response['status_code'] != 200: raise RuntimeError(f'Crawl failed: {response["status_code"]}') return response['body'].decode('utf-8') if __name__ == '__main__': url = 'https://www.amazon.com/Art-War-DELUXE-Sun-Tzu/dp/9388369696' html = crawl(url) with open('output.html', 'w', encoding='utf-8') as f: f.write(html) print('Saved output.html')
Запустите командой python crawl.py. Вы получите output.html с настоящей разметкой товара, а не заблокированную или пустую страницу, которую часто возвращает прямой запрос. Опции ajax_wait и page_wait говорят рендереру ожидать асинхронного контента; увеличьте page_wait, если результаты возвращаются неполными. Именно в этом весь смысл использования Crawling API: это слой, который вообще обеспечивает получение пригодной страницы, что и делает шаг с AI возможным.
Шаг с AI работает только если вы вообще можете получить страницу. Crawling API принимает токен, при необходимости рендерит страницу в настоящем браузере, ротирует резидентские IP на сервере и возвращает готовый HTML, так что вам не нужно самостоятельно запускать пул прокси и headless-флот. Укажите его на публичную страницу через бесплатный тариф и передайте результат прямо в Perplexity.
Шаг 2: Очистите HTML и преобразуйте его в Markdown
Полная страница товара, это сотни килобайт панелей навигации, скриптов и подвалов. Отправлять всё это в Perplexity медленно и расточительно, поскольку цены LLM рассчитываются за токен, а большинство этих токенов, шум. Два дешёвых шага исправляют это: использовать BeautifulSoup для захвата только нужного раздела, затем преобразовать его в Markdown, чтобы модель читала чистый текст вместо тегов.
Сохраните это как parse.py.
from bs4 import BeautifulSoup from markdownify import markdownify as md def html_to_markdown(html: str) -> str: soup = BeautifulSoup(html, 'html.parser') element = soup.find(id='centerCol') or soup.body if element is None: raise ValueError('Could not find content section in HTML') return md(str(element))
Идентификатор centerCol, это основная колонка товара на этой странице Amazon; для другого сайта изучите живую страницу в инструментах разработчика браузера и выберите контейнер с нужными полями. Резервный вариант or soup.body не даёт скрипту упасть, если этот идентификатор отсутствует. Селекторы меняются со временем, поэтому воспринимайте целевой контейнер как то, что нужно периодически пересматривать, а не как постоянный контракт.
Шаг 3: Напишите промпт для извлечения
В подсказке вы говорите Perplexity, что извлечь и как это оформить. Будьте конкретны в полях и просите только JSON, чтобы ответ было легко парсить дальше по конвейеру. Системное сообщение задаёт роль; пользовательское сообщение содержит инструкции плюс Markdown.
def build_prompt(markdown: str) -> list: return [ { 'role': 'system', 'content': 'You extract structured data from product pages. Reply with JSON only, no prose.', }, { 'role': 'user', 'content': ( 'Extract these fields from the Markdown:\n' '- title\n' '- price\n' '- rating\n' '- one_sentence_summary\n\n' f'Markdown:\n{markdown}\n\n' 'Respond with a single JSON object.' ), }, ]
Чёткие имена полей и явная инструкция "только JSON" делают большую часть работы. Если вам нужна строгая форма, перечислите каждый ожидаемый ключ, и модель будет точно следовать этому.
Шаг 4: Вызовите Perplexity и соберите скрапер
Теперь соберём всё вместе. Клиент openai указывает на https://api.perplexity.ai, вы отправляете подсказку в модель Sonar и парсите возвращённый JSON. Сохраните это как scraper.py.
import json from openai import OpenAI from crawl import crawl from parse import html_to_markdown from build_prompt import build_prompt URL = 'https://www.amazon.com/Art-War-DELUXE-Sun-Tzu/dp/9388369696' client = OpenAI( api_key='YOUR_PERPLEXITY_API_KEY', base_url='https://api.perplexity.ai', ) def scrape(url: str) -> dict: html = crawl(url) markdown = html_to_markdown(html) messages = build_prompt(markdown) response = client.chat.completions.create( model='sonar-pro', messages=messages, ) content = response.choices[0].message.content return json.loads(content) if __name__ == '__main__': data = scrape(URL) print(json.dumps(data, indent=2))
Запустите командой python scraper.py, предварительно вставив два ключа. Модель sonar-pro, это более мощный уровень Sonar от Perplexity; sonar дешевле и вполне подходит для простого извлечения. Обе используют формат chat-completions, совместимый с OpenAI, поэтому переключение между моделями, это изменение одной строки.
Как выглядит результат
Результат, чистый JSON-объект, который можно записать в базу данных, CSV или следующий этап конвейера.
{ "title": "The Art of War (Deluxe Hardbound Edition)", "price": "$15.80", "rating": "4.7 out of 5", "one_sentence_summary": "An ancient Chinese treatise by Sun Tzu on strategy, planning, and adapting tactics to win conflicts." }
Обратите внимание на одну особенность, которую стоит учесть в продакшене: модели Sonar от Perplexity ориентированы на веб и иногда добавляют маркеры цитирования вроде [1] к тексту или оборачивают JSON в блок кода. Если json.loads выбрасывает ошибку, перед парсингом уберите ведущий и завершающий блок, или дайте модели более чёткие инструкции возвращать сырой JSON. Небольшой шаг очистки надёжно решает эту проблему.
Сложности и ограничения, о которых стоит помнить
Сочетание LLM с краулером, это мощный инструмент, но без компромиссов не обходится. Стоимость растёт с количеством токенов, поэтому шаг обрезки до Markdown важнее по мере масштабирования; не отправляйте целые страницы. Латентность выше, чем у написанного вручную парсера, поскольку вы ждёте ответа модели на каждую страницу; это приемлемо для сотен страниц, но стоит пересмотреть для миллионов. И LLM иногда неправильно маркирует поле или придумывает значение, поэтому проверяйте критически важные поля (приводите цены к числам, проверяйте обязательные ключи), а не доверяйте выводу слепо.
Для очень высокообъёмных задач с фиксированной схемой, где вы уже знаете точные поля, детерминированный парсер или Crawling API Crawlbase с готовыми парсерами могут быть дешевле и быстрее, чем LLM. Подход с AI оправдывает себя, когда страницы разнообразны, беспорядочны или часто меняются. Если вы хотите сравнить провайдеров AI для такого рода задач, использование Gemini AI для веб-скрапинга описывает тот же шаблон с другой моделью.
Не дайте заблокировать этап сбора данных
Всё вышесказанное предполагает, что шаг 1 действительно возвращает настоящую страницу. На сложных коммерческих ресурсах именно это допущение, слабое место скраперов, поэтому несколько привычек помогают поддерживать слой сбора данных в рабочем состоянии.
- Используйте JS-токен для страниц с клиентским рендерингом. Обычный токен возвращает пустую оболочку до рендеринга на таких сайтах, и тогда Perplexity просто нечего читать.
- Опирайтесь на ротацию. Crawling API и Smart AI Proxy направляют запросы через ротирующие резидентские IP, чтобы ни один адрес не достиг лимита. Если вы строите собственный стек, именно эту часть нужно проработать тщательнее всего.
- Задавайте темп запросов и следите за кодами статуса. Распределяйте запросы во времени, варьируйте параметры и воспринимайте нарастающий уровень вызовов как сигнал снизить темп, а не усилить нагрузку.
Полное руководство по этой теме, как скрапить сайты без блокировок. Краткая версия: поручите Crawling API сбор и обход блокировок, а Perplexity, интерпретацию. Держите эти две ответственности раздельными, и система останется простой для понимания.
Ключевые выводы
- Два инструмента, две задачи. Crawling API собирает и рендерит страницу за надёжным IP; Perplexity читает результат и возвращает структурированный JSON. Perplexity, не ваш краулер.
- Обрезайте перед подсказкой. Используйте BeautifulSoup для захвата нужного раздела и Markdown для очистки, чтобы тратить токены на контент, а не на панели навигации и скрипты.
-
Perplexity говорит на OpenAI. Используйте клиент
openaiс базовым URLhttps://api.perplexity.aiи модель Sonar вродеsonar-pro. - Просите только JSON. Явно называйте поля и проверяйте критически важные; Sonar может добавлять маркеры цитирования или блоки кода, поэтому добавьте небольшой шаг очистки.
- Обход блокировок живёт в шаге 1. Используйте JS-токен для страниц с клиентским рендерингом, опирайтесь на ротацию и задавайте темп запросов, чтобы страница вообще возвращалась.
Часто задаваемые вопросы
Скрапит ли Perplexity AI сайт самостоятельно?
Нет, не в этом рабочем процессе. Perplexity читает текст, который вы ему передаёте, и возвращает структурированные данные; он не загружает целевую страницу, не рендерит JavaScript и не обрабатывает блокировки. Весь сбор данных выполняет Crawling API, включая ротацию резидентских IP и рендеринг, а затем вы передаёте его HTML или Markdown в Perplexity для интерпретации. Сохранение этой границы чёткой, ключ к пониманию архитектуры.
Зачем преобразовывать HTML в Markdown перед отправкой в Perplexity?
По двум причинам: стоимость и качество. Полная HTML-страница состоит в основном из навигации, скриптов и стилей, которые тратят токены впустую, а цены LLM рассчитываются за токен. Обрезка до нужного раздела с помощью BeautifulSoup и преобразование в Markdown дают модели чистый текст для чтения, что снижает стоимость и улучшает точность извлечения, поскольку снижается уровень шума.
Какую модель Perplexity использовать, sonar или sonar-pro?
Начните с sonar для простых хорошо структурированных страниц; он дешевле и обычно достаточно точен. Переходите на sonar-pro, когда качество извлечения критично или контент плотный и разнообразный. Обе модели используют OpenAI-совместимый формат chat-completions, поэтому переключение, это изменение одной строки в аргументе model.
Нужен ли обычный token Crawlbase или JS-token?
Это зависит от целевого ресурса. Используйте обычный токен для страниц с серверным рендерингом, где HTML уже содержит данные. Используйте JS-токен, когда сайт строит контент на стороне клиента (большинство современных магазинов и приложений), потому что обычный токен вернёт пустую оболочку до рендеринга и оставит Perplexity без данных для извлечения.
Разбор JSON постоянно падает. В чём проблема?
Модели Sonar от Perplexity ориентированы на веб и могут оборачивать вывод в блок кода или добавлять маркеры цитирования вроде [1], что ломает json.loads. Перед парсингом уберите ведущие и завершающие блоки, ужесточьте подсказку, требуя сырой JSON без лишнего текста, и проверяйте разобранный объект перед использованием. Небольшой шаг очистки делает конвейер надёжным.
Можно ли использовать Perplexity AI и Crawlbase вместе при масштабировании?
Да, и они хорошо дополняют друг друга. Crawlbase обеспечивает сбор и обход блокировок, чтобы запросы продолжали достигать цели, а Perplexity превращает каждую страницу в структурированные данные. Для очень высоких объёмов с фиксированной схемой взвесьте стоимость LLM за страницу против детерминированного парсера или Scraper API; подход с AI хорош, когда страницы беспорядочны или часто меняются, тогда как задачи с фиксированной схемой могут быть дешевле без LLM.
Обходите любой сайт в масштабе, без борьбы с инфраструктурой.
Crawlbase берёт на себя прокси, отпечатки и CAPTCHA, чтобы ваша команда выпускала конвейеры данных вместо поддержки обвязки краулинга. 1 000 запросов бесплатно, без карты.
