
Agent de scraping pour API Web
Rétro-concevez l'API interne de n'importe quel site web avec le langage naturel
Les sites web modernes chargent les données via des appels AJAX cachés :
Strot analyse les sites web et découvre leurs appels API internes pour vous.
Ce que Strot fait réellement :
Obtenez l'expérience complète de Strot (interface web + API) instantanément :
En utilisant le navigateur Patchright
docker run -d --name browser-server -p 5678:5678 synacktra/patchright-headless-server
STROT_ANTHROPIC_API_KEY=sk-ant-apiXXXXXX \
docker compose -f https://raw.githubusercontent.com/vertexcover-io/strot/refs/heads/main/docker-compose.yml up
Ou, en utilisant le navigateur Steel
STROT_BROWSER_WS_URL=wss://connect.steel.dev?apiKey=ste-XXXXXX STROT_ANTHROPIC_API_KEY=sk-ant-apiXXXXXX \
docker compose -f https://raw.githubusercontent.com/vertexcover-io/strot/refs/heads/main/docker-compose.yml up
Ensuite, visitez :
pip install strot
Ou avec uv :
uv pip install strot
import strot
import asyncio
from pydantic import BaseModel
class Review(BaseModel):
title: str | None = None
username: str | None = None
rating: float | None = None
comment: str | None = None
date: str | None = None
async def get_reviews():
# Strot discovers the internal API that loads reviews
source = await strot.analyze(
url="https://www.getcleanpeople.com/product/fresh-clean-laundry-detergent/",
query="Customer reviews with ratings and comments",
output_schema=Review,
code_executor="e2b" # Defaults to "unsafe"
)
# Use the same API call the website uses, with full parameter control
async for reviews in source.generate_data(limit=500, offset=100, sortBy="date desc"):
for review in reviews:
print(f"{review['rating']}⭐ by {review['username']}: {review['comment']}")
if __name__ == "__main__":
asyncio.run(get_reviews())
import strot
import asyncio
from pydantic import BaseModel
class Product(BaseModel):
name: str | None = None
price: float | None = None
rating: float | None = None
availability: str | None = None
description: str | None = None
async def get_products():
# Strot finds the AJAX endpoint that loads product listings
source = await strot.analyze(
url="https://blinkit.com/cn/fresh-vegetables/cid/1487/1489",
query="Listed products with names and prices.",
output_schema=Product
)
# Set code executor of your choice into source
source.set_code_executor("e2b")
# Access all products with custom filtering and sorting
async for products in source.generate_data(limit=100, offset=0, category="vegetables", sortBy="price"):
for product in products:
print(f"{product['name']}: ${product['price']} ({product['rating']}⭐)")
if __name__ == "__main__":
asyncio.run(get_products())
Strot fournit un serveur MCP (Model Context Protocol) qui permet aux clients MCP comme Claude d'analyser directement les sites web et de découvrir leurs API internes.
git clone https://github.com/vertexcover-io/strot.git
cd strot && uv sync --group mcp
Définissez les variables d'environnement :
export STROT_ANTHROPIC_API_KEY=sk-ant-apiXXXXXX
export STROT_BROWSER_MODE_OR_WS_URL=headless # or 'headed' or ws://browser-url
Si vous souhaitez utiliser un navigateur hébergé, vous pouvez procéder comme suit :
Exécutez un serveur headless dans Docker
docker run -d --name browser-server -p 5678:5678 synacktra/patchright-headless-server
export STROT_BROWSER_MODE_OR_WS_URL=ws://localhost:5678/patchright
Ou, connectez-vous à un serveur de navigateur distant :
export STROT_BROWSER_MODE_OR_WS_URL=wss://...
$ uv run strotmcp
Usage: strotmcp COMMAND
╭─ Commands ─────────────────────────────────────────────╮
│ http Start an http server. │
│ sse Start an sse server. │
│ stdio Start a stdio server. │
│ streamable-http Start a streamable http server. │
╰────────────────────────────────────────────────────────╯
Transport stdio
claude mcp add strot-mcp "uv run strotmcp stdio" --transport stdio \
--env STROT_ANTHROPIC_API_KEY=$STROT_ANTHROPIC_API_KEY STROT_BROWSER_MODE_OR_WS_URL=$STROT_BROWSER_MODE_OR_WS_URL
Transports sse, http, streamable-http
Exécutez le serveur MCP avec le transport souhaité dans un terminal séparé :
uv run strotmcp sse --port 8888
# uv run strotmcp http --host 0.0.0.0
# uv run strotmcp streamable-http --host 127.0.0.1 --port 8777
Ajoutez le serveur MCP à Claude :
claude mcp add strot-mcp http://127.0.0.1:8888/sse --transport sse
Testez et validez la précision de l'analyse de Strot sur différents sites web et composants individuels. Le système d'évaluation prend en charge cinq types d'entrée :
Il compare les résultats réels aux résultats attendus, en suivant des métriques telles que la correspondance des URL sources, la détection des clés de pagination, la détection des paramètres dynamiques et la précision du nombre d'entités. Toutes les évaluations et leurs étapes d'analyse détaillées sont stockées dans Airtable.
git clone https://github.com/vertexcover-io/strot.git
cd strot && uv sync --group eval
Créez une nouvelle base Airtable :
Create dans l'espace de travail souhaitéBuild an app on your ownappXXXXXXXXXXXXXX)Créez un jeton d'accès personnel :
/create/tokensdata.records:readdata.records:writeschema.bases:readschema.bases:writeCreate token et copiez le jeton (ex. patXXXXXXXXXXXXXX)Définissez les variables d'environnement :
Remarque : Les tables requises sont automatiquement créées avec le schéma approprié lorsque vous exécutez des évaluations.
$ uv run stroteval
Usage: stroteval [OPTIONS]
Evaluate multiple job-based or task-based inputs from a file or stdin.
╭─ Parameters ──────────────────────────────────────────────────────────────────╮
│ --file -f Path to the JSON/JSONL file. If not provided, reads from stdin. │
╰───────────────────────────────────────────────────────────────────────────────╯
Assurez-vous que le serveur API est en cours d'exécution si vous évaluez des entrées basées sur des tâches.
echo '[
{
"job_id": "existing-job-uuid",
"expected_source": "https://api.example.com/reviews",
"expected_pagination_keys": ["cursor", "limit"],
"expected_dynamic_keys": ["sortBy", "category"],
"expected_entity_count": 243
},
{
"site_url": "https://example.com/category/abc",
"query": "Listed products with name and prices",
"expected_source": "https://api.example.com/products",
"expected_pagination_keys": ["limit", "offset"],
"expected_dynamic_keys": ["category", "sortBy"],
"expected_entity_count": 100
},
{
"request": {
"method": "GET",
"url": "https://example.com/api/products",
"type": "ajax",
"queries": {"page": "2", "limit": "50", "sortBy": "price", "category": "electronics"}
},
"expected_pagination_keys": ["page", "limit"],
"expected_dynamic_keys": ["sortBy", "category"]
},
{
"response": {
"value": "",
"request": {
"method": "GET",
"url": "https://example.com/api/reviews",
"type": "ajax"
},
"preprocessor": {"element_selector": ".reviews-container"}
},
"output_schema_file": "review_schema.json",
"expected_entity_count": 10
}
]' | uv run stroteval
Licence MIT - Utilisez-la comme vous le souhaitez !
Fait avec ❤️ par Vertexcover Labs
export STROT_AIRTABLE_BASE_ID=appXXXXXXXXXXXXXX
export STROT_AIRTABLE_TOKEN=patXXXXXXXXXXXXXX
# set the following if you wish to evaluate separate tasks
export STROT_ANTHROPIC_API_KEY=sk-ant-apiXXXXXX