web-scraper — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited web-scraper (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Fetch, search, and extract content from websites.
| Script | Purpose | Dependencies |
|---|---|---|
fetch_page.py | Fetch a URL and extract readable content as Markdown | requests, beautifulsoup4, readability-lxml, html2text |
search_web.py | Search the web via DuckDuckGo | ddgs |
crawl_dynamic.py | Crawl JS-rendered pages with a headless browser | crawl4ai |
extract_links.py | Extract and categorize all links from a page | requests, beautifulsoup4 |
scrapling_fetch.py | Anti-bot / Cloudflare bypass scraping | scrapling[all]>=0.4.2 (Python 3.10+) |
For lightweight scraping (static pages, search, link extraction):
pip install requests beautifulsoup4 readability-lxml html2text ddgsFor dynamic / JavaScript-rendered pages (heavier, installs Playwright + Chromium):
pip install crawl4ai
crawl4ai-setupNote: crawl4ai-setup downloads a Chromium browser (~150 MB). Only install if you actually need dynamic page support.CRITICAL — Dependency Error Recovery: If ANY script below fails with anImportErroror "module not found" error, install the missing dependencies using the command above, then re-run the EXACT SAME script command that failed. Do NOT write inline Python code (python -c "...") or your own ad-hoc scripts as a substitute. These scripts handle encoding, error handling, and output formatting that inline code will miss.
Use this for most websites. It's fast, lightweight, and works for articles, docs, blogs, etc.
python scripts/fetch_page.py "URL"Options:
--raw — Output full page Markdown instead of extracted article content--selector "CSS_SELECTOR" — Extract only elements matching the CSS selector (e.g. ".article-body", "table", "#content")--save OUTPUT_PATH — Also save output to a file--max-length N — Truncate output to N characters (default: no limit)Examples:
# Fetch an article
python fetch_page.py "https://example.com/article"
# Extract only tables
python fetch_page.py "https://example.com/data" --selector "table"
# Fetch raw full-page markdown, limit to 5000 chars
python fetch_page.py "https://example.com" --raw --max-length 5000Search using DuckDuckGo (no API key required).
python scripts/search_web.py "search query"Options:
--max-results N — Number of results to return (default: 10)--region REGION — Region code, e.g. cn-zh, us-en, jp-jp (default: wt-wt for worldwide)--news — Search news instead of general webExamples:
# General search
python search_web.py "Python web scraping best practices 2025"
# News search, Chinese region, 5 results
python search_web.py "AI 最新进展" --news --region cn-zh --max-results 5Use this only when fetch_page.py returns empty or incomplete content (SPA, React/Vue apps, pages that load content via JS).
python scripts/crawl_dynamic.py "URL"Options:
--wait N — Wait N seconds after page load for JS to finish (default: 3)--selector "CSS_SELECTOR" — Wait for a specific element to appear before extracting--scroll — Scroll to bottom of page to trigger lazy loading--save OUTPUT_PATH — Also save output to a file--max-length N — Truncate output to N charactersExtract all links with their text labels, categorized by type (internal, external, resource).
python scripts/extract_links.py "URL"Options:
--filter PATTERN — Only show links matching a regex pattern (applied to URL)--external-only — Only show external links--json — Output as JSON instead of MarkdownUse when crawl_dynamic.py returns 403, CAPTCHA, or Cloudflare challenge page.
Install (Python 3.10+ required):
pip install "scrapling[all]>=0.4.2"# Browser automation (JS-heavy sites, not Cloudflare)
python scripts/scrapling_fetch.py "URL"
# Stealth mode (Cloudflare bypass, TLS fingerprinting)
python scripts/scrapling_fetch.py "URL" --stealth
# With CSS selector
python scripts/scrapling_fetch.py "URL" --stealth --selector ".article-body"
# Save output
python scripts/scrapling_fetch.py "URL" --stealth --save output.txtOptions:
--stealth — Enable Cloudflare bypass (slower, more effective)--selector CSS — Extract only elements matching the CSS selector--save PATH — Save output to file--max-length N — Truncate output to N characters (default: 10000)fetch_page.py returns empty/garbled content → try `crawl_dynamic.py` (the page needs JavaScript).crawl_dynamic.py returns 403 / Cloudflare block → try `scrapling_fetch.py --stealth` (anti-bot bypass).search_web.py "topic" → get relevant URLsfetch_page.py "best_url" → read the contentfetch_page.py "url" --selector "table" → extract tablesfetch_page.py "url" --selector ".product-card" → extract specific elementscrawl_dynamic.py "url" --wait 5 --scroll → full JS-rendered content--max-length to truncate output and avoid overwhelming the context window.~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.