В этом руководстве вы узнаете:
- Что такое
llm-scraper
- Как использовать его в пошаговом руководстве
- Как использовать его для генерации кода
- Какие существуют основные альтернативы для скрапбукинга на основе LLM
- Его основные ограничения и способы их преодоления
Давайте погрузимся!
Что такое llm-scraper?
llm-scraper
– это библиотека TypeScript, которая использует LLM для извлечения структурированных данных из любой веб-страницы.
Вместо того чтобы писать собственную логику парсинга для каждого сайта, вы просто определяете схему, а пакет использует LLM для ее интеллектуального заполнения, анализируя содержимое страницы.
Библиотека была впервые выпущена в середине 2024 года, так что она все еще довольно новая. Однако на GitHub она уже набрала более 4 000 звезд, что показывает, как быстро она становится популярной:
Он идеально подходит для динамичных или непостоянных сайтов (например, электронной коммерции), где традиционные скреперы часто ломаются. В таких ситуациях LLM-скреппинг просто великолепен.
В деталях, основными функциями, поддерживаемыми llm-scraper
, являются:
- Интеграция с несколькими провайдерами LLM: Работает с локальными моделями (например, Ollama или GGUF) и облачными провайдерами (например, OpenAI и Vercel AI SDK).
- Извлечение данных на основе схем: Определите, что именно вы хотите извлечь, используя схемы Zod для четкой структуры и проверки.
- Полная безопасность типов: Разработан для TypeScript, поэтому вы получаете полную проверку типов во время компиляции.
- Построен на базе Playwright: Использует Playwright под капотом для управления браузером и получения содержимого страницы.
- Поддержка потоковой передачи данных: Можно передавать объекты в потоковом режиме во время скраппинга вместо того, чтобы ждать полного завершения извлечения.
- Генерация кода: Может динамически генерировать код скраппинга на основе вашей схемы и цели.
- Несколько вариантов форматирования содержимого страницы: Вы можете выбрать способ отправки содержимого страницы в LLM
Как использовать llm-scraper для веб-скрапинга
В этом учебном разделе вы узнаете, как использовать библиотеку llm-scraper
для создания скрепера, работающего на основе искусственного интеллекта. Целевым сайтом будет страница товара электронной коммерции с сайта ToScrape:
Это отличный пример, потому что создание сайтов электронной коммерции может быть непростым делом. Структура их страниц часто меняется, а разные товары могут иметь разную компоновку и информацию. В связи с этим написание статической логики парсинга является сложной и не очень эффективной задачей. Таким образом, искусственный интеллект определенно может помочь.
Выполните следующие шаги, чтобы создать скребок на базе LLM!
Пререквизиты
Чтобы следовать этому руководству, вам понадобятся:
- Node.js установлен на вашей машине
- Ключ API OpenAI (или ключ от аналогичного провайдера, например Groq)
- Базовое понимание TypeScript и асинхронного программирования
Шаг №1: Настройка проекта
Прежде чем приступить к работе, убедитесь, что у вас локально установлена последняя LTS-версия Node.js. Если нет, скачайте ее с официального сайта и установите.
Теперь создайте проект для вашего скрепера и перейдите к нему в терминале:
mkdir llm-scraper-project
cd llm-scraper-project
Внутри вашего проекта выполните следующую команду, чтобы инициализировать пустой проект Node.js:
npm init -y
Откройте файл package.json
, созданный командой выше, и убедитесь, что он содержит:
"type": "module"
Загрузите папку проекта llm-scraper-project
в вашу любимую IDE TypeScript, например Visual Studio Code.
Затем установите TypeScript как зависимость dev:
npm install typescript --save-dev
После установки TypeScript инициализируйте проект TypeScript, выполнив команду:
npx tsc --init
В папке вашего проекта появится файл tsconfig.json
. Откройте его и замените на:
{
"compilerOptions": {
"module": "ESNext",
"target": "ESNext",
"moduleResolution": "node",
"esModuleInterop": true,
"allowSyntheticDefaultImports": true,
"strict": true,
"skipLibCheck": true
}
}
Теперь добавьте файл scraper.ts
в свой проект:
Этот файл вскоре будет содержать логику извлечения данных из llm-scraper
. Поскольку скрипт будет использовать асинхронную логику TypeScript, инициализируйте внутри него асинхронную функцию:
async function llmScraping() {
// your LLM scraping logic...
}
llmScraping()
Замечательно! Вы полностью настроены и готовы приступить к созданию своего скрепера на базе ИИ.
Шаг № 2: Установите библиотеки, созданные на основе скрапа
Для своей работы llm-scraper
полагается на следующие две дополнительные библиотеки:
- Zod: Библиотека объявления и проверки схем на основе TypeScript.
- Playwright: Библиотека для автоматизации браузеров Chromium, Firefox и WebKit с единым API.
Установите их вместе с llm-scraper
с помощью следующей команды:
npm install zod playwright llm-scraper
Для Playwright требуются некоторые дополнительные зависимости (например, двоичные файлы браузера). Установите их с помощью:
npx playwright install
Теперь импортируйте Zod и Playwright в файл scraper.ts:
import { z } from "zod"
import { chromium } from "playwright"
import LLMScraper from "llm-scraper"
Отлично! Теперь у вас есть все необходимые библиотеки, чтобы начать работу с веб-скраппингом LLM на TypeScript.
Шаг № 3: Настройка OpenAI
llm-scraper
поддерживает несколько LLM-провайдеров, включая OpenAI, Groq, Ollama и GGUF. В данном случае мы будем использовать OpenAI. Если вы еще не сделали этого, не забудьте получить ключ API OpenAI.
Сначала установите клиент OpenAI JavaScript:
npm install @ai-sdk/openai
Затем импортируйте его в свой код и используйте для инициализации модели LLM в функции llmScraping()
:
// other imports...
import { openai } from "@ai-sdk/openai"
// ...
const llm = openai.chat("gpt-4o")
Для получения информации о другой интеграции обратитесь к официальной документации по llm-scraper`
.
Чтобы избежать жесткого кодирования ключа OpenAI в вашем коде, установите dotenv
:
npm install dotenv
Импортируйте dotenv
в файл scraper.ts
и вызовите dotenv.config()
для загрузки переменных окружения:
// other imports...
import * as dotenv from "dotenv"
// ...
dotenv.config()
Это позволяет загружать переменные окружения, например, ваш ключ OpenAI API, из файлов .env
. Итак, добавьте файл .env
в свой проект:
Откройте его и добавьте свой ключ API OpenAI, как показано ниже:
OPENAI_API_KEY="<YOUR_OPENAI_KEY>"
Замените значением вашего ключа Open AI
Обратите внимание, что не нужно вручную считывать переменную в коде. Это связано с тем, что @ai-sdk/openai
автоматически пытается прочитать переменную окружения OPENAI_KEY
.
Потрясающе! Интеграция LLM завершена.
Шаг № 4: Подключитесь к целевой странице
llm-scraper
использует Playwright в качестве механизма автоматизации браузера для извлечения HTML-содержимого веб-страниц. Чтобы начать работу, добавьте следующие строки кода внутри llmScraping()
:
- Инициализация браузера Chromium
- Откройте новую страницу
- Проинструктируйте драматурга посетить целевую страницу
Добейтесь этого с помощью:
const browser = await chromium.launch()
const page = await browser.newPage()
await page.goto("https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html")
В конце не забудьте закрыть браузер и освободить его ресурсы:
await page.close()
await browser.close()
Если вы не знакомы с этим процессом, прочитайте наше руководство по веб-скреппингу в Playwright.
Шаг #5: Определите схему данных
Теперь llm-scraper
работает, подавая базовой модели LLM запрос – оперируя содержимым, извлеченным из страницы с помощью Playwright, – на извлечение структурированных данных, определенных в конкретной модели данных.
Именно здесь на помощь приходит Zod, помогая вам определить модель данных на TypeScript. Чтобы понять, как должна выглядеть схема собранных вами данных, откройте целевой сайт в браузере и начните с анализа верхнего уровня страницы:
Отсюда вы должны извлечь следующие данные:
- Название
- Цена
- Состояние запасов
- Количество
- Описание
Затем перейдите к последнему разделу страницы:
Здесь вам будет интересно:
- UPC (универсальный код продукта)
- Тип продукта
- Налог
- Количество отзывов
Соедините все это вместе, и вы получите следующую схему продукта:
const productSchema = z.object({
title: z.string().describe("The name of the product"),
price: z.string().describe("The price of the product, typically formatted as a string like '£19.99'"),
stock: z.string().describe("The availability status of the product, such as 'In Stock' or 'Out of Stock'"),
quantity: z.string().describe("The specific quantity of products available in stock"),
description: z.string().describe("A detailed description of the product, including features and specifications"),
upc: z.string().describe("The Universal Product Code (UPC) to uniquely identify the product"),
productType: z.string().describe("The category or type of the product, such as 'Books', 'Clothing', etc."),
tax: z.string().describe("Information about the applicable tax amount for the product"),
reviews: z.number().describe("The number of reviews the product has received"),
})
Совет: Не забудьте описать свою схему, так как это поможет модели LLM понять, что она должна делать с данными.
Фантастика! Вы готовы к запуску задачи скрапирования с помощью ИИ в llm-scraper
.
Шаг #6: Запустите задачу скрапирования
Используйте интеграцию LLM, которую вы определили в шаге 3, чтобы создать объект LLMScraper
:
const scraper = new LLMScraper(llm)
Это основной объект библиотеки llm-scraper
, который отвечает за выполнение задач по скраппингу с помощью искусственного интеллекта.
Затем запустите скребок следующим образом:
const { data } = await scraper.run(page, productSchema, {
format: "markdown",
})
Параметр format
определяет, как содержимое страницы передается в LLM. Возможны следующие значения:
"html"
: Необработанный HTML страницы."текст"
: Весь текстовый контент, извлеченный из страницы."markdown"
: HTML-содержимое, преобразованное в Markdown."cleanup"
: Очищенная версия текста, извлеченного со страницы."изображение"
: Снимок экрана страницы.
Примечание: При необходимости вы также можете предоставить пользовательскую функцию для управления форматированием содержимого.
Как уже говорилось в руководстве “Почему новые агенты ИИ выбирают Markdown, а не HTML?“, использование формата Markdown – разумный выбор, поскольку он позволяет экономить токены и ускоряет процесс скраппинга.
Наконец, функция scraper.run()
возвращает объект, соответствующий ожидаемой схеме Zod.
Отлично! Ваша задача по скраппингу с помощью искусственного интеллекта выполнена.
Шаг № 7: Экспорт собранных данных
В настоящее время отсканированные данные хранятся в объекте JavaScript. Чтобы упростить доступ, анализ и обмен данными, экспортируйте их в файл JSON, как показано ниже:
const jsonData = JSON.stringify(data, null, 4)
await fs.writeFile("product.json", jsonData, "utf8")
Обратите внимание, что для этого вам не нужны никакие внешние библиотеки. Просто добавьте следующий импорт в верхнюю часть файла scraper.ts
:
import { promises as fs } from "fs"
Шаг № 8: Соберите все вместе
Теперь файл scraper.ts
должен содержать:
import { z } from "zod"
import { chromium } from "playwright"
import LLMScraper from "llm-scraper"
import { openai } from "@ai-sdk/openai"
import * as dotenv from "dotenv"
import { promises as fs } from "fs"
// load the environment variables from the local .env file
dotenv.config()
async function llmScraping() {
// initialize the LLM engine
const llm = openai.chat("gpt-4o")
// launch a browser instance and open a new page
const browser = await chromium.launch()
const page = await browser.newPage()
// navigate to the target e-commerce product page
await page.goto("https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html")
// define the product schema
const productSchema = z.object({
title: z.string().describe("The name of the product"),
price: z.string().describe("The price of the product, typically formatted as a string like '£19.99'"),
stock: z.string().describe("The availability status of the product, such as 'In Stock' or 'Out of Stock'"),
quantity: z.string().describe("The specific quantity of products available in stock"),
description: z.string().describe("A detailed description of the product, including features and specifications"),
upc: z.string().describe("The Universal Product Code (UPC) to uniquely identify the product"),
productType: z.string().describe("The category or type of the product, such as 'Books', 'Clothing', etc."),
tax: z.string().describe("Information about the applicable tax amount for the product"),
reviews: z.number().describe("The number of reviews the product has received"),
})
// create a new LLMScraper instance
const scraper = new LLMScraper(llm)
// run the LLM scraper
const { data } = await scraper.run(page, productSchema, {
format: "markdown", // or "html", "text", etc.
})
// conver the scraped data to a JSON string
const jsonData = JSON.stringify(data, null, 4)
// populate an output file with the JSON string
await fs.writeFile("product.json", jsonData, "utf8")
// close the page and the browser and release their resources
await page.close()
await browser.close()
}
llmScraping()
Как видите, llm-scraper
позволяет вам определить сценарий скраппинга на основе JavaScript в несколько строк кода.
С помощью этой команды скомпилируйте сценарий из TypeScript в JavaScript:
npx tsc
В папке вашего проекта появится файл scraper.js
. Выполните его с помощью:
node scraper.js
После завершения работы скрипта в папке проекта появится файл product.json
.
Откройте его, и вы увидите что-то вроде этого:
{
"title": "A Light in the Attic",
"price": "£51.77",
"stock": "In Stock",
"quantity": "22",
"description": "It's hard to imagine a world without A Light in the Attic. This now-classic collection of poetry and drawings from Shel Silverstein celebrates its 20th anniversary with this special edition. Silverstein's humorous and creative verse can amuse the dowdiest of readers. Lemon-faced adults and fidgety kids sit still and read these rhythmic words and laugh and smile and love that Silverstein. Need proof of his genius? Rockabye Rockabye baby, in the treetop Don't you know a treetop Is no safe place to rock? And who put you up there, And your cradle, too? Baby, I think someone down here's Got it in for you. Shel, you never sounded so good.",
"upc": "a897fe39b1053632",
"productType": "Books",
"tax": "£0.00",
"reviews": 0
}
Этот файл содержит именно ту информацию, которая отображается на странице продукта, на который вы нацелились. Как видите, данные были извлечены без использования какой-либо пользовательской логики парсинга, благодаря силе LLM. Отличная работа!
Экстра: Генерация кода с помощью llm-scraper
llm-scraper
также имеет возможность генерировать логику разбора данных Playwright, учитывая схему. Это возможно благодаря функции generate()
.
Смотрите пример в приведенном ниже фрагменте:
const { code } = await scraper.generate(page, productSchema)
Как вы можете видеть, он принимает объект страницы Playwright и схему Zod, а затем возвращает строку, содержащую сгенерированный код Playwright. В данном случае на выходе получаем:
(function() {
function extractData() {
const title = document.querySelector('h1').innerText;
const price = document.querySelector('.price_color').innerText;
const stockText = document.querySelector('.instock.availability').innerText.trim();
const stock = stockText.includes('In stock') ? 'In Stock' : 'Out of Stock';
const quantityMatch = stockText.match(/\d+/);
const quantity = quantityMatch ? quantityMatch[0] : '0';
const description = document.querySelector('#product_description ~ p').innerText;
const upc = document.querySelector('th:contains("UPC") + td').innerText;
const productType = document.querySelector('th:contains("Product Type") + td').innerText;
const tax = document.querySelector('th:contains("Tax") + td').innerText;
const reviews = parseInt(document.querySelector('th:contains("Number of reviews") + td').innerText, 10);
return {
title,
price,
stock,
quantity,
description,
upc,
productType,
tax,
reviews
};
}
const data = extractData();
console.log(data);
})()
Затем вы можете выполнить этот сгенерированный код JavaScript программно и проанализировать результат с помощью:
const result = await page.evaluate(code)
const data = schema.parse(result)
Объект данных
будет содержать тот же результат, что и данные
, полученные на шаге № 6 предыдущей главы.
llm-scraper
Альтернативы для LLM-скрапинга
llm-scraper
– не единственная библиотека, доступная для скраппинга на основе LLM. Среди других заслуживающих внимания альтернатив можно назвать следующие:
- Crawl4AI: библиотека на языке Python для создания молниеносных, готовых к искусственному интеллекту агентов по сбору информации в Интернете и конвейеров данных. Она очень гибкая и оптимизирована для разработчиков, чтобы развертывать ее со скоростью и точностью. Вы можете увидеть ее в действии в нашем учебном пособии по скраппингу на Crawl4AI.
- ScrapeGraphAI: библиотека для веб-скрейпинга на Python, которая сочетает в себе LLM и прямую графовую логику для построения конвейеров скрепинга для веб-сайтов и локальных документов (таких как XML, HTML, JSON и Markdown). Узнайте об этом в нашем руководстве по скрапингу с помощью ScrapeGraphAI.
Ограничения данного подхода к веб-скрапингу
ToScrape, целевой сайт, который мы использовали в этой статье, – как следует из названия, это просто песочница, в которой приветствуются скрипты для скрапинга. К сожалению, при использовании llm-scraper
на реальных сайтах все может оказаться гораздо сложнее…
Почему? Потому что компании, занимающиеся электронной коммерцией и онлайн-бизнесом, знают, насколько ценны их данные, и прилагают все усилия для их защиты. Это верно, даже если эти данные находятся в открытом доступе на страницах их товаров.
В результате большинство платформ электронной коммерции применяют меры по борьбе с ботами и скреперами, чтобы блокировать автоматические краулеры. Эти методы могут остановить даже скреперы, основанные на инструментах автоматизации браузеров, таких как Playwright, как и llm-scraper
.
Мы говорим о таких средствах защиты, как печально известная CAPTCHA от Amazon, которой достаточно, чтобы остановить большинство ботов:
Даже если вам удастся обойти CAPTCHA с помощью Playwright, другие проблемы, такие как запрет IP-адресов, вызванный слишком большим количеством автоматических запросов, могут остановить вашу операцию по скраппингу.
На данный момент решение заключается не в том, чтобы бесконечно настраивать ваш скрипт, делая его более сложным. Идея заключается в том, чтобы использовать правильные инструменты.
Если интегрировать Playwright с браузером, специально разработанным для веб-скрапинга, таким как Scraping Browser, всестанет намного проще. Это решение представляет собой облачный браузер, оптимизированный для скрапинга. Он обеспечивает ротацию IP-адресов, автоматические повторные попытки, продвинутые механизмы обхода ботов и даже встроенную функцию решения CAPTCHA, и все это без необходимости самостоятельно управлять инфраструктурой.
Интегрируйте браузер для скрапинга с Playwright в llm-scraper
так же, как и любой другой браузер, как объясняется в нашей документации.
Заключение
В этом блоге вы узнали, что предлагает llm-scraper
и как с его помощью создать скрипт для скраппинга на основе искусственного интеллекта на TypeScript. Благодаря интеграции с LLM, вы можете скрапировать сайты со сложной или динамической структурой страниц.
Как мы уже говорили, самый эффективный способ избежать блокировки – использовать его вместе со Scraping Browser от Bright Data, который поставляется со встроенным решателем CAPTCHA и многими другими возможностями обхода антиботов.
Если вы хотите создать агента искусственного интеллекта непосредственно на основе этого решения, обратите внимание на Agent Browser. Это решение выполняет управляемые агентами рабочие процессы на удаленных браузерах, которые никогда не блокируются. Оно бесконечно масштабируется и работает на базе самой надежной в мире прокси-сети.
Создайте бесплатную учетную запись Bright Data уже сегодня и изучите наши решения по сбору данных и скрапбукингу, которые помогут вам в развитии искусственного интеллекта!
Кредитная карта не требуется