Crawl entire websites โ every page, every link โ and extract all text, metadata, links, buttons, forms and tables. Built for speed (parallel crawlers + concurrent fetching), resilience (watchdog + multi-method retry for blocked pages), and privacy (runs 100% on your machine; cloud upload is optional).
- ๐ Full-site crawling โ follows every internal link up to unlimited depth
- โก Concurrent engine โ each crawler fetches multiple pages in parallel
- ๐ Parallel fleet โ
spawn_workers.pyauto-splits your site list across many crawlers - ๐ก๏ธ Anti-block retry ladder โ Chrome/Firefox/Safari browser impersonation โ plain requests โ text-proxy fallback
- โฑ๏ธ Request watchdog โ hung connections are abandoned after 60s, never freezing a crawl
- ๐งพ Everything extracted โ title, meta/OG tags, headings, paragraphs, tables, all links, buttons, forms
- โ๏ธ Optional cloud sync โ point it at an rclone remote (Google Drive etc.), everything uploads automatically
- ๐ Failure recovery โ failed URLs are journaled and re-attempted by an aggressive retry pass
- โป๏ธ Resumable โ stop anytime (
Ctrl+Corfleet.sh stop); restart picks up exactly where it stopped
pip3 install -r requirements.txt
pip3 install curl_cffi # recommended: bypasses most bot-blockers
echo "https://example.com" > links.txt # your target sites, one per line
python3 scraper.py # scrape everythingResults land in output/: one .json (full structured data) and one .txt
(clean readable text) per site.
For big lists, use the built-in manager:
chmod +x fleet.sh
./fleet.sh start # launch main crawler + status loop + parallel workers
./fleet.sh status # live snapshot: sites done, pages, pace, ETA
./fleet.sh bug # scan & AUTO-FIX crashes, hangs, bad indexes
./fleet.sh stop # stop safely, keep everything resumable| Variable | Default | Purpose |
|---|---|---|
SCRAPER_CONCURRENCY |
1 |
Parallel page fetches per crawler (try 6) |
SCRAPER_DELAY |
0.7 |
Politeness delay between batches (seconds) |
SCRAPER_LINKS |
links.txt |
Your URL list |
SCRAPER_STAGING |
output |
Local staging folder |
SCRAPER_REMOTE |
(unset) | rclone remote name โ enables cloud sync |
SCRAPER_FOLDER |
scraped-data |
Folder path on the remote |
<site>.jsonโ structured data: full text, headings, paragraphs, tables, all internal/external links, buttons, forms, metadata (Open Graph etc.)<site>.txtโ clean human-readable text of every page_REPORT.txtโ accounting: scraped / recovered / permanently unreachable
rclone config # create a remote (e.g. named "mygdrive")
export SCRAPER_REMOTE=mygdrive
export SCRAPER_FOLDER=my-scraper-dataNow every finished site uploads automatically and local copies are cleaned.
No rclone? Everything just stays in local output/.
- Check each site's
robots.txtand terms of service - Keep politeness delays enabled (
REQUEST_DELAY) - Only scrape publicly available content
MIT โ do whatever you like, no warranty.