Традиционные методы веб-скреппинга часто ломаются при изменении макета сайта или ужесточении защиты от ботов. В этом руководстве вы узнаете о более устойчивом, основанном на искусственном интеллекте подходе с использованием мощной языковой модели LLaMA 3-Metaс открытым весом для извлечения структурированных данных практически с любого веб-сайта и преобразования их в чистый, пригодный для использования JSON.
Давайте начнем.
Почему стоит использовать LLaMA 3 для веб-скрапинга?
LLaMA 3 (выйдет в апреле 2024 года) – это открытая модель большого языка компании Meta, доступная в размерах от 8 до 405 ББ параметров. Она поддерживает широкий спектр вариантов использования и аппаратных мощностей. Последующие итерации – LLaMA 3.1, 3.2 и 3.3 – значительно улучшили производительность и контекстуальное понимание.
Традиционные методы веб-скреппинга опираются на статические селекторы, такие как XPath или CSS, которые могут легко сломаться при изменении структуры сайта. В отличие от них LLaMA 3 обеспечивает интеллектуальное извлечение данных, понимая содержимое контекстно – точно так же, как это сделал бы человек.
Это делает его идеальным для:
- Сайты электронной коммерции, такие как Amazon
- синтаксический анализ данных
- Создание более устойчивых скреперов, которые не ломаются при каждом обновлении сайта
- Сохранение соскобленных данных в вашей среде – крайне важно для конфиденциальной информации
Узнайте больше об использовании искусственного интеллекта для веб-скрапинга.
Пререквизиты
Прежде чем приступить к работе с веб-скребком LLM, убедитесь, что у вас есть все необходимое:
- УстановленPython 3
- Базовые знания Python (вам не нужно быть экспертом)
- Совместимая операционная система: – macOS (требуется macOS 11 Big Sur или более поздняя версия) – Linux – Windows (требуется Windows 10 или более поздняя версия)
- Достаточные аппаратные ресурсы (см. подробности выбора модели ниже)
Установка Ollama
Ollama – это легкий инструмент, который упрощает загрузку, настройку и запуск больших языковых моделей локально.
Чтобы начать:
- Посетите официальный сайт Ollama
- Загрузите и установите приложение для вашей операционной системы
- Важно: Во время установки Ollama предложит вам выполнить команду терминала –пока не выполняйте ее. Сначала мы выберем подходящую версию модели.
Выбор модели LLaMA
Начните с просмотра библиотеки моделей Ollama, чтобы выбрать версию LLaMA, которая лучше всего подходит для вашего оборудования и сценария использования.
Для большинства пользователей llama3.1:8b
предлагает оптимальный баланс между производительностью и эффективностью. Она легкая, способная, требует около 4,9 ГБ дискового пространства и 6-8 ГБ оперативной памяти. Она отлично работает на большинстве современных ноутбуков.
Если вы работаете с более мощной машиной и вам нужны более широкие возможности для рассуждений или увеличенная длина контекста, рассмотрите возможность перехода на более крупные модели, такие как 70B
или 405B
. Они требуют значительно больше памяти и вычислительной мощности.
Создание и запуск модели
Чтобы загрузить и инициализировать модель LLaMA 3.1 (8B), выполните следующую команду:
ollama run llama3.1:8b
Когда модель будет загружена, вы увидите простую интерактивную подсказку:
>>> Send a message (/? for help)
Вы можете протестировать модель с помощью быстрого запроса:
>>> who are you?
I am LLaMA, *an AI assistant developed by Meta AI...*
Успешный ответ, подобный приведенному выше, подтверждает, что модель установлена правильно. Введите /bye
, чтобы выйти из подсказки.
Затем запустите сервер Ollama, выполнив команду:
ollama serve
Эта команда запускает локальный экземпляр Ollama по адресу http://127.0.0.1:11434/.
Оставьте это окно терминала открытым, так как сервер должен работать в фоновом режиме.
Чтобы убедиться в том, что он работает, откройте браузер и перейдите по этому URL-адресу – вы увидите сообщение “Ollama запущена”.
Создание скребка Amazon на основе LLM
В этом разделе мы создадим скребок, который будет извлекать информацию о товарах с Amazon – одной из самых сложных целей из-за ее динамичного содержимого и надежной защиты от ботов.
Мы извлечем такие ключевые детали, как:
- Название продукта
- Текущая/оригинальная цена
- Скидка
- Рейтинг и отзывы
- Описание и характеристики
- Доступность и ASIN
Многоступенчатый рабочий процесс с поддержкой искусственного интеллекта
Чтобы преодолеть ограничения традиционного скраппинга – особенно на сложных сайтах электронной коммерции, таких как Amazon, – наш скраппер на базе LLaMA следует продуманному многоступенчатому рабочему процессу:
- Автоматизация браузера – используйте Selenium для загрузки страницы и отображения динамического содержимого
- Извлечение HTML – определение и извлечение контейнера, содержащего подробную информацию о продукте
- Преобразование в Markdown – Преобразование HTML в Markdown для уменьшения количества токенов и повышения эффективности LLM.
- Обработка LLM – Используйте структурированный запрос с LLaMA для извлечения чистого, структурированного JSON
- Обработка вывода – сохранение извлеченного JSON для последующего использования или анализа.
Вот наглядное описание рабочего процесса:
Давайте рассмотрим этот процесс шаг за шагом. Обратите внимание, что в этих примерах используется Python из-за его простоты и популярности, но вы можете добиться аналогичных результатов, используя JavaScript или другой язык по вашему выбору.
Шаг 1 – Установка необходимых библиотек
Сначала установите необходимые библиотеки Python:
pip install requests selenium webdriver-manager markdownify
requests
– Лучший HTTP-клиент Python для отправки API-вызовов в службу LLM.selenium
– автоматизирует работу браузера, идеально подходит для сайтов с большим количеством JavaScriptwebdriver-manager
– автоматическая загрузка и управление правильной версией ChromeDrivermarkdownify
– Преобразование HTML в Markdown
Шаг 2 – Инициализация безголового браузера
Настройте безголовый браузер с помощью Selenium:
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager
options = Options()
options.add_argument("--headless")
driver = webdriver.Chrome(
service=Service(ChromeDriverManager().install()),
options=options
)
Шаг 3 – Извлечение HTML-файла продукта
Подробная информация о продукте Amazon отображается динамически и упаковывается внутри
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
wait = WebDriverWait(driver, 15)
product_container = wait.until(
EC.presence_of_element_located((By.ID, "ppd"))
)
# Extract the full HTML of the product container
page_html = product_container.get_attribute("outerHTML")
Такой подход:
- Ожидает JavaScript-рендеринга содержимого (например, цен и рейтингов).
- Нацеливайтесь только на соответствующий раздел продукта, игнорируя верхние и нижние колонтитулы, а также боковые колонтитулы.
Ознакомьтесь с нашим полным руководством по поиску данных о товарах Amazon на языке Python.
Шаг 4 – Преобразование HTML в Markdown
Страницы Amazon содержат глубоко вложенный HTML, который неэффективно обрабатывается LLM. Ключевой оптимизацией является преобразование HTML в чистый Markdown, что значительно сокращает количество лексем и улучшает восприятие.
После запуска всего скрипта будут созданы два файла: amazon_page.html
и amazon_page.md
. Попробуйте вставить оба в инструмент Token Calculator Tool, чтобы сравнить количество токенов.
Как показано ниже, HTML содержит около 270 000 лексем:
Версия в формате Markdown? Всего ~11 000 жетонов:
Это сокращение на 96 % приводит к:
- Экономическая эффективность – меньшее количество токенов означает меньшие затраты на API или вычисления.
- Более быстрая обработка – меньше входных данных = более быстрые ответы LLM
- Повышение точности – более чистый и ровный текст помогает модели более точно извлекать структурированные данные
Читайте подробнее о том , почему агенты искусственного интеллекта предпочитают Markdown, а не HTML.
Вот как выполнить преобразование в Python:
from markdownify import markdownify as md
clean_text = md(page_html, heading_style="ATX")
Шаг 5 – Создание подсказки извлечения данных
Хорошо структурированная подсказка очень важна для получения последовательного и чистого JSON-вывода от LLM. Ниже приведена подсказка, которая предписывает модели возвращать только корректный JSON в заранее определенном формате:
PROMPT = (
"You are an expert Amazon product data extractor. Your task is to extract product data from the provided content. "
"Return ONLY valid JSON with EXACTLY the following fields and formats:\n\n"
"{\n"
' "title": "string – the product title",\n'
' "price": number – the current price (numerical value only)",\n'
' "original_price": number or null – the original price if available,\n'
' "discount": number or null – the discount percentage if available,\n'
' "rating": number or null – the average rating (0–5 scale),\n'
' "review_count": number or null – total number of reviews,\n'
' "description": "string – main product description",\n'
' "features": ["string"] – list of bullet point features,\n'
' "availability": "string – stock status",\n'
' "asin": "string – 10-character Amazon ID"\n'
"}\n\n"
"Return ONLY the JSON without any additional text."
)
Шаг 6 – Вызов API LLM
Запустив Ollama локально, вы можете отправить текст в формате Markdown в ваш экземпляр LLaMA через его HTTP API:
import requests
import json
response = requests.post(
"<http://localhost:11434/api/generate>",
json={
"model": "llama3.1:8b",
"prompt": f"{PROMPT}\n\n{clean_text}",
"stream": False,
"format": "json",
"options": {
"temperature": 0.1,
"num_ctx": 12000,
},
},
timeout=250,
)
raw_output = response.json()["response"].strip()
product_data = json.loads(raw_output)
Что делает каждый вариант:
температура
– Установите значение 0,1 для детерминированного вывода (идеально подходит для форматирования JSON)num_ctx
– Определяет максимальную длину контекста. Для большинства страниц товаров Amazon достаточно 12 000 токеновstream
– Еслизначение False
, API возвращает полный ответ после обработки.format
– Указывает формат вывода (JSON)модель
– Указывает, какую версию LLaMA следует использовать
Поскольку преобразованный Markdown обычно содержит около 11 000 лексем, важно установить соответствующее значение контекстного окна(num_ctx
). Хотя увеличение этого значения позволяет обрабатывать более длинные вводимые данные, оно также увеличивает потребление оперативной памяти и замедляет обработку. Увеличивайте лимит контекста только в том случае, если страницы ваших товаров особенно длинные или если у вас есть вычислительные ресурсы для их поддержки.
Шаг 7 – Сохранить результаты
Наконец, сохраните структурированные данные о продукте в файл JSON:
with open("product_data.json", "w", encoding="utf-8") as f:
json.dump(product_data, f, indent=2, ensure_ascii=False)
Шаг 8: Выполните сценарий
Чтобы запустить свой скрепер, укажите URL-адрес продукта Amazon и вызовите функцию скрепинга:
if __name__ == "__main__":
url = "<https://www.amazon.com/Black-Office-Chair-Computer-Adjustable/dp/B00FS3VJAO>"
# Call your function to scrape and extract product data
scrape_amazon_product(url)
Шаг 9 – Пример полного кода
Ниже приведен полный сценарий на языке Python, который объединяет все шаги в целостный, сквозной рабочий процесс:
import json
import logging
import time
from typing import Final, Optional, Dict, Any
import requests
from markdownify import markdownify as html_to_md
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from webdriver_manager.chrome import ChromeDriverManager
# Configuration constants
LLM_API_CONFIG: Final[Dict[str, Any]] = {
"endpoint": "<http://localhost:11434/api/generate>",
"model": "llama3.1:8b",
"temperature": 0.1,
"context_window": 12000,
"stream": False,
"timeout_seconds": 220,
}
DEFAULT_PRODUCT_DATA: Final[Dict[str, Any]] = {
"title": "",
"price": 0.0,
"original_price": None,
"discount": None,
"rating": None,
"review_count": None,
"description": "",
"features": [],
"availability": "",
"asin": "",
}
PRODUCT_DATA_EXTRACTION_PROMPT: Final[str] = (
"You are an expert Amazon product data extractor. Your task is to extract product data from the provided content. "
"Return ONLY valid JSON with EXACTLY the following fields and formats:\n\n"
"{\n"
' "title": "string - the product title",\n'
' "price": number - the current price (numerical value only),\n'
' "original_price": number or null - the original price if available,\n'
' "discount": number or null - the discount percentage if available,\n'
' "rating": number or null - the average rating (0-5 scale),\n'
' "review_count": number or null - total number of reviews,\n'
' "description": "string - main product description",\n'
' "features": ["string"] - list of bullet point features,\n'
' "availability": "string - stock status",\n'
' "asin": "string - 10-character Amazon ID"\n'
"}\n\n"
"Return ONLY the JSON without any additional text."
)
# Configure logging
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s - %(levelname)s - %(message)s",
handlers=[logging.StreamHandler()],
)
def initialize_web_driver(headless: bool = True) -> webdriver.Chrome:
"""Initialize and return a configured Chrome WebDriver instance."""
options = Options()
if headless:
options.add_argument("--headless=new")
service = Service(ChromeDriverManager().install())
return webdriver.Chrome(service=service, options=options)
def fetch_product_container_html(product_url: str) -> Optional[str]:
"""Retrieve the HTML content of the Amazon product details container."""
driver = initialize_web_driver()
try:
logging.info(f"Accessing product page: {product_url}")
driver.set_page_load_timeout(15)
driver.get(product_url)
# Wait for the product container to appear
container = WebDriverWait(driver, 5).until(
EC.presence_of_element_located((By.ID, "ppd"))
)
return container.get_attribute("outerHTML")
except Exception as e:
logging.error(f"Error retrieving product details: {str(e)}")
return None
finally:
driver.quit()
def extract_product_data_via_llm(markdown_content: str) -> Optional[Dict[str, Any]]:
"""Extract structured product data from markdown text using LLM API."""
try:
logging.info("Extracting product data via LLM API...")
response = requests.post(
LLM_API_CONFIG["endpoint"],
json={
"model": LLM_API_CONFIG["model"],
"prompt": f"{PRODUCT_DATA_EXTRACTION_PROMPT}\n\n{markdown_content}",
"format": "json",
"stream": LLM_API_CONFIG["stream"],
"options": {
"temperature": LLM_API_CONFIG["temperature"],
"num_ctx": LLM_API_CONFIG["context_window"],
},
},
timeout=LLM_API_CONFIG["timeout_seconds"],
)
response.raise_for_status()
raw_output = response.json()["response"].strip()
# Clean JSON output if it's wrapped in markdown code blocks
if raw_output.startswith(("```json", "```")):
raw_output = raw_output.split("```")[1].strip()
if raw_output.startswith("json"):
raw_output = raw_output[4:].strip()
return json.loads(raw_output)
except requests.exceptions.RequestException as e:
logging.error(f"LLM API request failed: {str(e)}")
return None
except json.JSONDecodeError as e:
logging.error(f"Failed to parse LLM response: {str(e)}")
return None
except Exception as e:
logging.error(f"Unexpected error during data extraction: {str(e)}")
return None
def scrape_amazon_product(
product_url: str, output_file: str = "product_data.json"
) -> None:
"""Scrape an Amazon product page and save extracted data along with HTML and Markdown to files."""
start_time = time.time()
logging.info(f"Starting scrape for: {product_url}")
# Step 1: Fetch product page HTML
product_html = fetch_product_container_html(product_url)
if not product_html:
logging.error("Failed to retrieve product page content")
return
# Optional: save HTML for debugging
with open("amazon_product.html", "w", encoding="utf-8") as f:
f.write(product_html)
# Step 2: Convert HTML to Markdown
product_markdown = html_to_md(product_html)
# Optional: save Markdown for debugging
with open("amazon_product.md", "w", encoding="utf-8") as f:
f.write(product_markdown)
# Step 3: Extract structured data via LLM
product_data = (
extract_product_data_via_llm(product_markdown) or DEFAULT_PRODUCT_DATA.copy()
)
# Step 4: Save JSON results
try:
with open(output_file, "w", encoding="utf-8") as json_file:
json.dump(product_data, json_file, indent=2, ensure_ascii=False)
logging.info(f"Successfully saved product data to {output_file}")
except IOError as e:
logging.error(f"Failed to save JSON results: {str(e)}")
elapsed_time = time.time() - start_time
logging.info(f"Completed in {elapsed_time:.2f} seconds")
if __name__ == "__main__":
# Example usage
test_url = (
"<https://www.amazon.com/Black-Office-Chair-Computer-Adjustable/dp/B00FS3VJAO>"
)
scrape_amazon_product(test_url)
После успешного выполнения скрипт сохраняет извлеченные данные о товаре в файл product_data.json
. Выходные данные будут выглядеть примерно так:
{
"title": "Home Office Chair Ergonomic Desk Chair Mesh Computer Chair with Lumbar Support Armrest Executive Rolling Swivel Adjustable Mid Back Task Chair for Women Adults, Black",
"price": 36.98,
"original_price": 41.46,
"discount": 11,
"rating": 4.3,
"review_count": 58112,
"description": 'Office chair comes with all hardware and tools, and is easy to assemble in about 10–15 minutes. The high-density sponge cushion offers flexibility and comfort, while the mid-back design and rectangular lumbar support enhance ergonomics. All components are BIFMA certified, supporting up to 250 lbs. The chair includes armrests and an adjustable seat height (17.1"–20.3"). Its ergonomic design ensures a perfect fit for long-term use.',
"features": [
"100% mesh material",
"Quick and easy assembly",
"High-density comfort seat",
"BIFMA certified quality",
"Includes armrests",
"Ergonomic patented design",
],
"availability": "In Stock",
"asin": "B00FS3VJAO",
}
Вуаля! Беспорядочный HTML превращается в чистый JSON – такова магия LLM в веб-скреппинге.
Преодоление мер по борьбе с ботами
Запустив вышеупомянутого бота для скрапбукинга, вы, скорее всего, столкнетесь с мерами Amazon по защите от ботов, такими как вызов CAPTCHA:
Это подчеркивает ключевое ограничение: Хотя наш рабочий процесс на основе LLaMA отлично справляется с разбором HTML, доступ к этому содержимому по-прежнему затруднен на сайтах с развитой защитой от ботов.
Чтобы справиться с этой проблемой, вам нужно будет обойти CAPTCHA Amazon и решить другие проблемы, связанные с веб-скрептингом.
Именно здесь на помощь приходит браузер для скрапинга от Bright Data – специально разработанное решение для работы со сложностями современной веб-среды, включая надежное разблокирование даже самых защищенных веб-сайтов, где традиционные инструменты не справляются.
Узнайте больше: Браузер для скрапинга против безголовых браузеров
Почему стоит использовать браузер для сбора данных Bright Data Scraping Browser
Bright Data Scraping Browser – это безголовый облачный браузер со встроенной прокси-инфраструктурой и расширенными возможностями разблокировки, специально созданный для масштабирования современных проектов веб-скрепинга. Он является частью пакета для скраппинга Bright Data Unlocker.
Вот почему разработчики и команды по работе с данными выбирают именно его:
- Надежные отпечатки пальцев TLS и методы скрытного обхода
- Встроенная ротация IP-адресов с помощью сети IP-прокси 150M+.
- Автоматическое решение CAPTCHA
- Сокращение расходов на инфраструктуру – отказ от дорогостоящей установки облачных вычислений и постоянного обслуживания.
- Встроенная поддержка Playwright, Puppeteer и Selenium
- Неограниченная масштабируемость для извлечения большого объема данных
Самое приятное? Вы можете интегрировать его в существующий рабочий процесс с помощью всего нескольких строк кода.
Узнайте, почему все больше компаний переходят на облачный веб-скрепинг.
Настройка браузера для скрапинга
Чтобы начать работу с браузером Scraping Browser:
Создайте учетную запись Bright Data (новые пользователи получают кредит в размере $5 после добавления способа оплаты) и на панели управления перейдите в раздел Proxies & Scraping и нажмите Get started.
Создайте новую зону (например, test_browser) и включите такие функции, как премиум-домены и решение CAPTCHA.
Затем скопируйте URL-адрес Selenium из вашей панели инструментов.
Модификация вашего кода для скрапинга браузера
Обновите функцию initialize_web_driver
для подключения через Scraping Browser:
from selenium.webdriver import Remote
from selenium.webdriver.chrome.options import Options as ChromeOptions
from selenium.webdriver.chromium.remote_connection import ChromiumRemoteConnection
SBR_WEBDRIVER = "<https://username:password@host>:port"
def initialize_web_driver():
options = ChromeOptions()
sbr_connection = ChromiumRemoteConnection(SBR_WEBDRIVER, "goog", "chrome")
driver = Remote(sbr_connection, options=options)
return driver
Вот и все – теперь ваш скребок проходит через инфраструктуру Bright Data и легко справляется с Amazon и другими системами защиты от ботов.
Более подробную информацию о расширенных возможностях можно найти в документации по Scraping Browser.
Следующие шаги и альтернативные решения
Чтобы расширить возможности вашего скрепера на базе LLaMA или изучить другие варианты реализации, рассмотрите следующие усовершенствования и альтернативы.
- Сделайте скрипт многоразовым: Разрешите передавать URL и подсказку в качестве аргументов командной строки для гибкого использования
- Защитите свои учетные данные: Храните учетные данные браузера Scraping Browser в файле
.env
и безопасно загружайте их с помощьюpython-dotenv
. - Добавьте поддержку многостраничности: Реализуйте логику для просмотра нескольких страниц и обработки пагинации
- Соскребайте больше веб-сайтов – используйте функции Scraping Browser по защите от обнаружения, чтобы соскребать другие платформы электронной коммерции.
- Извлечение данных из сервисов Google – создайте специальные скреперы для Google Flights, Google Search и Google Trends или используйте SERP API Bright Data для получения готовых поисковых данных.
Если вы предпочитаете управляемые решения или хотите изучить другие методы, основанные на LLM, вам могут подойти следующие варианты:
- Скраппинг с помощью Gemini
- Скраппинг с недоумением
- Создайте ИИ-скребок с помощью Crawl4AI и DeepSeek
Заключение
Это руководство закладывает прочный фундамент для создания надежных веб-скраперов с помощью LLaMA 3. Сочетая возможности рассуждений больших языковых моделей с передовыми инструментами для скрейпинга, вы сможете извлекать структурированные данные из сложных веб-сайтов с минимальными усилиями.
Избежать обнаружения и блокировки – одна из самых сложных задач при веб-скрапинге. Bright Data Scraping Browser решает эту проблему, автоматически обрабатывая динамический рендеринг, отпечатки пальцев и защиту от ботов. Он является частью более широкого набора инструментов, предназначенных для поддержки масштабируемого извлечения данных:
- Прокси-сервисы – доступ к 150 миллионам IP-адресов жителей в обход гео-ограничений
- Web Scraper APIs – извлечение структурированных данных из 100+ популярных веб-сайтов через специальные конечные точки.
- Web Unlocking API – Получение полностью отрендеренного HTML с любого URL-адреса в обход систем защиты от скаппинга.
- SERP API – сбор результатов поиска в реальном времени от всех основных поисковых систем
Зарегистрируйтесь сегодня, чтобы бесплатно протестировать полный набор инструментов Bright Data для скраппинга и прокси!
Кредитная карта не требуется