
웹 API용 API 스크레이퍼 에이전트
자연어로 모든 웹사이트의 내부 API를 리버스 엔지니어링하세요
현대 웹사이트는 숨겨진 AJAX 호출을 통해 데이터를 로드합니다:
Strot은 웹사이트를 분석하여 내부 API 호출을 찾아줍니다.
Strot이 실제로 수행하는 작업:
전체 Strot 경험(Web UI + API)을 즉시 체험하세요:
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
또는 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
그런 다음 방문하세요:
pip install strot
또는 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은 MCP(Model Context Protocol) 서버를 제공하여 Claude와 같은 MCP 클라이언트가 웹사이트를 분석하고 내부 API를 직접 발견할 수 있게 해줍니다.
git clone https://github.com/vertexcover-io/strot.git
cd strot && uv sync --group mcp
환경 변수 설정:
export STROT_ANTHROPIC_API_KEY=sk-ant-apiXXXXXX
export STROT_BROWSER_MODE_OR_WS_URL=headless # or 'headed' or ws://browser-url
호스팅된 브라우저를 사용하려면 다음을 수행할 수 있습니다:
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
또는 원격 브라우저 서버에 연결:
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. │
╰────────────────────────────────────────────────────────╯
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
sse, http, streamable-http 전송
원하는 전송 방식으로 별도의 터미널에서 MCP 서버를 실행하세요:
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
Claude에 MCP 서버를 추가하세요:
claude mcp add strot-mcp http://127.0.0.1:8888/sse --transport sse
다양한 웹사이트와 개별 구성 요소에 걸쳐 Strot의 분석 정확도를 테스트하고 검증합니다. 평가 시스템은 다섯 가지 입력 유형을 지원합니다:
실제 결과를 기대 결과와 비교하여 소스 URL 일치, 페이지네이션 키 감지, 동적 파라미터 감지, 엔터티 수 정확도와 같은 지표를 추적합니다. 모든 평가와 상세 분석 단계는 Airtable에 저장됩니다.
git clone https://github.com/vertexcover-io/strot.git
cd strot && uv sync --group eval
새 Airtable base 생성:
Create 버튼 클릭Build an app on your own 선택appXXXXXXXXXXXXXX)Personal Access Token 생성:
/create/tokens로 이동data.records:readdata.records:writeschema.bases:readschema.bases:writeCreate token을 누르고 토큰 복사 (예: patXXXXXXXXXXXXXX)환경 변수 설정:
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
참고: 평가를 실행하면 필요한 테이블이 적절한 스키마로 자동 생성됩니다.
$ 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. │
╰───────────────────────────────────────────────────────────────────────────────╯
작업 기반 입력을 평가하는 경우 API 서버가 실행 중인지 확인하세요.
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
MIT 라이선스 - 원하는 대로 사용하세요!
❤️로 제작: Vertexcover Labs