Scrape умнее, не сложнее: пусть MCP и AI напишут ваш следующий скребок для вас

Scrape умнее, не сложнее: пусть MCP и AI напишут ваш следующий скребок для вас

15 июля 2025 г.

В прошлых эпизодахЛабораторная сериянаКлуб сетиМы использовали FireCRAWL, чтобы соскрести содержание этого информационного бюллетеня, векторного DB, такого как PineCone для хранения отметки статей, и API OpenAI для получения информации и добавления контекста к нашей подсказке для получения лучших ответов.

Этот подход имеет ограничения. Размер окна контекста (объем информации, которую мы можем включить в подсказку) ограничен, поэтому ответы не всегда были хорошими.

Поскольку ландшафт искусственного интеллекта изменится через несколько месяцев, кажется, что использование тряпки и Pinecone - это старая школа. Сегодня новое модное словоПротокол контекста модели (MCP)Поэтому я провели этот небольшой эксперимент, чтобы увидеть, как MCP можно использовать для соскоб.

Что такое модельный протокол контекста?

АПротокол контекста модели (MCP)является открытым стандартом, изначально разработанным Anpropic, который позволяет крупным языковым моделям (LLMS) взаимодействовать с внешними инструментами и данными через стандартизированный интерфейс. По сути, MCP предоставляетУниверсальный разъемМежду моделями ИИ и системами, где живет данные. Вместо создания пользовательских интеграций для каждого источника данных или инструмента для очистки, разработчики могут разоблачить свои данные или функциональность через сервер MCP. Помощники искусственного интеллекта (клиенты MCP) могут последовательно запрашивать эти ресурсы, и это стандартизированное двустороннее соединение обогащает необработанное содержание метадатами, контекстом и инструкциями, чтобы модели ИИ могли более эффективно интерпретировать информацию.

Но как это работает?

MCP следует архитектуре клиента-сервер: приложение-хост (например, IDE или AI Assistant) работает MCPклиент(Клод, курсор и т. Д.), Который подключается через протокол MCP с одним или несколькими MCPсерверыПолем Каждый сервер взаимодействует с конкретным источником данных или инструментом (например, базой данных, файловой системой или веб -скребком) на вашей локальной машине или сети, предоставляя структурированный контекст или действия для LLM.

MCP -сервер может разоблачитьресурсы(только для чтения контекст данных аналогично получению конечных точек) иинструменты(Действия или функции Модель может привести к аналогичности для публикации конечных точек) на LLM.

Антрический MCP с открытым исходным кодом в начале 2024 года, чтобы поощрять в промышленности усыновление. Цель состояла в том, чтобы установитьОбщая структура для общения AI-to-Tool, уменьшая зависимость от проприетарных API и делает интеграции искусственного интеллекта более модульной и совместимой.

Эта структурированная обработка контекста улучшает простые подсказки. Модель больше не получает капля текста; Вместо этого он может загружать данные с помощью ресурсов и инструментов вызовов с четко определенными входами/выходами. Таким образом, MCP предоставляет стандартизированный, надежный способ подачи контекста в модели ИИ и получение действий/результатов, что особенно мощно в сложных задачах, таких как сети.

Зачем использовать MCP?

Как мы видели в предыдущих постах, используя RAG, одна задача заключалась в добавлении загруженной статьи в подсказку, поскольку размер контекста ограничен. Мы пробовали различные решения, например, разделение статей на куски на Pinecone, а затем сохранили только резюме, сделанную с OpenAI, чтобы уменьшить его длину.

Используя MCP, особенно в этом случае, где мы используем его внутри Cursor IDE, мы можем создать инструмент, который извлекает HTML и сохраняет его в файл, который можно прочитать и разбить курсором и использовать для генерации XPath.

Другим интересным аспектом использования MCP является то, что мы смешиваем программирование и быстрое разработку. Фактически, создание инструмента MCP подобно созданию функции в нашем коде: как только мы создали подсказку в IDE, это оценивается и называет наши инструменты с необходимым аргументом (например, URL -адресом, который предполагается), догадаемого из нашей подсказки. Вместо этого этот инструмент является запрограммированной функцией, поэтому не пушистость подсказки не существует, но, учитывая вход, мы знаем выход, который мы можем ожидать. Это здорово, потому что это снижает неопределенность всего процесса и в то же время открывает множество вариантов использования для обогащения контекста вашего чата с помощью LLM.

И последнее, но не менее важное: MCP является стандартом, и теоретически, как только мы получим сервер, мы могли бы подключить его к любой модели и инструменту, который поддерживает его. Тем не менее, тот факт, что OpenAI в настоящее время не поддерживает, это не является хорошим признаком распространения протокола.

Что мы собираемся использовать MCP

Мы будем использовать две ключевые технологии для реализации нашего решения:MCP Python SDKиКамуфоксПолем

MCP Python SDK.MCP Python SDK является официальной библиотекой для создания серверов MCP (и клиентов) в Python. Он реализует полную спецификацию MCP, обрабатывая все базовые сообщения протокола, чтобы вы могли сосредоточиться на определении ресурсов и инструментов, которые вам нужны.

С помощью этого SDK вы можете создать сервер MCP всего за несколько строк кода. Он обеспечивает высокий уровеньFASTMCPКласс сервера, который управляет подключениями и позволяет регистрировать функции в качестве инструментов или ресурсов через декораторы. Например, вы можете аннотировать функцию@mcp.tool ()выставить его на модель в качестве действенного инструмента.

SDK упаковывает результат функции и отправляет ее обратно клиенту ИИ в постоянном формате. Таким образом, настройка сервера MCP, который может подавать контекст в LLMS или выполнять задачи от их имени, проста.

Камуфокс для HTML -поиска.При соскобке в Интернете, получение необработанного HTML от целевых страниц (особенно те, у кого антисхватывающие меры или тяжелый JavaScript), является половиной битвы. Я решил использовать Camoufox, который представляет собой инструмент просматривания стелсов с открытым исходным кодом, предназначенный для таких сценариев, чтобы быть почти уверенным в том, чтобы получить HTML с каждой страницы. Это особенно верно, потому что MCP работает локально на моей машине, поэтому мне не понадобится какого -либо прокси. Вдобавок к своим скрытным возможностям, я хотел использовать камуфокс для создания логики MCP от 0. Если вы хотите сэкономить время, вы можете использоватьMCP -сервер BrowserBaseилиГипербрансзерПолем У них есть несколько предварительно построенных инструментов, таких как извлечение данных и взаимодействие с страницей, что облегчает нам жизнь.

Техническая реализация сервера MCP для написания скребка Camoufox

Теперь мы создадим сервер MCP, который поможет нам написать скребок Camoufox за три шага. Каждый из этапов процесса имеет свой собственный инструмент:

  • fetch_page_contentбудет инструмент, который открывает камуфокс и хранит HTML целевой страницы в файле.

  • генерировать_xpathsБудет инструмент, который считывает файл HTML и, учитывая шаблон выходных данных, создает селекторы, снова сохраняя их в файл. Вот почему мы хотим, чтобы он достаточно гибкий, чтобы обрабатывать различные типы страниц (например, страница списка продуктов и страницу сведений о продукте в электронной коммерции).

  • write_camoufox_scraperбудет инструмент, который считывает селекторы и шаблон камуфус -паука (Camoufox_template.py) и создает новый, основанный на этом и только что созданные селекторы.

Код сервера (xpath_server.py) будет сохранен в репозитории в папке 79.mcp/mcpfiles.

Шаг 1: Настройка окружающей среды

Во -первых, убедитесь, что у вас естьPython 3.10+Установили и установили необходимые пакеты. Нам понадобится MCP SDK и Camouf, которые вы можете установить через PIP.

pip install mcp camoufox 

АMCPПакет включает в себя MCP Python SDK и CLI Tool.Камуфоксможет потребоваться дополнительный шаг, чтобы получить двоичный файл браузера (например, запускPython -m Camoufox FetchЧтобы загрузить Stealth Firefox - обратитесь к документам Camoufox для деталей). После того, как они будут установлены, вы готовы написать код сервера.

Шаг 2: Инициализировать сервер MCP

Создайте новый сценарий Python (в репозитории это будетxpath_server.py) В этом скрипте мы инициализируем сервер MCP и определим наши инструменты. Использование MCP SDK простое:

from mcp.server.fastmcp import FastMCP
import asyncio
from camoufox.async_api import AsyncCamoufox
import time
import os

mcp = FastMCP("Scrapy XPath Generator")


.....
coded tools
....

if __name__ == "__main__":
	# Initialize and run the server
	mcp.run(transport='stdio')

Этого достаточно для настройки пустого сервера MCP.

Шаг 3: Реализация HTML -поиска через Camoufox

Нам нужен инструмент, который, учитывая URL, получает HTML -контент страницы. Мы будем использовать Camoufox, чтобы сделать это скрытно. Давайте определим MCPинструментназываетсяfetch_page_content:

HTML_FILE_PATH = "/Users/pierluigivinciguerra/TWSC/Code/TheWebScrapingClub/79.MCP/downloaded_page.html"  # File to store the downloaded HTML
CAMOUFOX_FILE_PATH = "/Users/pierluigivinciguerra/TWSC/Code/TheWebScrapingClub/79.MCP/camoufox_template.py"

@mcp.tool()
async def fetch_page_content(url: str) -> str:
	global latest_html

	"""Fetch page HTML using Camoufox stealth browser."""
	print(f"[DEBUG] Fetching URL: {url}")
	try:
		async with AsyncCamoufox(humanize=True) as browser:
			page = await browser.new_page()
			await page.goto(url)
			time.sleep(10)
			latest_html = await page.content()
			with open(HTML_FILE_PATH, "w", encoding="utf-8") as f:
				f.write(latest_html)
			print("[DEBUG] HTML stored for later use")
			return "HTML fetched and stored successfully."
	except Exception as e:
		print(f"[ERROR] {e}")
		return f"Error fetching page: {str(e)}"

За исключением декоратора, это простой скребок с камуфаксом, который открывает URL -адрес, который мы передадим в подсказке внутри курсора, и хранит HTML -код в файле.

Шаг 4: Сгенерировать селекторы XPath на основе шаблона

Второй инструмент, который нам нужен, анализирует HTML, и производит селекторы XPath для данных, которые мы хотим поцарапать. Мы создадим инструмент,генерировать_xpaths,Это требует идентификатора шаблона (чтобы указать, какую страницу или шаблон извлечения использовать) в качестве аргумента.

На основе шаблона эта функция выведет соответствующие выражения XPath. Например, у нас может быть один шаблон для страницы списка продуктов (PLP, страница с перечисленными несколькими продуктами) и другой для страницы сведений о продукте (ПДП, страница с деталями одного продукта).

@mcp.tool()
def generate_xpaths(template: str) -> dict:
	"""Write XPATH selectors for the requested fields using the downloaded HTML file."""

	if not os.path.exists(HTML_FILE_PATH):
		return {"error": f"No HTML file found. Run fetch_page_content() first."}
	
	if template.lower() == "plp":
		fields = "product title, product link, product price, product image, product code"
	elif template.lower() == "pdp":
		fields = "product title, product price, product description, product image, product color, product size, product code"
	else:
		return {"error": "Unknown template type"}

	# Return the HTML and requested fields so Cursor can analyze them
	return {
		"message": "Print the XPath expressions for the requested fields using the variable latest_html.",
		"requested_fields": fields
	}

В этом случае мы просто определяем нужную структуру вывода и поля, для которых мы хотим создать селекторы.

Шаг 5: Создайте новый скребок Camoufox

Теперь, когда у нас есть селекторы, мы хотим объединить шаблон скребка камуфакса (Camoufox_template.py) с селекторами, чтобы написать скребок с желаемой структурой вывода. Я узнал, что использование шаблона скребков камуфкс необходимо, потому что без него генерируемый код обычно является галлюцинацией и не работает.

@mcp.tool()
def write_camoufox_scraper(template: str, url: str) -> dict:
	print(f"[DEBUG] Writing scraper for template: {template} and URL: {url}")
	"""Reads file Camoufox_template.py and uses it to write a new Camoufox scraper with the requested fields and starting from the url"""
	with open(CAMOUFOX_FILE_PATH, "r", encoding="utf-8") as f:
		latest_html = f.read()	
	return{"message": "Using this template, write a working scraper with the requested fields and starting URL"}
	
	

Вот и все; Теперь нам просто нужно настроить курсор для запуска этого сервера MCP и написать подсказку, которая использует его инструменты.

Шаг 6. Использование сервера MCP в курсоре

Одной из замечательных вещей в курсоре (IDE с AI) является его встроенная поддержка серверов MCP в качестве расширений возможностей ИИ. Мы интегрируем наш недавно созданный сервер MCP в курсор, чтобы помощник по искусственному искусству мог использовать его для автоматизации задач по скребке веб -скрещивания (например, генерация селекторов XPath для нас).

Чтобы подключить сервер в курсоре, выполните следующие действия:

  1. Откройте настройки курсора- В Cursor Ide перейдите в меню настроек.

  2. Перейдите на серверы MCP- В разделе «Функции» найдитеMCP -серверыПолем (Это требует курсора v0.45.6+ или более поздней версии, что поддерживает пользовательскую интеграцию сервера MCP.)

  3. Добавить новый сервер MCP- Нажмите кнопку «+ Добавить новый сервер MCP». Это побудит вас ввести детали для сервера.

  4. Настройте сервер- Дайте ему имя, например, «Сервер скраски XPATH» (любое дружественное имя). ДляТип, выбирать"command"(Поскольку мы запустим локальную команду для запуска сервера). ДляКомандованиеВведите команду, чтобы запустить ваш сервер. Например, если ваш скрипт сохраняется по адресу /path/to/xpath_server.py, вы можете поместить его в коробку.

  5. Сохранить и проверить- После ввода деталей сохраните конфигурацию. Вы должны увидеть ваш сервер MCP, указанный в разделе Cursor's MCP -серверов. Курсор теперь запустит этот сервер (через данную команду) и поддержат подключение к нему. Вы можете увидеть зеленый свет рядом с именем сервера MCP.

Как только сервер добавлен,Cursor's Assistant (агент композитора)может использовать новые инструменты автоматически, когда это необходимо.

На практике, когда вы спрашиваете в композиторе, «получите HTML из этого URL -адреса, а затем напишите селекторов XPath, используя PLP Template», помощник попросит вас подтвердить, чтобы запуститьfetch_page_contentинструмент, а затемгенерировать_xpathодин.

Наши тесты

После нескольких часов взаимодействия с подсказкой понять, как получить данные, необходимые надежным способом, я обнаружил, что этот выполняет большинство задач, которые я просил при использовании с сонетом Cloud 3.7 (подтверждая, что это один из лучших LLM для кодированияКак сказал Марко Винсгерра из ScrapeGraphai в наших последних интервью):

«Получите url @https: //www.gucci.com/it/it/ca/women/shoes-for-women-c-women-shoes
Затем напишите селекторы XPath, используя шаблон PLP. Используйте загруженный html (файл скачания hatml.html) для написания рабочих селекторов XPath.
Запишите селекторы в файле с названием selectors.txt.
Затем, учитывая ранее созданные селекторы, напишите скребок Camoufox, используя шаблон PLP и начальный URL. Если вы сомневаетесь, прочитайте файл selectors.txt, чтобы понять, сколько полей и какие селекторы вы должны использовать. Используйте файл camoufox_template.py для построения скребка и настраивайте его с помощью полей в выводе, считываемых шаблоном PLP ».

Cursor открывает вкладку Camoufox, просматривает URL, который я прошел, сохраняет HTML в файле, читает его, а затем генерирует селекторы XPath и сохраняет их в другом файле. Я решил сохранить результаты каждого шага внутри файла, чтобы следующие шаги могли прочитать их и в конечном итоге автоматически выбрасывать, а не передавать их контент в окне контекста, что может быть слишком маленьким.

Созданный скребок является исполняемым в первый раз, поэтому он технически верен, и результаты довольно хороши.

Скребок, ничего не говоря о веб -сайте, правильно заполнил все поля, что превосходно и больше, чем я ожидал от этого теста.

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

Второй вопрос, вероятно, скорее бывший инженер. Структура выходных данных - это не та, которую я ожидал, а та, которую помощник обнаружил в шаблоне скребка камуфокса. Я до сих пор не понял, как решить это, но я уверен, что в некотором роде это можно сделать.

Я думаю, что мы сделали на сегодня. В следующем эпизоде мы продолжим в нашем путешествии, чтобы сделать курсор нашего помощника по искусственному искусству в Интернете.


Статья является частью«Лаборатория»серияПьерлуиджи ВинсгуерраПолем Проверьте егоПодмазочныйСтраница для получения дополнительных знаний о скребке.


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE