# Scrapling 踩坑记录与解决方案

## ModuleNotFoundError: curl_cffi

**错误信息**: `ModuleNotFoundError: No module named 'curl_cffi'`
**原因**: 安装了基础包 `pip install scrapling`，不含抓取依赖
**解决方案**:
```bash
pip install "scrapling[fetchers]"
```

## Cloudflare 403 + "Just a moment"

**错误信息**: 返回 403，页面内容包含 "Just a moment" 或 "Checking your browser"
**原因**: Fetcher（curl_cffi）无法通过 Cloudflare 验证
**解决方案**: 换用 StealthyFetcher + `solve_cloudflare=True`
```python
from scrapling.fetchers import StealthyFetcher
page = StealthyFetcher.fetch(url, headless=True, solve_cloudflare=True, timeout=60000)
```

## cf_clearance cookie 无效

**错误信息**: 手动传入 `cf_clearance` cookie 但仍被 Cloudflare 拦截
**原因**: `cf_clearance` 绑定浏览器指纹（TLS/JA3/UA），不可跨客户端复用
**解决方案**: 不要手动传 `cf_clearance`，让 StealthyFetcher 自己通过 Cloudflare 获取

## Expected array, got object at $.cookies

**错误信息**: `Expected array, got object` at `$.cookies`
**原因**: 浏览器 Fetcher（StealthyFetcher/DynamicFetcher）cookie 必须是 `list[dict]`，不能是 `dict`
**解决方案**:
```python
# ❌ 错误
cookies = {'name': 'value'}

# ✅ 正确
cookies = [{'name': 'cookie_name', 'value': 'cookie_value', 'domain': '.site.com', 'path': '/'}]
```

## Cookie should have a url or a domain/path pair

**错误信息**: `Cookie should have a url or a domain/path pair`
**原因**: cookie dict 缺少 `domain` 和 `path` 字段
**解决方案**: 每个 cookie dict 必须包含 `domain`（以 `.` 开头）和 `path`（通常 `/`）
```python
cookies = [
    {'name': 'token', 'value': 'abc', 'domain': '.example.com', 'path': '/'},
]
```

## 404 "page is private"

**错误信息**: 返回 404，页面提示内容为私有
**原因**: Cloudflare 已通过，但目标页面需要登录态
**解决方案**: 带上登录 cookie（从浏览器手动获取），参见 `cookie-vault.md`
```python
page = StealthyFetcher.fetch(
    url,
    solve_cloudflare=True,
    cookies=[{'name': '_session', 'value': '...', 'domain': '.site.com', 'path': '/'}],
    timeout=60000,
)
```

## Cloudflare 多轮 Turnstile

**现象**: StealthyFetcher 运行时间很长（30-90 秒），日志显示多次 Turnstile 验证
**原因**: 正常现象，Cloudflare 有时需要 2-3 轮验证
**解决方案**: 耐心等待，确保 `timeout` 足够长（至少 60000ms）。如果超时失败，增加到 120000ms 重试

## scrapling: command not found

**错误信息**: `scrapling: command not found`
**原因**: Python Scripts 目录不在 PATH 中
**解决方案**:
```python
# 方式 1: 使用 python -c
python -c "from scrapling.cli import main; main(['install'])"

# 方式 2: 使用 python -m（如果支持）
python -m scrapling install
```

## StealthyFetcher/DynamicFetcher 报浏览器未安装

**错误信息**: 类似 "browser not found" 或 Playwright/Camoufox 相关错误
**原因**: 未安装浏览器依赖
**解决方案**:
```bash
# 安装 scrapling 浏览器依赖
scrapling install
# 或
python -c "from scrapling.cli import main; main(['install'])"
```
