Skip to main content
Glama
maccydee

cute-web-scraper

by maccydee

cute-web-scraper

Ein MCP-Server, der Claude Web-Scraping-Fähigkeiten verleiht. Kostenlos, lokal, ohne API-Schlüssel, ohne Cloud-Konto.

CI Python 3.10+ License: MIT MCP Tests

Frag einfach in normaler Sprache. Er holt die Seiten, rendert bei Bedarf das JavaScript, umgeht die Blockaden und liefert sauberes Markdown oder eine abfragbare Tabelle zurück – ohne Selektoren, ohne Klebecode.

Warum dieser

  • Er kommt rein. Vier aufsteigende Stufen – einfaches HTTP, Browser-TLS-Fingerprints, ein echter Browser, dann ein Stealth-Browser. ASOS, eBay, Booking.com und Trustpilot liefern alle echte Daten, über eine Heimverbindung ohne Proxys.

  • Er verschwendet deinen Kontext nicht. Artikel werden von Navigation, Cookie-Bannern und Fußzeilen befreit: Eine BBC-Nachrichtenseite geht von 20.513 Zeichen auf 3.198 zurück. Große Ergebnisse landen in einer SQLite-Tabelle, die du mit SQL abfragst, statt sie in den Chat einzufügen.

  • Er sagt die Wahrheit über Fehler. Fünf der getesteten Seiten lieferten eine Ablehnung unter einem Erfolgs-Status – ein Interstitial unter HTTP 200, ein Bot-Check unter 202 – und eine lieferte echten Inhalt unter 403. Die Block-Erkennung wiegt den Seiteninhalt, nicht den Statuscode, damit du keinen Stub als Daten gemeldet bekommst.

  • Ganze Websites, nicht einzelne Seiten. Sitemap-Erkennung, paralleles Abrufen und 24 Tools für Produkte, Kontakte, Shopify-Kataloge, Orte, PDFs und Änderungsverfolgung.

Installation

pipx install git+https://github.com/maccydee/cute-web-scraper

Chromium wird automatisch heruntergeladen, wenn du js_render zum ersten Mal verwendest (einmalig ~130 MB).

Related MCP server: mcp-server-scraper

Mit Claude Code verbinden

claude mcp add cute-web-scraper -- cute-web-scraper

Dann frag einfach:

Scrape every product from https://example-shop.com and give me a CSV of name and price.

Tools

Abrufen und Erkunden

Tool

Was es tut

search_web

Durchsuche das Web und erhalte sortierte Ergebnisse – der Einstieg, wenn du eine Frage hast, keine URL

fetch_page

Eine URL zu sauberem Markdown, mit Titel, Status und Linkanzahl

inspect_network

Melde die API-Aufrufe, die eine Seite macht, mit ihrem JSON – lies die Datenquelle direkt

fetch_pages

Viele URLs parallel, mit Ergebnissen und Fehlern pro URL

crawl_site

Entdecke die Seiten einer Website über die Sitemap, mit Fallback auf Link-Verfolgung

analyze_website

Erkenne die Plattform, finde die Sitemap, melde, ob JavaScript benötigt wird

Extraktion

Tool

Was es tut

extract_by_selector

Beliebige Felder über CSS-Selektoren – macht aus jeder Liste eine Tabelle

extract_products

Strukturierte Produktdaten (Name, Preis, Währung, Verfügbarkeit, Marke, SKU, Bewertung) aus JSON-LD, OpenGraph oder Mikrodaten

extract_emails

E-Mail-Adressen über eine Liste von URLs, mit umgebendem Kontext

extract_phones

Telefonnummern über eine Liste von URLs, mit umgebendem Kontext

extract_links

Jeden Hyperlink, aufgelöst zu absoluten URLs

extract_social_links

Soziale Profile auf acht Plattformen

extract_shopify_store

Einen ganzen Shopify-Katalog, eine Zeile pro Variante

list_shopify_collections

Die Kollektionen eines Shopify-Shops und ihre Produktanzahlen

Orte und lokale Unternehmen

Tool

Was es tut

find_places

Suche nach Name oder Beschreibung – Name, Adresse, Koordinaten, Telefon, Website, Öffnungszeiten

find_places_nearby

Jedes Unternehmen einer Kategorie innerhalb eines Radius um einen Ort

Änderungsverfolgung

Tool

Was es tut

track_changes

Rufe eine Seite ab und vergleiche sie mit dem letzten Check – neu, gleich oder geändert

list_tracked

Beobachtete Seiten und wann jede zuletzt gesehen wurde

untrack

Beende die Beobachtung einer Seite

Ergebnistabellen

Tool

Was es tut

list_tables

Gespeicherte Ergebnistabellen mit Zeilenanzahl und Spalten

get_table

Spalten einer Tabelle, Zeilenanzahl und eine Stichprobe

query_table

Schreibgeschütztes SQL über eine gespeicherte Tabelle – filtern, aggregieren, gruppieren, sortieren und optional das Ergebnis als neue Tabelle speichern

export_table

Schreibe eine Tabelle als CSV oder JSON auf die Festplatte

drop_table

Lösche eine gespeicherte Tabelle

Ein typischer Ablauf kombiniert sie: analyze_websitecrawl_sitefetch_pagesquery_table.

Beliebige Felder extrahieren

extract_by_selector deckt alles ab, was die festen Extraktoren nicht tun:

Get the title, price and link from every product on these 40 pages,
save it as `catalogue`, then show me anything under £50.

fields ordnet Spaltennamen CSS-Selektoren zu. row_selector macht jeden Treffer zu einer Zeile – das macht aus einer Liste eine Tabelle. Ein @attr-Suffix liest ein Attribut statt Text, wobei href und src zu absoluten URLs aufgelöst werden:

{"name": "h3 a@title", "price": ".price_color", "link": "h3 a@href"}

Eine Seite steuern

fetch_page akzeptiert actions, die ausgeführt werden, bevor die Seite gelesen wird – Cookie-Gates, „Mehr laden“-Buttons, unendliches Scrollen und Suchformulare:

[{"action": "click", "selector": "#accept-cookies"},
 {"action": "scroll_to_bottom", "max_rounds": 10}]

Verfügbare Aktionen: click, type, press, wait, wait_for, scroll, scroll_to_bottom und click_until_gone. Jede meldet, was sie getan hat, sodass ein Schritt, der still nichts gefunden hat, sichtbar ist, statt dich raten zu lassen.

Die API statt der Seite lesen

Wenn eine Website schwer zu parsen ist, rendert inspect_network sie und meldet die ausgeführten Anfragen. Eine JavaScript-Seite lädt ihre Daten fast immer von einem Endpunkt, den du direkt abrufen kannst – billiger als das Parsen von Markup, und es übersteht Redesigns, die Selektoren brechen:

Inspect the network on this listing page, then fetch whatever JSON endpoint it uses.

Änderungen beobachten

Check https://example.com/pricing for changes.

track_changes speichert einen Schnappschuss und meldet new, same oder changed mit einem Unified-Diff. Das ist Überwachung ohne Zeitplaner – prüfe, wann du willst, und sieh nur den Unterschied.

Slash-Befehle

Der Server bringt vier fertige Workflows mit, die in Claude Code als Slash-Befehle erscheinen: scrape_site, scrape_shopify_store, find_contacts und compare_prices.

Mit großen Scrapes arbeiten

Jedes Tool, das Zeilen zurückgibt, akzeptiert save_as. Statt die Daten in die Konversation zu legen, schreibt es eine Ergebnistabelle und gibt eine Zusammenfassung zurück:

Extract the whole catalogue from deathwishcoffee.com into a table called `catalogue`,
then tell me the price range and how many variants are out of stock.

Claude ruft extract_shopify_store(save_as="catalogue") auf, bekommt eine Zeilenanzahl und Spaltenliste zurück und antwortet dann mit query_table:

SELECT COUNT(*) AS variants, MIN(price) AS cheapest,
       MAX(price) AS dearest, SUM(available) AS in_stock
FROM catalogue

Die Tabelle kann 100.000 Zeilen enthalten und keine davon gelangt in die Konversation. query_table ist strikt schreibgeschützt – es läuft gegen ein schreibgeschütztes SQLite-Handle und lehnt alles ab, was kein SELECT ist, sodass eine Abfrage gespeicherte Daten niemals ändern oder löschen kann.

Tabellen liegen in einer SQLite-Datei unter ~/.cute-web-scraper/results.db (setze SCRAPER_DB_PATH, um sie zu verschieben).

Daten bereinigen

query_table akzeptiert auch save_as, was das Ergebnis als neue Tabelle speichert. SQL drückt bereits die üblichen Bereinigungsoperationen aus, daher gibt es keinen separaten Satz von Bearbeitungswerkzeugen:

SELECT DISTINCT * FROM leads                                  -- deduplicate
SELECT street || ', ' || city AS address FROM leads           -- merge columns
SELECT name, phone FROM leads WHERE phone IS NOT NULL         -- drop columns and rows
SELECT vendor AS brand FROM catalogue                         -- rename

Die Quelltabelle bleibt unangetastet, es sei denn, du zielst absichtlich auf ihren eigenen Namen, und die Antwort sagt replaced_existing_table, wenn du das tust – so ist ein In-Place-Filter nie ein stiller Verlust von Zeilen.

Orte und lokale Unternehmen

find_places sucht einen einzelnen Ort; find_places_nearby gibt alles einer Kategorie innerhalb eines Radius zurück, was der Fall für lokale Lead-Generierung ist:

Find every dentist within 4km of Bath, save it as `leads`,
then tell me how many have a website but no phone number.

Kategorien akzeptieren freundliche Namen (cafe, dentist, hotel, solicitor, gym, hairdresser, …) oder ein rohes OpenStreetMap-Tag wie amenity=dentist.

Ein Hinweis zur Datenquelle. Das ist OpenStreetMap, nicht Google Maps. Google war das offensichtliche Ziel und es funktioniert nicht: Ein automatisierter Browser bekommt ein Cookie-Einwilligungs-Interstitial, und wenn man das überwindet, eine abgespeckte Karten-Shell ohne Orts-Panel. Die Stealth-Stufe hilft nicht, weil dies eine Einwilligungsmauer ist und keine Bot-Erkennung – ein anderes Problem als das, das Stealth löst.

OpenStreetMap bietet dieselben Felder – Name, Adresse, Koordinaten, Telefon, Website, Öffnungszeiten, Kategorie – über dokumentierte offene Endpunkte ohne Schlüssel. Das Einzige, wofür es kein Äquivalent gibt, sind Sternebewertungen und Bewertungsanzahlen, die Googles eigene proprietäre Daten sind.

Beide Endpunkte werden von Freiwilligen betrieben. Nominatims Richtlinie von einer Anfrage pro Sekunde wird intern unabhängig von SCRAPER_DELAY_MS durchgesetzt, und Overpass-Abfragen fallen auf mehrere öffentliche Spiegel zurück, weil die Hauptinstanz regelmäßig 504 unter Last zurückgibt.

Die Tool-Ausgabe ist außerdem auf SCRAPER_MAX_INLINE_CHARS begrenzt (standardmäßig 25.000). Darüber hinaus wird ein Ergebnis mit einem Hinweis auf save_as abgeschnitten – so kann ein einzelner Aufruf deinen Kontext nicht versehentlich füllen.

Beispiel-Prompts

Export the whole catalogue from deathwishcoffee.com and tell me the price range.

Find all email addresses on https://company.com and its contact pages.

What platform is https://myblog.com on? Does it need JavaScript to scrape?

Scrape these 200 product pages into a table, then show me everything under £50 that's in stock.

Extract the social media links from these 10 agency sites: [urls...]

Konfiguration

Alles ist eine Umgebungsvariable, mit Standardwerten, die ohne Konfiguration funktionieren.

Variable

Standard

Bedeutung

SCRAPER_DELAY_MS

1000

Basisverzögerung zwischen Anfragen an dieselbe Domain

SCRAPER_MAX_CONCURRENT

5

Maximale parallele Anfragen

SCRAPER_CACHE_TTL_S

300

Wie lange eine abgerufene Seite wiederverwendbar bleibt

SCRAPER_CACHE_MAX_ENTRIES

500

Zwischengespeicherte Seiten vor der Entfernung nach dem Least-Recently-Used-Prinzip

SCRAPER_AUTH_TOKEN

nicht gesetzt

Bearer-Token für den HTTP-Modus

SCRAPER_CHROME_USER_DATA_DIR

nicht gesetzt

Chrome-Profil, von dem angemeldete Sitzungen übernommen werden

SCRAPER_IMPERSONATE

1

Blockierte Anfragen mit Browser-TLS-Fingerabdrücken erneut versuchen

SCRAPER_STEALTH

1

Stealth-Browser als letzte Option für die schwierigsten Blockaden

SCRAPER_DB_PATH

~/.cute-web-scraper/results.db

Wo Ergebnistabellen gespeichert werden

SCRAPER_MAX_INLINE_CHARS

25000

Obergrenze dafür, wie viel ein einzelnes Tool inline zurückgibt

Das Bündeln einer langen URL-Liste in eine Tabelle erfordert mode: "append" bei jedem Aufruf nach dem ersten, sonst ersetzt jeder Stapel den letzten. Gerenderte Seiten, die spärlich zurückkommen, können mit wait_ms oder besser mit wait_for und einem CSS-Selektor versehen werden.

Verhalten

Hauptinhalt, nicht die ganze Seite. Seiten im Artikelformat werden durch trafilatura verarbeitet, das den Hauptteil isoliert und das umgebende Beiwerk entfernt – gewählt, weil es in einem unabhängigen Benchmark mit 2.008 Seiten einen F1-Wert von 0,791 erreicht, gegenüber Readabilitys 0,674. Es wird pro Seite angewendet, nicht universell: Derselbe Benchmark zeigt, dass Extraktoren bei Produktrastern und Sammlungen um 20–30 Punkte abweichen, wo „Hauptinhalt“ kein Artikel ist, daher behalten Listenseiten das vollständige Dokument. Übergeben Sie main_content: false, um das überall zu erzwingen.

Vier Stufen, die nur bei Ablehnung eskalieren. Ein einfacher HTTP-Client bewältigt die meisten Seiten. Wenn eine Website ablehnt, wird die Anfrage mit echten Browser-TLS-Fingerabdrücken (Chrome, dann Safari) wiederholt, da einige Websites den TLS-Handshake selbst erkennen und keine Header-Änderung sie überwindet. js_render: true rendert in Chromium für Single-Page-Apps. Als letzte Option übernimmt ein mit Stealth-Patches versehener Browser Seiten, die JavaScript benötigen und gewöhnliche Automatisierung ablehnen.

Jede Stufe behebt einen anderen Fehler, und keine ist eine Obermenge der anderen: Die TLS-Stufe kann kein JavaScript ausführen, und Playwright ist ein erkennbar automatisierter Browser. Jedes Ergebnis meldet, welche Stufe es bedient hat. Setzen Sie SCRAPER_IMPERSONATE=0 oder SCRAPER_STEALTH=0, um die letzten beiden abzuschalten und Blockaden bestehen zu lassen.

Die letzten beiden Stufen sind Umgehung, nicht Höflichkeit – sie existieren, um Bot-Erkennung zu umgehen, die Websites absichtlich eingesetzt haben. Sie laufen nur nach einer Ablehnung, nie auf einer Website, die die Seite normal ausgeliefert hat.

Adaptives Backoff. Anfragen an dieselbe Domain werden durch SCRAPER_DELAY_MS zeitlich gestaffelt, gemessen von Start zu Start, sodass die Verzögerung die Anfragerate begrenzt, anstatt zu langsamen Antworten hinzuzufügen. Wenn eine Domain Widerstand leistet – ein 429, ein 403, eine Cloudflare-Herausforderung – verdoppelt sich die Verzögerung für diese Domain, bis zu 60 Sekunden, und sinkt wieder, sobald Anfragen wieder erfolgreich sind. Domains werden unabhängig verfolgt, sodass das gleichzeitige Scrapen von zwei Websites nichts extra kostet.

robots.txt wird nicht durchgesetzt. Es wird nur gelesen, um Sitemaps zu finden; seine Disallow-Regeln werden nicht beachtet, und es gibt keine Einstellung, das zu ändern. Die adaptive Verzögerung pro Domain ist der Höflichkeitsmechanismus dieses Tools.

Ein kurzer Cache. Abgerufene Seiten werden fünf Minuten lang wiederverwendet, sodass das Ausführen von fetch_pages und dann extract_emails über dieselben URLs nicht alles doppelt abruft.

HTTP-Modus

Der Standard ist stdio, was claude mcp add oben verwendet. Um stattdessen eine persistente gemeinsame Instanz auszuführen:

SCRAPER_AUTH_TOKEN=$(openssl rand -hex 16) cute-web-scraper --http --port 8080
claude mcp add --transport http cute-web-scraper http://127.0.0.1:8080/mcp

Es bindet an 127.0.0.1 und stellt /mcp sowie einen /health-Endpunkt bereit. Das Binden über Loopback hinaus erfordert SCRAPER_AUTH_TOKEN, und der Server weigert sich ohne dieses zu starten, anstatt stillschweigend einen offenen Scraper in Ihr Netzwerk zu veröffentlichen.

Einschränkungen

  • Keine Proxy-Rotation und kein CAPTCHA-Lösen. Eine Website, die alle vier Stufen übersteht, wird als blockiert gemeldet, statt geraten zu werden.

  • LinkedIn und ähnliche benötigen möglicherweise SCRAPER_CHROME_USER_DATA_DIR, das auf ein angemeldetes Chrome-Profil zeigt.

  • SCRAPER_DELAY_MS=0 entfernt die höfliche Verzögerung, aber das Backoff greift weiterhin, wenn eine Website Widerstand leistet.

  • Die Telefonnummernextraktion ist bewusst konservativ: Sie erfordert eine Ländervorwahl oder eine Ortsnetzkennzahl, sodass sie einige nackte lokale Formate übersieht, anstatt Jahre und Bestellnummern zurückzugeben.

Entwicklung

uv sync --extra dev
uv run pytest -v
uv run pytest -m integration -v -s
uv run ruff check src/ tests/ && uv run mypy src/cute_web_scraper/

Unit-Tests sind hermetisch und greifen nie auf das Netzwerk zu. Integrationstests treffen Live-Websites und sind vom Standardlauf ausgeschlossen.

Lizenz

MIT – siehe LICENSE.

A
license - permissive license
A
quality
A
maintenance

Maintenance

Maintainers
Response time
Release cycle
1Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • F
    license
    Not graded
    quality
    Not graded
    maintenance
    An MCP server for web content extraction that converts HTML pages into clean, LLM-optimized Markdown using Mozilla's Readability. It supports batch processing, intelligent multi-page crawling, and configurable caching while respecting robots.txt standards.
    51
  • A
    license
    Not graded
    quality
    C
    maintenance
    Open-source web scraper and extraction MCP server with JavaScript rendering, markdown output, PDF/DOCX parsing, structured errors, and validated extraction contract diagnostics for agents.
    2
    AGPL 3.0
  • A
    license
    Not graded
    quality
    A
    maintenance
    Remote MCP server for web scraping with anti-bot evasion. Provides stealth HTTP fetching, headless browser with Cloudflare bypass, CSS selectors, YouTube transcripts, and Markdown conversion.
    1
    MIT

View all related MCP servers

Related MCP Connectors

  • All HasData scraping tools in one MCP server: Google, TikTok, Instagram, maps, e-commerce and more.

  • One MCP server for 180+ live web-data APIs returning clean JSON from sites that block scrapers.

  • Firecrawl MCP — wraps the Firecrawl API (firecrawl.dev) for web

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/maccydee/cute-web-scraper'

If you have feedback or need assistance with the MCP directory API, please join our Discord server