网

网页采集与数据提取引擎

作者:鹿Sir开发工具v4

完整的网页采集方法论,覆盖合法合规评估、架构选型、请求工程、解析提取、反爬应对、数据管道与生产运维。当用户需要构建爬虫、提取网页数据、监控竞品价格或规模化自动化采集时触发。触发词:爬虫、网页采集、数据提取、抓取数据、竞品监控、scraping。

下载量
371
点赞
93
价格
¥1.99
精选

技能文档

---
name: afrexai-web-scraping-engine
title: 网页采集与数据提取引擎
description: 完整的网页采集方法论,覆盖合法合规评估、架构选型、请求工程、解析提取、反爬应对、数据管道与生产运维。当用户需要构建爬虫、提取网页数据、监控竞品价格或规模化自动化采集时触发。触发词:爬虫、网页采集、数据提取、抓取数据、竞品监控、scraping。
category: 开发工具
---

# 网页采集与数据提取引擎

## 快速健康检查(先跑)

给现有采集体系打分(每项 2 分):

| 信号 | 健康 | 不健康 |
|------|------|--------|
| 合法合规 | 已查 robots.txt、已审服务条款 | 盲目抓取 |
| 架构 | 工具匹配站点复杂度 | 静态 HTML 却上无头浏览器 |
| 反爬应对 | 轮换、延迟、指纹多样化 | 单 IP、无延迟 |
| 数据质量 | 有校验 + 去重管道 | 原始堆dump、不清洗 |
| 错误处理 | 重试逻辑、熔断器 | 首个 403 即崩溃 |
| 监控 | 成功率可视、有告警 | 黑盒运行 |
| 存储 | 结构化、去重、版本化 | 平铺文件、重复数据 |
| 调度 | 频率合理、错峰执行 | 业务时段高频轰击 |

**评分 /16**:12+ 可投产;8-11 需改进;<8 停下重新设计。

## 技能工作流

### 步骤1:合法合规评估

抓取前逐项核对:robots.txt 规则、服务条款是否禁止采集、是否有可用 API(有 API 优先用 API)、数据分类(公开事实/个人信息/需登录/版权内容)、是否含个人身份信息(PII)与 GDPR 适用性。目标站点的 AI 爬虫封锁规则需单独确认。任一硬性禁止项命中 → 不采集并给出替代方案。详见 [references/compliance-architecture.md](references/compliance-architecture.md)。

### 步骤2:架构选型

按站点复杂度选工具:静态 HTML 用 requests + 解析器;分页多、需并发用 Scrapy;JS 渲染/重交互用 Playwright;规模化商用考虑托管服务。不确定时先检查目标数据是否由接口 JSON 返回(网络面板挖接口优先于解析 HTML)。详见 [references/compliance-architecture.md](references/compliance-architecture.md)。

### 步骤3:请求工程

设置真实浏览器头、随机延迟、指数退避重试、请求头轮换与限速规则。核心请求模式:

```python
# Python example — production request pattern
import requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry

session = requests.Session()

# Retry strategy
retry = Retry(
    total=3,
    backoff_factor=1,      # 1s, 2s, 4s
    status_forcelist=[429, 500, 502, 503, 504],
    respect_retry_after_header=True
)
session.mount("https://", HTTPAdapter(max_retries=retry))

# Realistic headers
session.headers.update({
    "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36",
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
    "Accept-Language": "en-US,en;q=0.9",
    "Accept-Encoding": "gzip, deflate, br",
    "Connection": "keep-alive",
    "Cache-Control": "no-cache",
})
```

```

### 步骤4:解析提取

提取优先级:JSON-LD 结构化数据 → Open Graph 元标签 → microdata → CSS 选择器兜底。分页识别三种模式(下一页按钮、接口分页、游标分页)。JS 渲染内容用 Playwright 等待真实渲染完成再取 DOM。详见 [references/pipeline-operations.md](references/pipeline-operations.md)。

### 步骤5:反爬应对

了解站点检测信号(TLS 指纹、头顺序、行为分析、IP 信誉)后针对性应对:住宅/数据中心代理分级使用、指纹多样化、Playwright 隐身配置。遇到 Cloudflare 等强防护时先评估合规边界再决定是否绕行。详见 [references/pipeline-operations.md](references/pipeline-operations.md)。

### 步骤6:数据管道与存储

入库前先校验(必填字段、类型、范围、格式),再按内容指纹去重;存储首选 SQLite,大批量用 JSON Lines 流式导出。核心校验与存储模式:

```python
# Validation pattern — validate BEFORE storing
from dataclasses import dataclass, field
from typing import Optional
import re
from datetime import datetime

@dataclass
class ScrapedProduct:
    url: str
    title: str
    price: Optional[float]
    currency: str = "USD"
    scraped_at: str = field(default_factory=lambda: datetime.utcnow().isoformat())
    
    def validate(self) -> list[str]:
        errors = []
        if not self.url.startswith('http'):
            errors.append("Invalid URL")
        if not self.title or len(self.title) < 3:
            errors.append("Title too short or missing")
        if self.price is not None and self.price < 0:
            errors.append("Negative price")
        if self.price is not None and self.price > 1_000_000:
            errors.append("Price suspiciously high — verify")
        if self.currency not in ("USD", "EUR", "GBP", "BTC"):
            errors.append(f"Unknown currency: {self.currency}")
        return errors
```

```

```python
### SQLite Pattern (Most Common)

```python
import sqlite3
import json
from datetime import datetime

def init_db(path="scraper_data.db"):
    conn = sqlite3.connect(path)
    conn.execute("""
        CREATE TABLE IF NOT EXISTS items (
            id INTEGER PRIMARY KEY,
            url TEXT UNIQUE,
            data JSON NOT NULL,
            scraped_at TEXT DEFAULT (datetime('now')),
            updated_at TEXT,
            checksum TEXT
        )
    """)
    conn.execute("CREATE INDEX IF NOT EXISTS idx_url ON items(url)")
    conn.execute("CREATE INDEX IF NOT EXISTS idx_scraped ON items(scraped_at)")
    return conn

def upsert(conn, url, data, checksum):
    conn.execute("""
        INSERT INTO items (url, data, checksum) VALUES (?, ?, ?)
        ON CONFLICT(url) DO UPDATE SET
            data = excluded.data,
            updated_at = datetime('now'),
            checksum = excluded.checksum
        WHERE items.checksum != excluded.checksum
    """, (url, json.dumps(data), checksum))
    conn.commit()
```

```

### 步骤7:错误处理与运维

错误分类(网络/封禁/解析/数据)并差异化处理;高频失败触发熔断;检查点断点续采;监控成功率、检测页面结构变更导致的采集损坏,准备运维手册。熔断器模式:

```python
### Circuit Breaker Pattern

```python
class CircuitBreaker:
    def __init__(self, failure_threshold=5, reset_timeout=300):
        self.failures = 0
        self.threshold = failure_threshold
        self.reset_timeout = reset_timeout
        self.last_failure = 0
        self.state = "closed"  # closed | open | half-open
    
    def record_failure(self):
        self.failures += 1
        self.last_failure = time.time()
        if self.failures >= self.threshold:
            self.state = "open"
            # Alert: "Circuit open — too many failures"
    
    def record_success(self):
        self.failures = 0
        self.state = "closed"
    
    def can_proceed(self):
        if self.state == "closed":
            return True
        if self.state == "open":
            if time.time() - self.last_failure > self.reset_timeout:
                self.state = "half-open"
                return True  # Try one request
            return False
        return True  # half-open: allow attempt
```

```

## 常见错误(前 5)

1. 不看 robots.txt / 服务条款直接抓
2. 静态页面动用无头浏览器(慢且易被封)
3. 无重试与延迟 → 请求风暴触发封禁
4. 不去重 → 数据冗余、分析失真
5. 无结构变更监控 → 站点改版后静默采回垃圾数据

## 质量评分(0-100)

合规(20) + 架构合理(15) + 反爬韧性(15) + 数据质量(20) + 错误恢复(15) + 可观测性(15)。低于 60 分不应投产。

## 自然语言指令示例

- 「检查我能否采集 example.com/products」
- 「给 3 个竞品站做价格监控爬虫」
- 「我的爬虫老被封,帮我排查」
- 「从这个 URL 提取商品数据」

使用说明

# 网页采集与数据提取引擎

完整网页采集方法论:合规评估 → 架构选型 → 请求工程 → 解析提取 → 反爬应对 → 数据管道 → 生产运维。

## 最简用法

```text
检查我能否采集 example.com/products
```

```text
给 3 个竞品站做价格监控爬虫
```

```text
我的爬虫老是被封,帮我排查
```

## 目录结构

- `SKILL.md`:主工作流(健康检查、七步流程、常见错误与评分)
- `references/compliance-architecture.md`:合规清单、法律速查与工具选型
- `references/pipeline-operations.md`:解析优先级、反爬策略与运维手册

## 原则

先合规后采集:robots.txt、服务条款、PII 与 GDPR 红线任一命中即停;有官方 API 一律优先。

如何安装此技能?

访问技能市场,点击「安装」按钮,按提示将技能包放入 AI 编程助手的 skills 目录即可。

浏览技能市场

支持平台:Qoder · QoderWork · Claude · Codex 等 AI 编程助手