Skip to main content

Web Research Stack / Web Araştırma Yığını

https://github.com/senoldogann/web-research-stack/raw/main/GITHUB-video.mp4
2-Minute Demonstration / 2 Dakikalık Tanıtım Videosu

English | Türkçe


English

Overview

Web Scraper is a powerful, production-ready web scraping and research tool with full-stack capabilities. It combines a Python FastAPI backend with a modern React Next.js frontend, featuring LLM-powered research capabilities with citation support.

Install

The MCP server for web search and reading that Dot, the always-on agent for macOS, uses ships as a Python package, dotagent-web-research (the import package is web_scraper):

pip install dotagent-web-research
# or, as a command of its own
uv tool install dotagent-web-research

It installs two commands: web-research-mcp, the MCP server over stdio (tools web_search, web_scrape, web_map, web_extract, web_health, web_crawl_start, web_crawl_status, web_crawl_results, web_crawl_cancel), and web-scraper, the CLI and REST server described below. The headless-browser fallbacks are extras: pip install "dotagent-web-research[camoufox]" or "[playwright]".

The tools, and what 1.3.0 added to them

Tool New in 1.3.0
web_search compact (the default over MCP: per result title, url, domain, date, date_confidence, source_type, snippet, score, and a run block with provider, warnings, fallback), debug (adds facets, queries, timings, score parts), resolve_dates (reads the head of the top pages for their dates; on for news and date ranges), strict_dates (drops undated and low-confidence results and says how many), primary_first (official sites and mainstream news lead; on for news). Results carry date_confidence and date_conflicts; the source type aggregator ranks lower. Providers heal: a wall earns a 10-minute cooldown, healthy providers go first, and BRAVE_SEARCH_API_KEY / SERPER_API_KEY turn on Brave and Serper (asked first, DuckDuckGo behind). A deep search no longer cuts its primary-source angle at 5 seconds.
web_scrape date, date_source, date_confidence, date_conflicts (every date signal of the page weighed); recover (a walled page is read through the archive, its AMP or print form, its feed or another outlet, and says which: recovered_from, alternates, next_action); lean; content_id with offset (reads on in a page that max_chars cut, from the cache); the page's Markdown comes as a text block of its own, with its line breaks.
web_extract The same date* fields; a named published_at is held to them.
web_health New: each search provider's state (ok, degraded, cooling with the time left, no_key), calls, block_rate, mean latency, last error.
web_map, web_crawl_* Unchanged.

CHANGELOG.md has the decisions; docs/web-tools.md the settings.

How Dot uses it. Dot's package depends on this one, so a fresh Dot install brings it. Dot starts web-research-mcp as one of its MCP servers (named web-research) and its tools reach the agent as mcp__web-research__web_search, mcp__web-research__web_scrape and so on. In Dot's config.toml it is one table; docs/web-tools.md has it and the settings (WEB_TOOLS_*) the server reads.

[[mcp]]
name = "web-research"
command = "web-research-mcp"

Features

  • Dual Interface: CLI commands and REST API
  • Local Web Research Tools: HTTP-first multi-angle search with field-weighted BM25, weighted angle consensus, freshness filters, caching and provider cooldown, plus scrape, map, background crawl, and structured extract, exposed over REST and a Dot-ready stdio MCP server (headless-only browser fallback)
  • LLM Research Tool: AI-powered web research with citations
  • Async Architecture: High-performance concurrent scraping
  • Production Ready: Docker, monitoring (Prometheus/Grafana), rate limiting, circuit breaker
  • Security First: SSRF protection, input validation, security headers
  • Multi-language UI: English and Turkish language support
  • Streaming Support: Real-time research progress via Server-Sent Events (SSE)
  • Code Block Preservation: Scraper preserves code blocks from source pages with syntax highlighting
  • Internationalized Status Messages: Research progress messages adapt to query language (TR/EN)
  • Resilient JSON Parsing: 3-stage recovery for LLM synthesis output (strict → repair → retry)

Tech Stack

Component Technology
Backend Python 3.9+, FastAPI, asyncio
Frontend React 19, Next.js 15, TypeScript, Tailwind CSS
Database SQLite (history & caching)
HTTP Client httpx, curl_cffi
HTML Parsing BeautifulSoup4, lxml
AI/ML Ollama, OpenAI API compatible

Quick Start

# Clone the repository
git clone https://github.com/senoldogann/web-research-stack.git
cd web-research-stack

# Install dependencies
pip install -e .

# Start the API server
web-scraper serve

# Or use Docker
docker compose up --build

Google search stays off your screen

Google no longer serves results to plain HTTP clients, and headless Chrome is caught within one request. A headed Chrome gets the real page, so the searcher starts Chrome itself, minimises its window over CDP before the first search, and keeps one browser and one tab for the process: ~2 s to start (a brief flash of a small window), then 0.4–1 s per search. If Chrome is missing or refused, Camoufox — a patched headless Firefox — takes over.

pip install -e ".[playwright]"   # the Chrome path
pip install -e ".[camoufox]" && python -m camoufox fetch   # the headless fallback
  • GOOGLE_ALLOW_VISIBLE_BROWSER=true — leave the Chrome window on screen (debugging).
  • GOOGLE_USE_PLAYWRIGHT=false — skip Google entirely and rely on DuckDuckGo.

API Endpoints

Endpoint Method Description
/ GET API information
/health GET Health check
/api/v1/metrics GET Prometheus metrics
/api/v1/tools GET Tool manifest for LLM
/api/v1/scrape POST Scrape a single URL
/api/v1/scrape/batch POST Batch scrape multiple URLs
/api/v1/tools/web-research POST Run AI-powered research
/api/v1/tools/web-research/stream POST Stream research progress
/api/v1/web/search POST Discover URLs with a search adapter
/api/v1/web/scrape POST Scrape one page to Markdown, metadata, and links
/api/v1/web/map POST List URLs from sitemaps and page links
/api/v1/web/extract POST Extract structured fields with provenance
/api/v1/web/crawl POST Start a background crawl and return its job id
/api/v1/web/crawl/{job_id} GET Crawl progress and counters
/api/v1/web/crawl/{job_id}/results GET Paginated crawl results
/api/v1/web/crawl/{job_id}/cancel POST Cancel a queued or in-flight crawl
/api/v1/web/stats GET Web tool latency, cache, and browser state
/api/v1/research POST Legacy research endpoint
/api/v1/research/stream POST Legacy streaming research

Example: Research Request

curl -X POST "http://127.0.0.1:8000/api/v1/tools/web-research" \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your-api-key" \
  -d '{
    "query": "Latest developments in AI",
    "max_sources": 5,
    "deep_mode": false,
    "provider": "ollama"
  }'

Documentation

License

MIT License


Türkçe

Genel Bakış

Web Scraper, güçlü ve üretim ortamına hazır bir web kazıma ve araştırma aracıdır. Python FastAPI backend ile modern React Next.js frontend'i birleştirir, alıntılı LLM destekli araştırma özelliklerine sahiptir.

Kurulum

Dot'un (macOS için her zaman açık ajan) kullandığı web arama ve okuma MCP sunucusu bir Python paketi olarak gelir: dotagent-web-research (içe aktarılan paket web_scraper):

pip install dotagent-web-research
# veya kendi başına bir komut olarak
uv tool install dotagent-web-research

İki komut kurar: stdio üzerinden MCP sunucusu web-research-mcp ve aşağıda anlatılan CLI ile REST sunucusu web-scraper. Araçlar: web_search, web_scrape, web_map, web_extract, web_health (1.3.0: her sağlayıcının durumu), web_crawl_start, web_crawl_status, web_crawl_results, web_crawl_cancel. 1.3.0 tarihleri güvenilir kılar (date_confidence, date_conflicts; resolve_dates, strict_dates), engellenen sayfayı başka yoldan okur (recover: arşiv, AMP/yazdırma biçimi, besleme, başka yayıncı), çıktıyı küçültür (compact, lean, content_id ile offset) ve sağlayıcıları iyileştirir (10 dakikalık soğuma, isteğe bağlı Brave ve Serper anahtarları). Headless tarayıcı yedekleri ek pakettir: pip install "dotagent-web-research[camoufox]" veya "[playwright]".

Dot bunu nasıl kullanır. Dot'un paketi buna bağlıdır; yeni bir Dot kurulumu bunu da getirir. Dot web-research-mcp'yi MCP sunucularından biri olarak (web-research adıyla) başlatır; araçlar ajana mcp__web-research__web_search, mcp__web-research__web_scrape gibi görünür. Ayrıntı ve ayarlar için docs/web-tools.md.

Özellikler

  • Çift Arayüz: CLI komutları ve REST API
  • Yerel Web Araştırma Araçları: Alan ağırlıklı BM25, ağırlıklı açı uzlaşması, güncellik filtreleri, önbellek ve sağlayıcı soğuması içeren çok açılı HTTP öncelikli arama; kazıma, haritalama, arka plan taraması ve yapılandırılmış çıkarım; REST ve Dot'a hazır stdio MCP sunucusu (yalnızca headless tarayıcı yedeği)
  • LLM Araştırma Aracı: Alıntılı AI destekli web araştırması
  • Asenkron Mimari: Yüksek performanslı eşzamanlı kazıma
  • Üretim Hazır: Docker, izleme (Prometheus/Grafana), hız sınırlama, circuit breaker
  • Güvenlik Öncelikli: SSRF koruması, giriş doğrulama, güvenlik başlıkları
  • Çok Dilli UI: İngilizce ve Türkçe dil desteği
  • Yayın Akışı: Sunucu Tarafından Gönderilen Olaylar (SSE) ile gerçek zamanlı araştırma ilerlemesi
  • Kod Bloğu Koruma: Kaynak sayfalardan kod blokları söz dizimi vurgulamasıyla korunur
  • Uluslararasılaştırılmış Durum Mesajları: Araştırma ilerleme mesajları sorgu diline göre uyarlanır (TR/EN)
  • Dayanıklı JSON Ayrıştırma: LLM sentez çıktısı için 3 aşamalı kurtarma (katı → onarım → yeniden deneme)

Teknoloji Yığını

Bileşen Teknoloji
Backend Python 3.9+, FastAPI, asyncio
Frontend React 19, Next.js 15, TypeScript, Tailwind CSS
Veritabanı SQLite (geçmiş ve önbellek)
HTTP İstemcisi httpx, curl_cffi
HTML Ayrıştırma BeautifulSoup4, lxml
AI/ML Ollama, OpenAI API uyumlu

Hızlı Başlangıç

# Depoyu klonla
git clone https://github.com/senoldogann/web-research-stack.git
cd web-research-stack

# Bağımlılıkları yükle
pip install -e .

# API sunucusunu başlat
web-scraper serve

# Veya Docker kullan
docker compose up --build

Google araması ekranda görünmez

Google artık düz HTTP istemcilerine sonuç döndürmüyor ve headless Chrome tek istekte yakalanıyor. Başlı (headed) Chrome gerçek sayfayı alıyor; bu yüzden arayıcı Chrome'u kendisi başlatıp penceresini ilk aramadan önce CDP ile küçültüyor ve süreç boyunca tek tarayıcı + tek sekme kullanıyor: başlatma ~2 sn (küçük bir pencere kısa süre görünür), sonrası arama başına 0,4–1 sn. Chrome yoksa ya da reddederse Camoufox — yamalı, headless Firefox — devralıyor.

pip install -e ".[playwright]"   # Chrome yolu
pip install -e ".[camoufox]" && python -m camoufox fetch   # görünmez yedek
  • GOOGLE_ALLOW_VISIBLE_BROWSER=true — Chrome penceresi ekranda kalsın (hata ayıklama).
  • GOOGLE_USE_PLAYWRIGHT=false — Google'ı tamamen atla, DuckDuckGo kullan.

API Uç Noktaları

Uç Nokta Metod Açıklama
/ GET API bilgileri
/health GET Sağlık kontrolü
/api/v1/metrics GET Prometheus metrikleri
/api/v1/tools GET LLM için araç manifestosu
/api/v1/scrape POST Tek URL kazıma
/api/v1/scrape/batch POST Toplu URL kazıma
/api/v1/tools/web-research POST AI destekli araştırma
/api/v1/tools/web-research/stream POST Araştırma ilerlemesi yayını
/api/v1/web/search POST Arama adaptörüyle URL keşfi
/api/v1/web/scrape POST Tek sayfayı Markdown, üst veri ve bağlantılara dönüştür
/api/v1/web/map POST Site haritaları ve sayfa bağlantılarından URL listele
/api/v1/web/extract POST Kaynak bilgisiyle yapılandırılmış alan çıkar
/api/v1/web/crawl POST Arka plan taraması başlat, iş kimliğini hemen döndür
/api/v1/web/crawl/{job_id} GET Tarama ilerlemesi ve sayaçları
/api/v1/web/crawl/{job_id}/results GET Sayfalanmış tarama sonuçları
/api/v1/web/crawl/{job_id}/cancel POST Sıradaki veya sürmekte olan taramayı iptal et
/api/v1/web/stats GET Web aracı gecikmesi, önbellek ve tarayıcı durumu
/api/v1/research POST Eski araştırma uç noktası
/api/v1/research/stream POST Eski yayın akışı araştırması

Örnek: Araştırma İsteği

curl -X POST "http://127.0.0.1:8000/api/v1/tools/web-research" \
  -H "Content-Type: application/json" \
  -H "X-API-Key: sizin-api-anahtariniz" \
  -d '{
    "query": "Yapay zeka son gelişmeler",
    "max_sources": 5,
    "deep_mode": false,
    "provider": "ollama"
  }'

Dokümantasyon

Lisans

MIT Lisansı


Contributing / Katkıda Bulunma

Contributions are welcome! Please read our Contributing Guide.

Katkılarınızı bekliyoruz! Lütfen Katkı Rehberimizi okuyun.


© 2026 Senol Dogan. MIT License.

Metadata

Release files for dotagent-web-research 1.3.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for dotagent-web-research 1.3.0
File Size Uploaded Provenance
dotagent_web_research-1.3.0.tar.gz 430.3 kB With provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for dotagent-web-research 1.3.0
File Interpreter ABI Platform
dotagent_web_research-1.3.0-py3-none-any.whl Python 3 none any Details

Total release size: 711.9 kB

Release files / dotagent_web_research-1.3.0.tar.gz

Download URL dotagent_web_research-1.3.0.tar.gz
Size 430.3 kB
Tags Source
SHA-256 checksum
How to use checksums
8e858c25a595216ba059d00ff67792d00f557deca76c3e9f01934828c131fe63
BLAKE2b-256 checksum
How to use checksums
5366c7b67e9854ac5276a0d51f78576cfbdda1d0b0a8cb98cb716e486e26af3f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 24, 2026.

Transparency log

Release files / dotagent_web_research-1.3.0-py3-none-any.whl

Download URL dotagent_web_research-1.3.0-py3-none-any.whl
Size 281.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
4a6f8953f7b3e5bb144b8af9bcccee76321b9fa3fb21fa858adbd46f6e565833
BLAKE2b-256 checksum
How to use checksums
dc7bf58e6bda26294fd86d500992414ca961f181d20b5e9b97b1f5484f76571c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 24, 2026.

Transparency log

Security for dotagent-web-research 1.3.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for dotagent_web_research-1.3.0.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 24, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page