logo
0
0
WeChat Login

🎭 网页内容抓取工具

基于 Node.js 和 Playwright 的智能网页内容提取服务,支持抓取网页标题和正文内容。

🌟 功能特性

  • 🎭 基于 Playwright - 高性能浏览器自动化引擎
  • 🚀 RESTful API - 标准化的API接口
  • 🎨 现代化界面 - 响应式设计的测试页面
  • 📱 移动端支持 - 完美适配各种设备
  • 🐳 Docker 部署 - 容器化部署,开箱即用
  • 🛡️ 安全防护 - 完善的安全措施和错误处理
  • 📊 智能提取 - 多种内容选择器,适配各类网站
  • 🔄 双重策略 - 简化版+完整版抓取策略

🚀 快速开始

方式一:本地开发

  1. 克隆项目
git clone <repository-url> cd playwright-web-scraper
  1. 安装依赖
npm install
  1. 安装 Playwright 浏览器
npm run install-browsers
  1. 启动开发服务器
npm run dev
  1. 访问应用

方式二:Docker 部署(推荐)

使用自动化脚本(最简单)

# 构建镜像 ./scripts/docker-build.sh prod # 启动服务 ./scripts/docker-deploy.sh start prod # 查看状态 ./scripts/docker-deploy.sh status # 查看日志 ./scripts/docker-deploy.sh logs

使用 Docker Compose

# 启动服务 ./scripts/docker-compose-deploy.sh up # 查看状态 ./scripts/docker-compose-deploy.sh status # 查看日志 ./scripts/docker-compose-deploy.sh logs # 停止服务 ./scripts/docker-compose-deploy.sh down

使用 npm 脚本

# 构建镜像 npm run docker:build # 启动服务 npm run docker:up # 查看日志 npm run docker:logs # 停止服务 npm run docker:down

📖 详细部署指南: 查看 DOCKER_DEPLOYMENT.md 获取完整的Docker部署文档

🔧 故障排除: 如遇到浏览器安装问题,请查看 TROUBLESHOOTING.md

📖 API 文档

抓取网页内容

接口地址: POST /api/scrape

请求头:

Content-Type: application/json

请求参数:

{ "url": "https://example.com" }

成功响应:

{ "success": true, "data": { "url": "https://example.com", "title": "页面标题", "content": "页面正文内容...", "contentLength": 1234, "metadata": { "description": "页面描述", "keywords": "关键词1,关键词2", "author": "作者名称", "publishTime": "2023-12-01T12:00:00Z", "url": "实际访问的URL" }, "scrapeTime": "2023-12-01T12:00:00.000Z" } }

错误响应:

{ "success": false, "error": "错误描述信息" }

健康检查

接口地址: GET /health

响应:

{ "status": "ok", "message": "服务运行正常" }

🏗️ 项目结构

playwright-web-scraper/ ├── src/ │ ├── server.js # Express 服务器主文件 │ ├── scraper.js # 完整版抓取器 │ └── scraper-simple.js # 简化版抓取器 ├── public/ │ └── index.html # 前端测试页面 ├── scripts/ │ ├── docker-build.sh # Docker 构建脚本 │ ├── docker-deploy.sh # Docker 部署脚本 │ └── docker-compose-deploy.sh # Docker Compose 部署脚本 ├── spec/ │ └── req.md # 需求文档 ├── logs/ # 日志目录(Docker挂载) ├── package.json # 项目配置 ├── Dockerfile # 基础Docker配置 ├── Dockerfile.production # 生产环境Docker配置 ├── docker-compose.yml # Docker Compose配置 ├── .dockerignore # Docker忽略文件 ├── .env.example # 环境变量示例 ├── DOCKER_DEPLOYMENT.md # Docker部署详细指南 └── README.md # 项目说明

🛠️ 技术栈

  • 后端框架: Node.js + Express
  • 抓取引擎: Playwright (Chromium)
  • 前端技术: 原生 HTML/CSS/JavaScript
  • 容器化: Docker + Docker Compose
  • 安全组件: Helmet + CORS

⚙️ 配置说明

环境变量

变量名默认值说明
PORT3000服务端口
NODE_ENVdevelopment运行环境
PLAYWRIGHT_BROWSERS_PATH-Playwright浏览器路径

Playwright 配置特性

  • ✅ 使用 Chromium 浏览器(最佳兼容性)
  • ✅ 无头模式运行(节省资源)
  • ✅ 智能内容选择器(适配各种网站)
  • ✅ 双重抓取策略(提高成功率)
  • ✅ 自动超时处理(避免卡死)

🚀 部署指南

生产环境部署

1. 使用 Docker Compose(推荐)

# 克隆项目 git clone <repository-url> cd playwright-web-scraper # 启动服务 docker-compose up -d # 检查状态 docker-compose ps # 查看日志 docker-compose logs -f

2. 直接部署

# 安装依赖 npm ci --only=production # 安装浏览器 npx playwright install --with-deps chromium # 启动服务 NODE_ENV=production npm start

3. 使用 PM2(进程管理)

# 安装PM2 npm install -g pm2 # 启动应用 pm2 start src/server.js --name "playwright-scraper" # 查看状态 pm2 status # 查看日志 pm2 logs playwright-scraper

性能优化建议

  1. 内存配置: 建议至少 1GB RAM
  2. 并发限制: 可通过环境变量控制并发数
  3. 缓存策略: 可添加 Redis 缓存重复请求
  4. 负载均衡: 可使用 Nginx 进行负载均衡

🔒 安全考虑

  • Helmet 中间件 - 设置安全HTTP头
  • CORS 保护 - 跨域请求控制
  • URL 验证 - 严格的URL格式检查
  • 超时控制 - 防止长时间占用资源
  • 非 root 用户 - 容器内使用非特权用户
  • 内容长度限制 - 防止内存溢出

🐛 故障排除

常见问题及解决方案

1. 浏览器安装失败

# 清理缓存重新安装 rm -rf ~/.cache/ms-playwright npm run install-browsers

2. 抓取超时

  • 检查目标网站是否可访问
  • 增加超时时间配置
  • 检查网络连接状态

3. Docker 构建失败

# 清理Docker缓存 docker system prune -a # 重新构建 npm run docker:build

4. 内存不足

# 增加Docker内存限制 docker run -m 2g -p 3000:3000 playwright-scraper

调试模式

# 启用详细日志 DEBUG=playwright:* npm start # 非无头模式(本地调试) HEADLESS=false npm start

📊 支持的网站类型

网站类型支持程度说明
微信公众号✅ 完美支持专用选择器优化
知乎✅ 良好支持通用选择器适配
博客网站✅ 良好支持标准HTML结构
新闻网站✅ 良好支持多种选择器覆盖
政府网站⚠️ 部分支持可能有访问限制
SPA应用⚠️ 部分支持需要等待JS渲染

🔧 开发指南

添加新的内容选择器

src/scraper-simple.js 中添加:

const selectors = [ 'article', '.your-new-selector', // 添加新选择器 // ... ];

自定义元数据提取

修改 src/scraper-simple.js 中的元数据提取逻辑:

const metadata = { // 现有字段... customField: getMeta('custom-meta-name') };

扩展API接口

src/server.js 中添加新的路由:

app.post('/api/batch-scrape', async (req, res) => { // 批量抓取逻辑 });

📈 性能指标

  • 启动时间: < 10秒
  • 单次抓取: 2-15秒(取决于网站复杂度)
  • 内存占用: 200-500MB
  • 并发支持: 建议 < 10个并发请求

🤝 贡献指南

  1. Fork 项目
  2. 创建功能分支 (git checkout -b feature/AmazingFeature)
  3. 提交更改 (git commit -m 'Add some AmazingFeature')
  4. 推送到分支 (git push origin feature/AmazingFeature)
  5. 打开 Pull Request

📄 许可证

本项目采用 MIT 许可证 - 查看 LICENSE 文件了解详情

📞 支持与反馈

  • 🐛 Bug 报告: 请在 Issues 中提交
  • 💡 功能建议: 欢迎在 Issues 中讨论
  • 📧 技术支持: 通过 Issues 获取帮助

📝 更新日志

v1.0.0 (2023-12-01)

  • ✨ 初始版本发布
  • ✨ 支持基本的网页内容抓取
  • ✨ 提供 Web 测试界面
  • ✨ Docker 容器化支持
  • ✨ 微信公众号专用优化
  • ✨ 双重抓取策略
  • ✨ 完整的部署文档

⭐ 如果这个项目对您有帮助,请给个 Star!

About

No description, topics, or website provided.
Language
JavaScript48.3%
HTML46.9%
Dockerfile4.8%