技能创建器
skill-creator
创建、改进和评估自定义技能,把专业流程转化为可重复使用的 AI 能力。
headless-web-scraping【数据与研究】Extract data from web pages using the scrapling Python library — select the appropriate fetcher tier (HTTP, stealth Chromium, or full browser automation) based on target site defenses, configure headless browsing, and extract structured data with CSS selectors. Use when WebFetch is insufficient for JS-rendered pages, anti-bot-protected sites, or stru…
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
以 scrapling 之三層抓取器架構與 CSS 基資料提取自阻簡單 HTTP 請求之網頁——JS 渲染內容、 Cloudflare 保護站與動態 SPA——提取資料。
WebFetch 或 requests.get() 返空或被阻之響應定何 scrapling 抓取器配目標站之防禦。
# Decision matrix:
# 1. Fetcher — static HTML, no JS, no anti-bot (fastest)
# 2. StealthyFetcher — Cloudflare/Turnstile, TLS fingerprint checks
# 3. DynamicFetcher — JS-rendered SPAs, click/scroll interactions
# Quick probe: try Fetcher first, escalate on failure
from scrapling import Fetcher
fetcher = Fetcher()
response = fetcher.get("https://example.com/target-page")
if response.status == 200 and response.get_all_text():
print("Fetcher tier sufficient")
else:
print("Escalate to StealthyFetcher or DynamicFetcher")
| 訊號 | 建議層 |
|---|---|
| 靜態 HTML、無保護 | Fetcher |
| 403/503、Cloudflare 挑戰頁 | StealthyFetcher |
| 頁載但內容區空 | DynamicFetcher |
| 需點按鈕或滾動 | DynamicFetcher |
| altcha CAPTCHA 存 | 無(不可自動化) |
預期: 三層之一已識。對多數現代站,StealthyFetcher 為正確起點。
失敗時: 若三層皆返阻響應,核站是否用 altcha CAPTCHA(不可繞之工作量證明挑戰)。若然,記限並供手動提取指引。
以合宜選項設所擇抓取器。
from scrapling import Fetcher, StealthyFetcher, DynamicFetcher
# Tier 1: Fast HTTP with TLS fingerprint impersonation
fetcher = Fetcher()
fetcher.configure(
timeout=30,
retries=3,
follow_redirects=True
)
# Tier 2: Headless Chromium with anti-detection
fetcher = StealthyFetcher()
fetcher.configure(
headless=True,
timeout=60,
network_idle=True # wait for all network requests to settle
)
# Tier 3: Full browser automation
fetcher = DynamicFetcher()
fetcher.configure(
headless=True,
timeout=90,
network_idle=True,
wait_selector="div.results" # wait for specific element before extracting
)
預期: 抓取器實例已配可用。實例化無錯。StealthyFetcher 與 DynamicFetcher 須 Chromium 二進制(scrapling 首次執行自動管之)。
失敗時:
playwright 或瀏覽器二進制未覓 —— 執行 python -m playwright install chromiumconfigure() 之逾時 —— 增逾時值或核網路連線pip install scrapling導至目標 URL 並以 CSS 選擇器提取結構化資料。
# Fetch the page
response = fetcher.get("https://example.com/target-page")
# Single element extraction
title = response.find("h1.page-title")
if title:
print(title.get_all_text())
# Multiple elements
items = response.find_all("div.result-item")
for item in items:
name = item.find("span.name")
price = item.find("span.price")
print(f"{name.get_all_text()}: {price.get_all_text()}")
# Get attribute values
links = response.find_all("a.product-link")
urls = [link.get("href") for link in links]
# Get raw HTML content of an element
detail_html = response.find("div.description").html_content
關鍵 API 參考:
| 方法 | 用途 |
|---|---|
response.find("selector") | 首配之元素 |
response.find_all("selector") | 所有配之元素 |
element.get("attr") | 屬性值(href、src、data-*) |
element.get_all_text() | 所有文字內容,遞迴 |
element.html_content | 原始內部 HTML |
預期: 所提取資料配可見頁內容。元素非 None,文字內容於有內容頁非空。
失敗時:
find() 返 None —— 察實際 HTML(response.html_content)以驗選擇器;頁或用與預期不同之類名get_all_text() 空 —— 內容或於 shadow DOM 或 iframe 中;試 DynamicFetcher 附 wait_selector.css_first() —— 非 scrapling API 之部分(常與他庫混淆)為 CAPTCHA 偵測、空響應與會話需求實退路邏輯。
import time
def scrape_with_fallback(url, selector):
"""Try each fetcher tier in order, with CAPTCHA detection."""
tiers = [
("Fetcher", Fetcher),
("StealthyFetcher", StealthyFetcher),
("DynamicFetcher", DynamicFetcher),
]
for tier_name, tier_class in tiers:
fetcher = tier_class()
fetcher.configure(headless=True, timeout=60)
try:
response = fetcher.get(url)
except Exception as error:
print(f"{tier_name} failed: {error}")
continue
# Detect CAPTCHA / challenge pages
page_text = response.get_all_text().lower()
if "altcha" in page_text or "proof of work" in page_text:
print(f"altcha CAPTCHA detected -- cannot automate")
return None
if response.status == 403 or response.status == 503:
print(f"{tier_name} blocked (HTTP {response.status}), escalating")
continue
result = response.find(selector)
if result and result.get_all_text().strip():
return result.get_all_text()
print(f"{tier_name} returned empty content, escalating")
print("All tiers exhausted. Manual extraction required.")
return None
預期: 函數成功時返所提取文字,或於所有層失敗時返 None 附診斷訊息。CAPTCHA 頁被偵測並報,非無限重試。
失敗時:
大規模執行前實延遲並尊重站之政策。
import time
import urllib.robotparser
def check_robots_txt(base_url, target_path):
"""Check if scraping is allowed by robots.txt."""
rp = urllib.robotparser.RobotFileParser()
rp.set_url(f"{base_url}/robots.txt")
rp.read()
return rp.can_fetch("*", f"{base_url}{target_path}")
def scrape_urls(urls, selector, delay=1.0):
"""Scrape multiple URLs with rate limiting."""
results = []
fetcher = StealthyFetcher()
fetcher.configure(headless=True, timeout=60)
for url in urls:
response = fetcher.get(url)
data = response.find(selector)
if data:
results.append(data.get_all_text())
time.sleep(delay) # respect the server
return results
倫理抓取清單:
robots.txt —— 尊重 Disallow 指令預期: 抓取於受控速率執行。大量操作前核 robots.txt。無 429 響應觸發。
失敗時:
robots.txt 不允路徑 —— 尊重指令;勿覆寫configure() 方法(非棄之建構子關鍵字參數).find() / .find_all() API(非 .css_first() 或他庫方法)robots.txt.css_first() 而非 .find():scrapling 用 .find() 與 .find_all() 以選元素 —— .css_first() 屬他庫,將引 AttributeErrorFetcher 再升級 —— DynamicFetcher 因完整瀏覽器啟動慢十至五十倍configure():scrapling v0.4.x 棄傳選項予建構子;永用 configure() 方法