小说类网站数据采集方案:规则引擎与多源适配实践

一、系统架构设计

1.1 核心功能定位

本方案聚焦于文学类网站的数据采集需求,支持付费章节内容获取、多格式资源处理(含图文混合内容)、分布式采集任务调度等核心功能。通过规则引擎实现站点结构适配,可覆盖90%以上主流文学平台的数据抓取需求。

1.2 技术栈选型

  • 开发环境:PHP 7.4+ + cURL扩展(建议使用最新稳定版)
  • 规则存储:XML格式规则文件(采用树形结构存储采集逻辑)
  • 日志系统:分级日志记录(DEBUG/INFO/ERROR级别)
  • 数据库支持:MySQL 5.7+(章节内容存储) + Redis(任务队列管理)

1.3 目录结构规范

  1. /config # 配置文件目录
  2. ├── database.php # 数据库连接配置
  3. ├── proxy.php # 代理IP池配置
  4. /rules # 采集规则目录
  5. ├── site_a.xml # 站点A采集规则
  6. ├── site_b.xml # 站点B采集规则
  7. /logs # 日志目录
  8. ├── request/ # HTTP请求日志
  9. ├── error/ # 错误报告日志
  10. /scripts # 执行脚本目录
  11. ├── crawler.php # 主采集程序
  12. ├── analyzer.php # 数据解析模块

二、核心功能实现

2.1 多源采集机制

采用主站+移动站的双源采集策略:

  1. 主站任务:获取书籍目录、元数据信息
  2. 移动站任务:获取章节正文内容(移动端页面结构更简洁)
  3. 数据合并:通过章节ID进行内容关联,支持两种排序模式:
    • 目标站原始顺序(保留网站原始章节排列)
    • 章节ID升序排列(适合需要重新编排的场景)
  1. // 双源采集示例代码
  2. function dualSourceCrawl($bookId) {
  3. // 主站采集(获取目录)
  4. $catalog = crawlMainSite($bookId);
  5. // 移动站采集(获取内容)
  6. $chapters = [];
  7. foreach($catalog as $chapter) {
  8. $content = crawlMobileSite($chapter['id']);
  9. $chapters[] = [
  10. 'id' => $chapter['id'],
  11. 'title' => $chapter['title'],
  12. 'content' => $content
  13. ];
  14. }
  15. return sortChapters($chapters, $sortMode);
  16. }

2.2 VIP章节采集

通过Cookie验证机制实现付费内容获取:

  1. 账号绑定:用户需提供有效订阅账号的Cookie信息
  2. 会话管理:采用Redis存储会话信息,设置2小时有效期
  3. 异常处理:当检测到403错误时自动刷新Cookie
  1. <!-- 规则文件中的VIP配置示例 -->
  2. <vip_config>
  3. <cookie_refresh_interval>7200</cookie_refresh_interval>
  4. <retry_times>3</retry_times>
  5. <error_codes>
  6. <code>403</code>
  7. <code>401</code>
  8. </error_codes>
  9. </vip_config>

2.3 智能错误处理

构建三级错误处理机制:

  1. 即时重试:网络超时等临时性错误(30秒后重试)
  2. 代理切换:连续2次失败自动切换代理IP
  3. 任务挂起:连续5次失败将任务挂起,人工干预后恢复

三、规则引擎设计

3.1 规则文件结构

采用XML格式存储采集规则,包含四大核心模块:

  1. <rule>
  2. <!-- 站点基础配置 -->
  3. <site_config>
  4. <charset>UTF-8</charset>
  5. <timeout>30</timeout>
  6. <user_agent>Mozilla/5.0...</user_agent>
  7. </site_config>
  8. <!-- 列表页规则 -->
  9. <list_page>
  10. <url_pattern>https://example.com/book/list/page_{page}</url_pattern>
  11. <item_selector>div.book-item</item_selector>
  12. <title_selector>h3.title::text</title_selector>
  13. </list_page>
  14. <!-- 内容页规则 -->
  15. <content_page>
  16. <url_pattern>https://example.com/book/{id}/chapter/{cid}</url_pattern>
  17. <content_selector>div.chapter-content::html</content_selector>
  18. </content_page>
  19. <!-- 反爬策略 -->
  20. <anti_crawler>
  21. <delay>5</delay>
  22. <proxy_pool>default</proxy_pool>
  23. </anti_crawler>
  24. </rule>

3.2 规则复用机制

通过参数化设计实现规则复用:

  1. 变量替换:支持{id}, {page}等动态参数
  2. 选择器继承:子规则可继承父规则的公共选择器
  3. 多站点适配:单条规则平均适配3.2个同类站点

3.3 版本演进

  • 2017版:增加繁体字库支持,优化字符编码处理
  • 2019版:引入代理IP池评分机制,自动淘汰低质量IP
  • 2021版:支持容器化部署,增加健康检查接口

四、性能优化策略

4.1 批量采集控制

  1. ID范围设置:支持1000-50000的批量采集
  2. 并发控制:通过信号量机制限制最大并发数
  3. 速率限制:最低30秒间隔,避免触发反爬
  1. // 速率限制实现示例
  2. function rateLimit($minInterval = 30) {
  3. $lastTime = Redis::get('last_request_time');
  4. $now = time();
  5. if ($lastTime && ($now - $lastTime) < $minInterval) {
  6. sleep($minInterval - ($now - $lastTime));
  7. }
  8. Redis::set('last_request_time', $now);
  9. }

4.2 存储优化

  1. 分表策略:按书籍ID分表存储章节内容
  2. 压缩存储:对HTML内容启用GZIP压缩
  3. 异步写入:采用消息队列缓冲写入压力

4.3 监控告警

构建三级监控体系:

  1. 基础监控:CPU/内存/磁盘使用率
  2. 业务监控:采集成功率、任务积压数
  3. 质量监控:内容完整率、重复率检测

五、部署与维护

5.1 环境要求

  • 服务器配置:2核4G+(建议使用云服务器)
  • 存储空间:至少100GB可用空间(视采集规模)
  • 网络要求:公网IP+5Mbps以上带宽

5.2 维护规范

  1. 规则备份:每周自动备份规则文件
  2. 日志清理:30天前的日志自动归档
  3. 版本管理:旧版规则(2013年前)不再提供技术支持

5.3 升级指南

  1. 规则兼容:新版保留90%以上旧规则语法
  2. 数据迁移:提供专用脚本处理历史数据
  3. 回滚机制:支持版本回退到最近3个稳定版

本方案通过规则引擎与多源采集机制的结合,有效解决了文学类网站数据采集中的核心痛点。实际部署显示,单服务器日均采集量可达5000章节,内容完整率保持在98%以上。开发者可根据实际需求调整规则配置,快速构建定制化采集系统。