Блог Froxy | Новости, полезные статьи о использовании прокси

Как использовать ChatGPT для веб-скрапинга с ИИ

Written by Команда Froxy | 18.06.2025 9:00:00

Крупные сайты и сервисы всё чаще переходят на JavaScript, что приводит к нечитаемой вёрстке и затрудняет навигацию по DOM-структуре. Более того, некоторые намеренно добавляют элементы усложнения в виде замены сквозных CSS-классов и атрибутов на уникальные идентификаторы. В итоге классические парсеры оказываются бессильными — вы не можете предугадать как будет выглядеть нужный вам элемент на следующей аналогичной странице, так как идентификаторы генерируются случайно и каждый раз указываются новые.

Даже использование headless-браузеров с разными вариантами обхода всех известных видов защит не сильно помогает.

Но технологии не стоят на месте, поэтому на каждое действие всегда найдётся противодействие. Спарсить можно всё, особенно, если привлечь на помощь ИИ. Этот материал о том, как использовать ChatGPT для web-парсинга.

Основные методы использования ChatGPT для парсинга

ChatGPT — это продукт компании OpenAI. Изначально это была только LLM-модель (то есть нейросеть, реализующая большую языковую модель, Large Language Model), обученная на огромных объёмах текстовых данных. Но сейчас LLM дополнили массой вспомогательных функций: поиск информации в сети, работа с загруженными файлами и документами, в том числе с изображениями (с использованием компьютерного зрения и распознаванием объектов на картинках), обработка аудио-потока (с нейросетью можно общаться голосом или привлекать для транскрибирования или перевода разговорной речи), а также генеративные технологии (когда нейросеть может создавать уникальные картинки по текстовым описаниям).

Читайте также: Лучшие инструменты для ИИ-анализа

ChatGPT сейчас — это своего рода терминал доступа ко всем нейросетям, созданным OpenAI, как единое окно входа для всех продуктов.

Для парсинга сайтов нам особо интересны:

  • API-интерфейс, чтобы к нейросети можно было обращаться напрямую из своих программ и скриптов, например, из парсеров, написанных на Python.
  • Возможности LLM для работы с кодом (в ответ на простой текстовый запрос нейросеть может написать работоспособные скрипты на разных языках программирования).
  • Компьютерное зрение — для распознавания скриншотов и полезной информации на них.

Начнём с web-скрапинга с использованием генеративного ИИ.

Использование ChatGPT в качестве генератора кода для парсеров

Что может быть проще, если вместо вас код парсера будет писать нейросеть? На GitHub и в других открытых источниках море примеров с кодом. Но обычному человеку нужно долго изучать их и искать что-то действительно рабочее, а ИИ уже обучен и готов выдать адекватный результат, причём на разных языках программирования: Python, Java, Go, JavaScript и пр. Нужно только правильно сформулировать свой запрос (он называется промт).

Используем ИИ для веб-парсинга: формулируем требования к коду.

  • Во-первых, можно просто попросить написать код для какой-то узкой задачи. ChatGPT с большой вероятностью выдаст рабочий результат и даже подскажет как запустить скрипт.
  • Во-вторых, можно просить нейросеть переделывать код сколько угодно раз, пока он не заработает или пока результат вас не устроит. В классическом чате ИИ запоминает контекст.
  • В-третьих, можно сформулировать требования к скрипту максимально точно — какие переменные должны быть на входе и какой формат данных должен быть на выходе. В этом случае с помощью ChatGPT можно написать даже очень сложный фреймворк. Из минусов — вам нужно хорошо разбираться в программировании и уметь проектировать большие системы кода. Технически ChatGPT здесь только поможет ускорить процесс (примерно, как продуктивный джуниор), делая большую часть работы за вас. Основная логика работы всё равно с вас.
  • В-четвёртых, ИИ можно попросить проверить ваш код на ошибки и дать рекомендации по исправлению.
  • И в-пятых, ChatGPT можно попросить поискать нужную вам информацию в интернете, в том числе примеры кода и готовых скриптов. С недавних пор ChatGPT вполне может заменить поисковик Google. Только нейросеть удобнее, так она даёт чёткий ответ, не отправляет вас изучать результаты поиска вручную. Ответ может быть в том числе в структурированном виде, только обозначьте схему.

Пример скрипта веб-скрапинга с использованием ИИ — его написал нам ChatGPT по запросу «простейший скрипт на Python для сбора данных из блоков People Also Ask в поисковой выдаче Google»:

import requestsfrom bs4 import BeautifulSoupimport urllib.parseimport timedef get_people_also_ask(query):headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"}query = urllib.parse.quote(query)url = f"https://www.google.com/search?q={query}"response = requests.get(url, headers=headers)if response.status_code != 200:print("Ошибка запроса:", response.status_code)return []soup = BeautifulSoup(response.text, "html.parser")results = []# Блоки "People Also Ask" часто имеют класс .related-question-pairfor item in soup.select(".related-question-pair"):question = item.get_text(strip=True)results.append(question)return results# Пример использованияquery = "как работает блокчейн"questions = get_people_also_ask(query)print("Люди также спрашивают:")for q in questions:print("-", q)

Можете не стараться, код всё равно не заработает (наш материал по парсингу People Also Ask). Но что примечательно, ChatGPT предварительно указывает на все возможные проблемы, включая наличие защиты со стороны Google, и рекомендует использовать прокси. Наше почтение.

Отдельно упоминаются готовые сервисы, которые предоставляют данные из поисковой выдачи при обращении по API. Жалко, что там не упоминается Froxy Scraper.

В коде имеются подробные комментарии на том языке, на котором вы оформите запрос к ИИ.

Иными словами, ChatGPT не просто выдал код, он предусмотрел все возможные нюансы и подводные камни. Пусть даже код и нерабочий. 😉

Пример №2:

Промт: Напиши скрипт на Python для парсинга данных о товаре со страницы https://www.scrapingcourse.com/ecommerce/product/adrienne-trek-jacket/, данные должны выгружаться в JSON, информация обо всех действиях и ошибках должна выводиться в лог, задействуй библиотеку Selenium.

Рекомендации ChatGPT:

Установить библиотеку Selenium командой «pip install selenium»

Итоговый скрипт:

import jsonimport loggingfrom selenium import webdriverfrom selenium.webdriver.chrome.service import Servicefrom selenium.webdriver.common.by import Byfrom selenium.common.exceptions import NoSuchElementException, WebDriverExceptionimport time# Настройка логированияlogging.basicConfig(filename="scraper.log",level=logging.INFO,format="%(asctime)s - %(levelname)s - %(message)s")def scrape_product(url):logging.info(f"Запуск скрипта для URL: {url}")# Настройка WebDriveroptions = webdriver.ChromeOptions()options.add_argument("--headless") # Открытие браузера в фоновом режимеdriver = Nonetry:service = Service() # Передайте путь к chromedriver при необходимости: Service('/path/to/chromedriver')driver = webdriver.Chrome(service=service, options=options)driver.get(url)time.sleep(2) # Пауза для загрузки страницы# Извлечение данных о товареproduct = {}try:product['name'] = driver.find_element(By.CSS_SELECTOR, 'h1.product_title').textexcept NoSuchElementException:product['name'] = Nonelogging.warning("Не удалось найти название товара")try:product['price'] = driver.find_element(By.CSS_SELECTOR, 'p.price').textexcept NoSuchElementException:product['price'] = Nonelogging.warning("Не удалось найти цену товара")try:product['description'] = driver.find_element(By.CSS_SELECTOR, 'div.woocommerce-Tabs-panel--description').textexcept NoSuchElementException:product['description'] = Nonelogging.warning("Не удалось найти описание товара")try:image = driver.find_element(By.CSS_SELECTOR, 'img.wp-post-image')product['image_url'] = image.get_attribute('src')except NoSuchElementException:product['image_url'] = Nonelogging.warning("Не удалось найти изображение товара")logging.info("Успешно собраны данные о товаре")# Сохранение в JSONwith open('product_data.json', 'w', encoding='utf-8') as f:json.dump(product, f, ensure_ascii=False, indent=4)logging.info("Данные успешно сохранены в product_data.json")return productexcept WebDriverException as e:logging.error(f"Ошибка WebDriver: {e}")finally:if driver:driver.quit()logging.info("WebDriver закрыт")# Запускif __name__ == "__main__":product_url = "https://www.scrapingcourse.com/ecommerce/product/adrienne-trek-jacket/"data = scrape_product(product_url)print("Результат парсинга:\n", json.dumps(data, indent=4, ensure_ascii=False))

А вот так выглядит собранная информация в консоли:

Форматированные данные выгрузились в файл «product_data.json» в папке со скриптом.

Работает!

Больше подробностей о библиотеке Selenium.

Распознавание скриншотов (web-скрапинг с использованием ИИ для мега-сложных сайтов)

Тот самый вариант, когда вы не можете найти паттернов в CSS-коде или прикрепиться к какому-либо конкретному элементу вёрстки, чтобы собрать данные. Если не понимаете, о чём речь, взгляните на классический алгоритм парсинга People Also Ask.

У ChatGPT есть система компьютерного зрения. ИИ вполне сносно определяет где и какой элемент страницы. Поэтому:

  • Нам достаточно сделать скриншот страницы.
  • Передать его на анализ в ChatGPT.
  • Попросить вернуть форматированные данные.

Пример скриншота:

Запрос к ChatGPT:

Верни информацию со скриншота форматированным:

{"name": "ТУТ НАЗВАНИЕ ТОВАРА","price": "ЦЕНА","description": "ОПИСАНИЕ ТОВАРА."}Реальный ответ ИИ:{"name": "Adrienne Trek Jacket","price": "$57.00","description": "You're ready for a cross-country jog or a coffee on the patio in the Adrienne Trek Jacket. Its style is unique with stand collar and drawstrings, and it fits like a jacket should.\n\n• gray 1/4 zip pullover.\n• Comfortable, relaxed fit.\n• Front zip for venting.\n• Spacious, kangaroo pockets.\n• 27\" body length.\n• 95% Organic Cotton / 5% Spandex."}

Впечатляет?

А давайте проверим парсинг пресловутого блока People Also Ask:

Скриншот:

Запрос: Верни форматированный список содержимого из блока People also ask

Результат:

{"people_also_ask": ["Are you allowed to scrape Google search results?","How to extract search results from Google?","What tool can I use to scrape Google search results?","Is it legal to scrape Google News?","Does Google ban scrapers?","Which content is not allowed on Google?","How to use Google Scraper?","How do I get top ten search results on Google?","What is an outsourced?","Is Google search a web scraper?","Is ZenRows free?","How do I scrape Google results?","Is it OK to scrape Google?","Can web scraping be detected?","What is firecrawl?","Does Google report suspicious searches?","Are any websites on Google illegal?","Why is Google redirecting my searches?","Is web scraping illegal?","Can ChatGPT scrape websites?","What is Amazon scraper?","How do I automate Google search results?","What is the best search engine?","How do I get all Google results?","Is scarperapi legit?","How to scrape Google Maps data?","Is Outscraper free?"]}

В общем, будущее наступило, выход за T800 и Skynet.

Резидентные прокси

Лучшие прокси-серверы для доступа к ценным данным со всего мира.

Начать с триала $1.99, 100Mb

Интеграция ChatGPT в конвейер парсинга

Почти все упомянутые операции можно выполнить по API-интерфейсу. Получается, что вы можете включить работу ИИ на отдельных этапах своего конвейера парсинга. Например:

  1. Python-скрипт будет последовательно обходить страницы сайта.
  2. Рендерить их в headless-браузере.
  3. Делать скриншоты.
  4. Передавать на анализ в ChatGPT.
  5. Принимать форматированные данные.
  6. Сохранять в таблицы или иным образом преобразовывать.

Более сложный формат:

  1. Скрипт может включать headless-браузер.
  2. Браузер будет отдавать результирующий код стартовой страницы сайта.
  3. Этот код будет передаваться на анализ в ChatGPT (без конвертации в изображения и т.п., только в чистом виде).
  4. В ответ ChatGPT будет возвращать список ссылок на дополнительные страницы сайта.
  5. На их основе будет строиться очередь основного парсинга.
  6. Далее скрипт будет обходить каждую ссылку.
  7. Данные со страницы нужно отдавать снова в ChatGPT.
  8. ChatGPT будет возвращать извлечённые данные в нужном формате + снова искать ссылки на обход (всё за одну итерацию).
  9. Форматированные данные будут заноситься в таблицу или выгружаться в файл(ы), а новые ссылки ставиться в очередь на обход.

Более предметная задача для ChatGPT:

  • Передать в ChatGPT ссылку на ролик, например, на YouTube или TikTok, или загрузить его в виде файла (MP4, MOV, AVI).
  • Попросить вернуть субтитры (нейросеть может сама извлечь звуковую дорожку и преобразовать её в текст).
  • Передать полученные субтитры снова на анализ, а взамен попросить их переделать в краткое описание или пересказ, оформить в виде форматированного текста (с выделением заголовков, списков и т.п.).
  • Включить ответ ChatGPT в очередь публикации на своём сайте или канале.

На выходе вы получаете не просто извлечённые данные, а готовые материалы для размещения. К ним даже можно попросить придумать Title и Description.

Пример реального кода для создания парсера, способного распознавать текст на изображениях (не забудьте установить сопутствующие библиотеки: «pip install --upgrade openai playwright» и «playwright install»):

import asyncioimport base64import openaiimport osimport jsonfrom playwright.async_api import async_playwright# === Конфигурация ===# Ключ либо берётся из соответствующей переменной вашей среды, либо его вписать прямо в кодapi_key = os.getenv("OPENAI_API_KEY") or "sk-..." # Замените на ваш API-ключclient = openai.OpenAI(api_key=api_key)# Тут нужно определить ваш поисковый запросquery = "scraping google search results"# Имя файла со скриншотом (если файл существует, он будет перезаписываться)screenshot_path = "google_search.png"# Имя файла для экспорта структурированных данных в JSON-форматеoutput_json_path = "people_also_ask.json"# === Рендеринг страницы Google и обработка CAPTCHA ===async def render_google_and_screenshot():async with async_playwright() as p:browser = await p.chromium.launch(headless=False) # Окно нужно для ручного ввода CAPTCHAcontext = await browser.new_context()page = await context.new_page()print("Loading Google Search...")await page.goto(f"https://www.google.com/search?q={query}", timeout=60000)while True:url = page.urlcontent = await page.content()captcha_detected = ("sorry" in url or"press and hold" in content.lower() or"мы обнаружили подозрительный" in content.lower() or"detected unusual traffic" in content.lower())if captcha_detected:print("The CAPTCHA has been detected. We are waiting for it to be completed manually...")await asyncio.sleep(5)else:print("CAPTCHA solved")breakprint("Taking a screenshot...")await page.screenshot(path=screenshot_path, full_page=True)await browser.close()# === Кодирование изображения ===def encode_image_to_base64(image_path):with open(image_path, "rb") as f:return base64.b64encode(f.read()).decode("utf-8")# === Вызов GPT-4 Vision через новый API ===def extract_people_also_ask(base64_image: str) -> str:response = client.chat.completions.create(model="gpt-4-vision-preview",messages=[{"role": "system", "content": "You extract structured data from screenshots."},{"role": "user","content": [{"type": "text","text": ("The image contains a Google search results page. Extract the list of questions from the 'People also ask' block. Return only the JSON format: {\"people_also_ask\": [questions...]}.")},{"type": "image_url","image_url": {"url": f"data:image/png;base64,{base64_image}"}}]}],max_tokens=1000)return response.choices[0].message.content# === Сохранение JSON ===def save_json(data_string, path):try:json_data = json.loads(data_string)with open(path, "w", encoding="utf-8") as f:json.dump(json_data, f, ensure_ascii=False, indent=2)print(f"The JSON is saved in {path}")except json.JSONDecodeError:print("Error parsing JSON. Answer:\n", data_string)# === Главный запуск ===async def main():await render_google_and_screenshot()base64_image = encode_image_to_base64(screenshot_path)print("Sending the image to GPT-4 Vision...")response_text = extract_people_also_ask(base64_image)save_json(response_text, output_json_path)if __name__ == "__main__":asyncio.run(main())

Скрипт работает с использованием библиотеки Playwright (драйвер для управления headless-браузерами). Парсер будет обращаться к поисковику Google, ждать решения капчи. Как только капча решена, будет создаваться полный скриншот страницы (если страница слишком долго подгружается, остановите процесс вручную). Этот скриншот отправляется по API в ChatGPT на распознавание. В ответ принимаются форматированные данные — JSON, только список запросов из блока «People also ask» (если ваш язык отличается от английского, измените название блока в скрипте и допишите свои текстовки, которые показываются на экране с капчей). Данные сохраняются в файл (его имя можно изменить на своё).

Вместо скриншотов можно отправлять весь исходный код страницы. Но его тоже желательно пропускать через Headless-браузер. Если этого не сделать, то часть JavaScript-скриптов не отработает и результирующий HTML будет неполным.

Пример кода такого ИИ-парсера:

import asyncioimport openaiimport osimport jsonfrom playwright.async_api import async_playwright# === Configuration ===api_key = os.getenv("OPENAI_API_KEY") or "sk-..." # Replace with your actual keyclient = openai.OpenAI(api_key=api_key)query = "scraping google search results"output_json_path = "people_also_ask.json"# === Load Google Search HTML ===async def get_google_html():async with async_playwright() as p:browser = await p.chromium.launch(headless=False)context = await browser.new_context()page = await context.new_page()print("[*] Loading Google Search...")await page.goto(f"https://www.google.com/search?q={query}", timeout=60000)# Wait for CAPTCHA to be manually solvedwhile True:url = page.urlcontent = await page.content()captcha_detected = ("sorry" in url or"press and hold" in content.lower() or"detected unusual traffic" in content.lower())if captcha_detected:print("[!] CAPTCHA detected. Waiting for manual resolution...")await asyncio.sleep(5)else:print("[✓] CAPTCHA cleared.")breakhtml = await page.content()await browser.close()return html# === Send HTML to GPT-4 ===def extract_questions_from_html(html: str) -> str:response = client.chat.completions.create(model="gpt-4o",messages=[{"role": "system", "content": "You extract structured data from raw HTML code."},{"role": "user", "content":"The following is the HTML content of a Google Search results page. ""Extract all questions from the 'People also ask' block only. ""Return the result strictly in JSON format: {\"people_also_ask\": [questions...]}.\n\n"+ html}],max_tokens=1000,temperature=0)return response.choices[0].message.content# === Save output to JSON file ===def save_json(data_string, path):try:json_data = json.loads(data_string)with open(path, "w", encoding="utf-8") as f:json.dump(json_data, f, ensure_ascii=False, indent=2)print(f"[✓] JSON saved to {path}")except json.JSONDecodeError:print("[!] Error: Could not parse JSON. GPT response:\n", data_string)# === Main entry point ===async def main():html = await get_google_html()print("[*] Sending HTML to GPT-4...")response_text = extract_questions_from_html(html)save_json(response_text, output_json_path)if __name__ == "__main__":asyncio.run(main())

Что можно автоматизировать с помощью GPT

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

  • Простое извлечение текста — из кода (форматированного или нет, например, если результирующий код отдаёт Selenium, Puppeteer или Playwright) или со скриншотов/изображений. Выходной формат может быть таким, как вы попросите (можно даже задать свою уникальную схему структурирования).
  • Поиск и фильтрация только определённых данных, ответ на вопросы по этим данным.
  • Преобразование данных — пересказ, сокращение, извлечение главных идей.
  • Генерация описаний и распознавание объектов на фото и скриншотах.
  • Распознавание текста на картинках.
  • Перевод на другие языки.
  • Поиск ошибок в текстах/данных/форматировании и их исправление.

Ограничения и ошибки

Первое и самое значимое ограничение — цена. Если использовать Chat GPT для web-парсинга, то все операции будут оцениваться в токенах. Причём считаются не только входящие данные (текст или изображения), но и выходящие (выходящие всегда дороже). Каждый промт тоже съедает токены, как входящие данные.

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

Распознавание изображений тарифицируется плюс-минус фиксировано — около 85 токенов.

Текст считается не по символам, а по сущностям. В разных языках соотношение разное. Выгоднее всего для английского: 1000 токенов ≈ 700—800 слов. В русском раза в 3 меньше.

В итоге обработка одного изображения будет обходиться около 500-1000 токенов, то есть примерно $0,01. Сотня скриншотов — около $1.

Тексты и HTML-код могут быть очень большимди, особенно, если отправлять код без предварительной очистки и выборки. Пусть каждая обработка — около 8000 токенов, тогда итоговая стоимость парсинга одной страницы — около $0,01. Сотня страниц — около $1 (применительно к gpt-4o).

Обратите внимание: тарифы на входящие и исходящие токены отличаются.

Но только на стоимости подводные камни не заканчиваются.

Проблемы с длинным HTML (токенизация)

Текущие актуальные лимиты токенов на один запрос по моделям (токены считаются в сумме ввод+вывод):

  • gpt-3.5-turbo — 16 385 токенов
  • gpt-4 — 8 192 токенов
  • gpt-4-turbo — 128 000 токенов

128 000 токенов ≈ 300 страниц текста (на английском).

Так как в HTML-коде токенов больше (слишком много элементов для анализа и понимания синтаксиса), то большие страницы, особенно, если в них есть CSS-стили и JavaScript-код, могут быстро «съесть» лимит.

А ещё хуже — полный код страницы вообще может не поместиться в один запрос.

Выхода из ситуации два:

  • Предварительно обрезать/удалять в коде ненужные элементы (CSS-стили, JS-код) или делать выборку на основе корневых тегов, идентификаторов и классов (например, отправлять на анализ только содержимое определённого DIV-контейнера).
  • Разбивать длинный код на чанки.

Подробнее о том, как разделять код на чанки внутри скрипта AI web скрапинга:

# Библиотека, которая отвечает за подсчёт токенов «на месте», до отправки в ChatGPTimport tiktoken# Основная функция «нарезки» на чанкиdef split_text_by_tokens(text, model="gpt-4", max_tokens=7000):encoding = tiktoken.encoding_for_model(model)tokens = encoding.encode(text)chunks = []while tokens:chunk_tokens = tokens[:max_tokens]chunk_text = encoding.decode(chunk_tokens)chunks.append(chunk_text)tokens = tokens[max_tokens:]return chunks# Пример того, как можно «нарезать» HTML на чанки с обозначенной функциейhtml_text = open("page.html", encoding="utf-8").read()chunks = split_text_by_tokens(html_text, model="gpt-4", max_tokens=7000)# Отправляем чанки в ChatGPTfor i, chunk in enumerate(chunks):response = client.chat.completions.create(model="gpt-4",messages=[{"role": "system", "content": "You're a helpful HTML parser."},{"role": "user", "content": f"Extract 'People also ask' questions from the following HTML:\n\n{chunk}"}],temperature=0,)print(response.choices[0].message.content)

GPT не всегда «понимает» структуру сайта

Представьте, что ваш скрипт ChatGPT web-парсинга не смог обработать капчу и вместо полного скриншота страницы отправил на обработку скрин с ошибкой. Но мы потребовали от нейросети определённую структуру ответа. ИИ не может отказать, поэтому «придумывает» ответ и возвращает его.

Хорошо, если поля просто окажутся пустыми. Но у разных моделей ИИ может быть разное поведение. «Приврать» в мелочах или по-крупному им не составит труда. Проверить и найти где конкретно ошибся парсер вы не сможете. Это же генеративная сеть.

По аналогии, если GPT неправильно поймёт ваш запрос, или данные будут плохо структурированными, то вы будете получать не ошибки, а то, что «придумает» или нафантазирует ИИ.

Ограничения API: частота запросов, время ответа

Лимит запросов, которые можно отправлять в единицу времени, зависит от используемой модели, типа доступа (платный или бесплатный) и варианта подписки.

  • GPT-4 Turbo — 500-1000 RPM (запросов в минуту) или 300 000-600 000 TPM (токенов в минуту)
  • GPT-3.5 Turbo — 3500+ RPM (запросов в минуту) или 3-5 млн. TPM (токенов в минуту)

Эти пределы вполне достижимы, если у вас крупный корпоративный проект, например, с задачами поточного парсинга конкурентов.

Не менее важны асинхронные ответы нейросети — нужно дождаться, пока она подумает над ответом.

В связи с этим мы рекомендуем добавить специальные задержки между API-запросами (чтобы не превышать частоту) и отслеживать коды ошибок. А ещё нужно обязательно позаботиться об асинхронной обработке ответов ChatGPT.

Продвинутые идеи интеграции

Большие языковые модели, как можно выяснить, при интеграции по API имеют свои недостатки. И речь не только об ограничениях длины сообщения и необходимости разбивки больших запросов на чанки. Большинство LLM не запоминают истории обращений по API. Соответственно, нужно тратить дополнительные токены, чтобы вернуть им «память» и нацелить на нужный контекст. В ChatGPT уже эту проблему исправили, но она есть в других LLM, подходящих для ИИ веб-парсинга.

В ChatGPT web-скрапинг не самая информативная обработка ошибок. А ещё для сложных процессов желательно реализовать обработку текущего состояния и разных переменных, детально настроить логирование, предварительный подсчёт токенов и пр. Всем этим могут заниматься специальные фреймворки и библиотеки.

Использование LangChain или LangGraph

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

LangGraph — это библиотека, которая облегчает обработку сложных разветвлённых сценариев общения с LLM, на основе графов (есть даже инструменты их визуализации).

Как итог, проще централизованно задавать стартовые настройки своего скрипта ChatGPT web-парсинга и облегчить (упростить) основной синтаксис обращения к LLM.

Встраивание GPT в конвейеры Scrapy

Scrapy — это мощный фреймворк для создания комплексных парсеров. Настройка своего краулера здесь занимает буквально несколько строк кода. Как запустить Scrapy в паре с прокси.

Но самое интересное то, что Scrapy легко интегрируется со смежными инструментами и библиотеками. Например, здесь можно подключить headless-браузеры и библиотеки, такие как Selenium или Playwright. Если каких-то интеграций нет в готовом виде, то их легко организовать на уровне кода. Например, веб-парсинг с ChatGPT можно встроить в пайплайн. Пример кода:

# pipelines.pyimport openaiimport loggingimport osclass ChatGPTProcessingPipeline:def __init__(self):self.client = openai.OpenAI(api_key=os.getenv("OPENAI_API_KEY"))self.model = "gpt-4o" # или gpt-3.5-turbodef process_item(self, item, spider):text_to_analyze = item.get("raw_html", "")if not text_to_analyze:logging.warning("Item has no raw_html")return itemtry:logging.info("Sending data to ChatGPT...")response = self.client.chat.completions.create(model=self.model,messages=[{"role": "system", "content": "You extract structured data from HTML."},{"role": "user", "content": f"Extract product name and features from the following HTML:\n{text_to_analyze}"}],temperature=0,max_tokens=1000)result = response.choices[0].message.contentitem["chatgpt_parsed"] = resultreturn itemexcept Exception as e:logging.error(f"ChatGPT API error: {e}")return item

Не забудьте подключить пайплайн в settings.py вашего краулера.

А так как парсинг через ChatGPT получается дорогим, логично обращаться к нему только в самых сложных случаях. Например, при распознавании изображений (Vision-модель) или для поиска информации при нечитаемой вёрстке.

Собирайте, очищайте, генерируйте описания и мета-теги (SEO-атрибуты) за один цикл

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

ChatGPT может реализовать большинство из обозначенных задач. ИИ может анализировать чистый HTML-код и за один запрос отдавать всю необходимую информацию: заголовки, мета-теги, описания товаров, цены, ссылки и пр. А так как данные возвращаются структурированными, их легко перенаправить в нужную точку выхода: JSON, CSV, MySQL и пр.

P.S. Не забывайте посчитать расход токенов

Заключение и рекомендации

ИИ и нейросети действительно способны решать массу прикладных задач: от распознавания образов на картинках до анализа исходного HTML-кода. При парсинге с ChatGPT можно не переживать о поиске CSS-классов, уникальных атрибутов или думать о том, как обойти защиту со случайными идентификаторами в коде.

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

Для создания и ротации цифровых отпечатков можно использовать антидетект-браузеры. А качественные ротируемые прокси можно получить у нас (сеть Froxy включает в себя свыше 10 млн. IP с таргетингом до города и оператора связи).

Если расчёт бюджета по API-токенам для ChatGPT веб-скрейпинга выходит в вашем случае слишком дорогим, то подумайте о предварительной очистке кода (удалении из него всего лишнего) или вообще о запуске своей локальной ИИ-модели. Например, DeepSeek, Qwen, Llama и т.п. Но не стоит забывать о расходах на покупку высокопроизводительного оборудования или на аренду подходящего хостинга.