| --- |
| title: Smart Search Crawler |
| emoji: 🕷️ |
| colorFrom: blue |
| colorTo: indigo |
| sdk: docker |
| pinned: false |
| --- |
| |
| # Smart Search Crawler - 多平台商品爬虫系统 |
|
|
| 基于 **Crawlee** + **Playwright** 的高性能商品数据抓取工具,采用 TypeScript 编写,支持动态扩展多个电商平台。 |
|
|
| ## ✨ 核心特性 |
|
|
| - 🚀 **高性能并发**: 支持多线程并发爬取,智能资源拦截加速 |
| - 🛡️ **防封禁策略**: 三种预设模式(快速/稳定/隐蔽)应对不同场景 |
| - 🔌 **动态路由架构**: 通过 `source` 参数自动选择对应平台爬虫,易于扩展 |
| - 📊 **灵活配置**: 集中化 CSS 选择器管理,支持运行时切换 |
| - 💾 **多格式输出**: 支持 JSON 和 CSV 格式导出 |
| - 🔧 **类型安全**: 完整的 TypeScript 类型定义 |
| - 🌐 **REST API**: 简洁的 HTTP 接口,支持批量爬取 |
| - ☁️ **多云部署**: 支持 Hugging Face Spaces、Render.com、VPS 等多种部署方式 |
|
|
| --- |
|
|
| ## 🚀 快速开始 |
|
|
| ### 1. 安装依赖 |
|
|
| ```bash |
| npm install |
| ``` |
|
|
| ### 2. 安装 Playwright 浏览器 |
|
|
| ```bash |
| npx playwright install chromium |
| ``` |
|
|
| **国内用户加速:** |
| ```powershell |
| # PowerShell |
| $env:PLAYWRIGHT_DOWNLOAD_HOST="https://npmmirror.com/mirrors/playwright/" |
| npx playwright install chromium |
| ``` |
|
|
| ### 3. 启动 Web 服务 |
|
|
| ```bash |
| npm run serve |
| ``` |
|
|
| 服务将在 `http://localhost:7860` 启动。 |
|
|
| --- |
|
|
| ## 📡 API 使用指南 |
|
|
| ### 1. 健康检查 |
|
|
| **请求:** |
| ```bash |
| curl http://localhost:7860/health |
| ``` |
|
|
| **响应:** |
| ```json |
| { |
| "status": "ok", |
| "service": "smart-search-crawler", |
| "timestamp": "2024-04-20T14:00:00.000Z", |
| "supportedSources": ["Otto"] |
| } |
| ``` |
|
|
| ### 2. 执行爬取任务 |
|
|
| **请求:** |
| ```bash |
| curl -X POST http://localhost:7860/crawl \ |
| -H "Content-Type: application/json" \ |
| -d '{ |
| "source": "Otto", |
| "urls": [ |
| "https://www.otto.de/p/product-url-1", |
| "https://www.otto.de/p/product-url-2" |
| ], |
| "preset": "stable" |
| }' |
| ``` |
|
|
| **参数说明:** |
|
|
| | 参数 | 类型 | 必填 | 说明 | |
| |------|------|------|------| |
| | `source` | string | ✅ | 爬虫源标识(如 `"Otto"`),系统根据此值动态路由到对应爬虫 | |
| | `urls` | string[] | ✅ | 待爬取的商品 URL 数组 | |
| | `preset` | string | ❌ | 预设模式:`fast` / `stable`(默认)/ `stealth` | |
|
|
| **响应示例:** |
| ```json |
| { |
| "success": true, |
| "source": "Otto", |
| "count": 2, |
| "data": [ |
| { |
| "url": "https://www.otto.de/p/product-url-1", |
| "crawledAt": "2024-04-20T14:00:00.000Z", |
| "price": "279,99 €", |
| "rating": "4.5", |
| "reviews": "(434)", |
| "title": "Samsung Galaxy S23...", |
| "imageUrl": "https://..." |
| } |
| ] |
| } |
| ``` |
|
|
| --- |
|
|
| ## ⚙️ 配置详解 |
|
|
| ### 预设模式对比 |
|
|
| | 模式 | 并发数 | 超时 | 重试次数 | 适用场景 | |
| |------|--------|------|----------|----------| |
| | **fast** | 20 | 30s | 1 | 快速测试、少量 URL | |
| | **stable** | 5 | 90s | 1 | 生产环境(✅ 推荐) | |
| | **stealth** | 3 | 180s | 1 | 大规模爬取、防封禁 | |
|
|
| --- |
|
|
| ## ☁️ Hugging Face Spaces 部署说明 |
|
|
| 本 Space 已配置为 Docker 部署模式,具有以下特点: |
|
|
| ### 环境配置 |
| - **服务器位置**: 欧洲(访问 Otto.de 等欧洲网站速度快) |
| - **端口**: 7860(HF 强制要求) |
| - **内存**: 16GB RAM |
| - **CPU**: 2 vCPU |
|
|
| ### 性能建议 |
| - **推荐并发数**: 1-2(避免 OOM) |
| - **超时设置**: 120秒(适应跨国网络) |
| - **休眠策略**: 48小时无访问自动休眠 |
|
|
| ### 使用示例 |
|
|
| ```bash |
| # 测试健康检查 |
| curl https://sky5678-crawler.hf.space/health |
| |
| # 执行爬取任务 |
| curl -X POST https://sky5678-crawler.hf.space/crawl \ |
| -H "Content-Type: application/json" \ |
| -d '{ |
| "source": "Otto", |
| "urls": ["https://www.otto.de/p/example-product/"], |
| "preset": "stable" |
| }' |
| ``` |
|
|
| --- |
|
|
| ## 🏗️ 项目结构 |
|
|
| ``` |
| crawler/ |
| ├── src/ |
| │ ├── config.ts # 全局配置(选择器、预设模式) |
| │ ├── otto-crawler.ts # Otto 平台核心爬虫实现 |
| │ └── batch-crawler.ts # 批量处理与文件 I/O |
| ├── examples/ |
| │ └── usage-examples.ts # 代码集成示例 |
| ├── server.ts # Express REST API 服务 |
| ├── quick-start.ts # 交互式命令行工具 |
| ├── Dockerfile # Docker 容器化配置 |
| └── .github/workflows/ # GitHub Actions CI/CD |
| ``` |
|
|
| --- |
|
|
| ## ⚠️ 注意事项 |
|
|
| 1. **遵守 robots.txt**: 请尊重目标网站的爬虫政策 |
| 2. **控制频率**: 建议使用 `stable` 或 `stealth` 模式 |
| 3. **网络优化**: HF Spaces 位于欧洲,访问欧洲电商网站延迟低 |
| 4. **选择器维护**: 网站结构变更可能导致选择器失效 |
|
|
| --- |
|
|
| ## 📄 许可证 |
|
|
| MIT License |
|
|
| --- |
|
|
| ## 🤝 贡献 |
|
|
| 欢迎提交 Issue 和 Pull Request! |
|
|
| **扩展新平台的步骤:** |
| 1. 在 `src/` 下创建新的爬虫文件 |
| 2. 实现统一的 `ProductData[]` 返回接口 |
| 3. 在 `server.ts` 的 `crawlerMap` 中注册 |
| 4. 提交 PR 并添加测试用例 |
|
|