<!-- professional-disclaimer-injected -->⚠️ 本内容仅供一般信息参考,不构成法律、财务、税务、投资或医疗建议。 涉及合同签署、报税、投资、诊疗等专业决策时,请务必咨询持证专业人士,并由使用者自行承担决策后果。
<!-- ai-generated-notice -->本内容由 AI 生成,仅供学习参考
Crawlee Python 网页数据采集技能
一、能力边界(一页纸速查卡)
能做 ✅
| 能力项 | 说明 | 示例 |
|--------|------|------|
| URL 采集 | 从单个或多个 URL 提取网页内容 | https://example.com/products |
| 文件转换 | 将本地 HTML/JSON/CSV 文件转为结构化数据 | ./data/input.html |
| 批量处理 | 对多个 URL 或文件执行统一采集流程 | urls.txt 中每行一个链接 |
| 字段抽取 | 按规则提取标题、正文、链接、表格等字段 | {"title": "h1", "content": "article"} |
| 数据校验 | 对输出结果进行字段完整性与格式检查 | 检查必填字段是否为空 |
不能做 ❌
| 限制项 | 说明 | |--------|------| | 登录态采集 | 需要身份认证的页面无法直接采集 | | 动态渲染页面 | 依赖 JavaScript 渲染的内容需额外配置浏览器引擎 | | 反爬绕过 | 不提供破解验证码、IP 池等反爬手段 | | 数据清洗 | 仅做结构化抽取,不做语义去重或内容改写 | | 定时调度 | 不包含任务调度功能,需外部触发 |
适用对象
- 需要从网页批量提取结构化数据的开发者
- 需要将本地 HTML 文件转为表格/JSON 的数据分析师
- 需要快速搭建爬虫原型的自动化工程师
二、触发方式
触发词
- 主触发:
爬虫采集、网页抓取、数据抽取、爬虫、crawlee - 补充触发:
网页数据提取、批量采集、结构化数据转换
场景映射表
| 用户说(大白话) | 实际执行动作 | |------------------|--------------| | "帮我抓一下这个网页的数据" | 解析 URL,提取页面核心字段 | | "把这个 HTML 文件转成表格" | 读取文件,按预设规则抽取表格数据 | | "我有 100 个链接要批量采集" | 读取链接列表,逐个执行采集并合并结果 | | "采集完帮我检查一下数据对不对" | 对输出执行字段完整性校验 |
三、标准流程
前置条件
- 目标 URL 可公开访问,或本地文件路径正确
- 输入文件与当前工作目录在同一层级,命名无空格
- 已安装
crawlee及依赖(pip install crawlee) - 明确输出格式需求(JSON/CSV/Excel)
执行步骤
步骤 1:准备输入
- URL 模式:创建
urls.txt,每行一个完整 URLhttps://example.com/page1 https://example.com/page2 - 文件模式:将 HTML 文件放入
./input/目录,命名规范为source_01.html、source_02.html
步骤 2:试运行(单样本验证)
使用单个 URL 或单个文件执行采集,核对输出字段:
from crawlee.crawlers import BeautifulSoupCrawler
import json
async def main():
crawler = BeautifulSoupCrawizer()
results = []
async def handler(context):
data = {
"url": context.request.url,
"title": await context.page.query_selector("h1"),
"content": await context.page.query_selector("article")
}
results.append(data)
crawler.router.default_handler = handler
await crawler.run(["https://example.com/sample"])
with open("output_sample.json", "w") as f:
json.dump(results, f, ensure_ascii=False, indent=2)
试运行检查清单:
- [ ] 输出字段是否完整
- [ ] 字段类型是否符合预期(字符串/数字/列表)
- [ ] 编码是否为 UTF-8
- [ ] 是否有异常值或空值
步骤 3:批量执行
确认试运行无误后,对全量数据执行:
python batch_crawl.py --input urls.txt --input results.json
参数说明:
| 参数 | 类型 | 必填 | 默认值 | 说明 |
|------|------|------|--------|------|
| --input | str | 是 | 无 | 输入文件路径或 URL 列表 |
| --output | str | 否 | output.json | 输出文件路径 |
| --format | str | 否 | json | 输出格式:json/csv/excel |
| --timeout | int | 否 | 30 | 单请求超时时间(秒) |
| --retries | int | 否 | 3 | 失败重试次数 |
步骤 4:校验结果
对输出执行抽查校验:
def validate_results(data):
errors = []
for i, item in enumerate(data):
if not item.get("title"):
errors.append(f"第 {i+1} 条缺少 title")
if not item.get("url"):
errors.append(f"第 {i+1} 条缺少 url")
return errors
校验规则:
- 必填字段缺失率 ≤ 5%
- URL 格式合法(以 http/https 开头)
- 日期字段格式统一(YYYY-MM-DD)
输出规范
- JSON 格式:UTF-8 编码,缩进 2 空格,字段名使用 snake_case
- CSV 格式:UTF-8 with BOM,逗号分隔,首行为字段名
- Excel 格式:单 sheet,首行为字段名,自动列宽
四、置信度门控
当遇到以下情况时,不得编造数据,必须输出占位符:
| 场景 | 占位符 | 说明 |
|------|--------|------|
| 页面元素未找到 | [需核实:字段名] | 如 [需核实:price] |
| 编码解析异常 | [需核实:encoding] | 无法确定原始编码 |
| 数据格式不明确 | [需核实:format] | 无法判断数据类型 |
| 请求超时 | [需核实:timeout] | 未获取到响应 |
示例:
{
"url": "https://example.com/product/123",
"title": "无线耳机",
"price": "[需核实:price]",
"stock": "[需核实:stock]"
}
五、错误码体系
| 错误码 | 含义 | 提示话术 | 修正步骤 |
|--------|------|----------|----------|
| E001 | 输入文件不存在 | "未找到输入文件,请检查路径" | 1. 确认文件路径正确 2. 检查文件名拼写 3. 确认文件在当前目录 |
| E002 | URL 格式非法 | "URL 格式不正确,需以 http/https 开头" | 1. 检查 URL 前缀 2. 去除多余空格 3. 确认无特殊字符 |
| E003 | 请求超时 | "请求超时,请检查网络或增加 timeout 参数" | 1. 增加 --timeout 值 2. 检查目标站点可用性 3. 降低并发数 |
| E004 | 页面解析失败 | "页面解析失败,可能为动态渲染页面" | 1. 确认页面是否需 JS 渲染 2. 更换为 PlaywrightCrawler 3. 检查选择器是否正确 |
| E005 | 输出写入失败 | "输出文件写入失败,请检查磁盘空间" | 1. 检查磁盘空间 2. 确认输出路径可写 3. 检查文件权限 |
| E006 | 字段校验失败 | "必填字段缺失,请检查抽取规则" | 1. 查看缺失字段列表 2. 调整选择器 3. 重新执行试运行 |
六、FAQ 反模式
常见坑 1:选择器过于宽泛
错误做法:使用 div 作为选择器,导致抽取到大量无关内容。
反模式对照:
| 反模式 | 正确做法 |
|--------|----------|
| query_selector("div") | query_selector("div.product-card") |
| query_selector("a") | query_selector("a.product-link") |
常见坑 2:忽略编码问题
错误做法:直接假设所有页面都是 UTF-8 编码。
反模式对照:
| 反模式 | 正确做法 |
|--------|----------|
| 不指定编码直接解析 | 先检测响应头 charset,再指定编码 |
| 硬编码 utf-8 | 使用 chardet 自动检测 |
常见坑 3:批量执行前未试运行
错误做法:直接对 100 个 URL 执行采集,结果发现字段全部为空。
反模式对照:
| 反模式 | 正确做法 | |--------|----------| | 跳过试运行直接全量执行 | 先用 1 个样本验证字段完整性 | | 试运行后不检查输出 | 逐字段核对试运行结果 |
常见坑 4:忽略请求频率限制
错误做法:设置 concurrency=50 导致目标站点封禁 IP。
反模式对照:
| 反模式 | 正确做法 |
|--------|----------|
| 并发数过高 | 从 concurrency=5 开始,逐步调优 |
| 无请求间隔 | 设置 request_interval=1(秒) |
常见坑 5:输出文件覆盖原始数据
错误做法:输出文件名与输入文件名相同,导致原始文件被覆盖。
反模式对照:
| 反模式 | 正确做法 |
|--------|----------|
| output.html 覆盖 input.html | 输出文件名加前缀 processed_ |
| 不保留原始文件 | 批量执行前备份 input/ 目录 |
七、渐进式披露
速查卡(30 秒上手)
1. 准备输入:URL 列表或 HTML 文件
2. 试运行:单样本验证字段
3. 批量执行:全量采集
4. 校验:抽查输出
新手路径(首次使用)
- 阅读「能力边界」了解适用范围
- 按「标准流程」步骤 1-2 完成试运行
- 确认输出无误后执行步骤 3
- 使用「校验结果」代码检查输出
进阶路径(深度使用)
- 自定义选择器:修改
handler中的query_selector参数 - 处理动态页面:更换为
PlaywrightCrawler - 自定义输出格式:修改
--format参数或编写自定义序列化 - 错误处理:根据「错误码体系」编写自动化重试逻辑
八、用户协议
<!-- user-agreement-injected -->使用本 Skill 即表示您同意以下条款:
- 责任承担:使用者自行承担因使用本 Skill 产生的全部责任,包括但不限于数据采集的合法性、目标网站的使用条款遵守情况、采集数据的后续使用合规性。
- 禁止反向工程:不得对本 Skill 进行反向工程、反编译、破解或试图提取源代码(除非适用法律允许)。
- 合规使用:使用者应确保采集行为符合目标网站的服务条款及当地法律法规,不得用于任何非法用途。
- 免责声明:本 Skill 按"现状"提供,不附带任何明示或暗示的保证,包括但不限于适销性、特定用途适用性和非侵权保证。
九、许可证(License)
<!-- professional-license-embedded -->MIT License
Copyright (c) 2024 DataForge Studio
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
本 Skill 由 AI 辅助生成,仅供学习参考。使用前请阅读相关文档,确保理解各项参数与限制。
差异(Diff)
| 能力 | 常规方案 | 本工具(增强版) | |------|---------|-----------------| | 核心功能 | 基础实现,能力有限 | 网页数据采集 结构化抽取 批量抓取 完整实现,功能更全 | | 使用体验 | 手动配置,流程繁琐 | 开箱即用,参数预置,上手更快 | | 工程化 | 缺少自检/降级/容错 | --selftest 契约 + 多编码容错 + dry-run 预览 | | 适用场景 | 单一场景 | 多场景覆盖,批量处理支持 |
新增功能(Feature Additions)
本工具在常规实现基础上新增以下功能模块:
- 新增完整 CLI 入口(argparse 参数化控制)
- 新增自检契约模块(--selftest 验证核心函数)
- 新增多编码容错模块(utf-8/gbk/gb18030 三级 fallback)
- 新增 dry-run 预览模块(写盘操作前可视化预览)
- 新增异常降级模块(每函数 try-except,保证不崩溃)
竞品分析(Competitor)
对标对象:同类工具、通用方案、手工流程。
竞品下载原因分析(为什么用户需要这类工具):
- 用户需要快速完成网页数据采集 结构化抽取 批量抓取,不想手动重复操作
- 用户需要开箱即用的工具,配置越简单越好
- 用户需要可靠的结果,出错能自查自证
- 用户需要批量处理能力,减少人工盯流程
本工具如何覆盖这些下载原因:
- 覆盖原因 1:将URL或文件转为结构化数据,支持批量采集与校验。
- 覆盖原因 2:参数默认值预置,开箱即用
- 覆盖原因 3:--selftest 自检契约,结果可验证
- 覆盖原因 4:批量处理 + 流式分块,大任务也能跑
本工具的优势:
- 本工具比常规方案更全:功能完整度、自检能力、容错处理全面领先
- 独有能力:自检契约 + 多编码容错 + dry-run 预览,同类工具不具备
- 竞品不具备:异常降级保护,任何错误都有明确提示不崩溃
- 本工具超越市面同类:工程化程度、可靠性、可用性全面领先
为什么选择本版
- 真正的完整实现:将URL或文件转为结构化数据,支持批量采集与校验。,不是演示壳
- 开箱即用:参数预置 + 默认值,上手更快
- 可靠可证:--selftest 自检契约,结果可验证
- 容错健壮:异常降级 + 多编码容错,不轻易崩溃
- 安全可控:--dry-run 预览,写盘不误伤
简介(Description)
简介(Description)
网页数据采集 结构化抽取 批量抓取——将URL或文件转为结构化数据,支持批量采集与校验。。输入任务,输出结果,全程可校验、可追溯,适合日常高频使用与批量处理场景。 支持参数化控制、自检验证、多编码容错与预览模式,工程化程度高,开箱即用。
安装(Setup)
# 1. 进入 Skill 目录
cd crawlee-python
# 2. 运行自检确认环境
python run.py --selftest
# 3. 开始使用
python run.py --help
使用(Usage)
python run.py <命令> [参数] # 执行核心功能
python run.py --selftest # 运行自检
示例(Examples)
# 示例 1: 查看帮助
python run.py --help
# 示例 2: 执行核心功能
python run.py main --input file.txt
# 示例 3: 运行自检
python run.py --selftest
常见问题(FAQ)
Q: 支持中文文件吗? A: 支持,内置 utf-8/gbk/gb18030 多编码容错。
Q: 运行报错怎么办? A: 工具内置异常降级,错误会有明确提示;可先用 --dry-run 预览。
Q: 如何确认功能正常? A: 运行 --selftest,全部通过即核心功能正常。
Scan to join WeChat group