网
网页采集与数据提取引擎
作者:鹿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 一律优先。
支持平台:Qoder · QoderWork · Claude · Codex 等 AI 编程助手