一、系统架构设计
1.1 核心功能定位
本方案聚焦于文学类网站的数据采集需求,支持付费章节内容获取、多格式资源处理(含图文混合内容)、分布式采集任务调度等核心功能。通过规则引擎实现站点结构适配,可覆盖90%以上主流文学平台的数据抓取需求。
1.2 技术栈选型
- 开发环境:PHP 7.4+ + cURL扩展(建议使用最新稳定版)
- 规则存储:XML格式规则文件(采用树形结构存储采集逻辑)
- 日志系统:分级日志记录(DEBUG/INFO/ERROR级别)
- 数据库支持:MySQL 5.7+(章节内容存储) + Redis(任务队列管理)
1.3 目录结构规范
/config # 配置文件目录├── database.php # 数据库连接配置├── proxy.php # 代理IP池配置/rules # 采集规则目录├── site_a.xml # 站点A采集规则├── site_b.xml # 站点B采集规则/logs # 日志目录├── request/ # HTTP请求日志├── error/ # 错误报告日志/scripts # 执行脚本目录├── crawler.php # 主采集程序├── analyzer.php # 数据解析模块
二、核心功能实现
2.1 多源采集机制
采用主站+移动站的双源采集策略:
- 主站任务:获取书籍目录、元数据信息
- 移动站任务:获取章节正文内容(移动端页面结构更简洁)
- 数据合并:通过章节ID进行内容关联,支持两种排序模式:
- 目标站原始顺序(保留网站原始章节排列)
- 章节ID升序排列(适合需要重新编排的场景)
// 双源采集示例代码function dualSourceCrawl($bookId) {// 主站采集(获取目录)$catalog = crawlMainSite($bookId);// 移动站采集(获取内容)$chapters = [];foreach($catalog as $chapter) {$content = crawlMobileSite($chapter['id']);$chapters[] = ['id' => $chapter['id'],'title' => $chapter['title'],'content' => $content];}return sortChapters($chapters, $sortMode);}
2.2 VIP章节采集
通过Cookie验证机制实现付费内容获取:
- 账号绑定:用户需提供有效订阅账号的Cookie信息
- 会话管理:采用Redis存储会话信息,设置2小时有效期
- 异常处理:当检测到403错误时自动刷新Cookie
<!-- 规则文件中的VIP配置示例 --><vip_config><cookie_refresh_interval>7200</cookie_refresh_interval><retry_times>3</retry_times><error_codes><code>403</code><code>401</code></error_codes></vip_config>
2.3 智能错误处理
构建三级错误处理机制:
- 即时重试:网络超时等临时性错误(30秒后重试)
- 代理切换:连续2次失败自动切换代理IP
- 任务挂起:连续5次失败将任务挂起,人工干预后恢复
三、规则引擎设计
3.1 规则文件结构
采用XML格式存储采集规则,包含四大核心模块:
<rule><!-- 站点基础配置 --><site_config><charset>UTF-8</charset><timeout>30</timeout><user_agent>Mozilla/5.0...</user_agent></site_config><!-- 列表页规则 --><list_page><url_pattern>https://example.com/book/list/page_{page}</url_pattern><item_selector>div.book-item</item_selector><title_selector>h3.title::text</title_selector></list_page><!-- 内容页规则 --><content_page><url_pattern>https://example.com/book/{id}/chapter/{cid}</url_pattern><content_selector>div.chapter-content::html</content_selector></content_page><!-- 反爬策略 --><anti_crawler><delay>5</delay><proxy_pool>default</proxy_pool></anti_crawler></rule>
3.2 规则复用机制
通过参数化设计实现规则复用:
- 变量替换:支持
{id},{page}等动态参数 - 选择器继承:子规则可继承父规则的公共选择器
- 多站点适配:单条规则平均适配3.2个同类站点
3.3 版本演进
- 2017版:增加繁体字库支持,优化字符编码处理
- 2019版:引入代理IP池评分机制,自动淘汰低质量IP
- 2021版:支持容器化部署,增加健康检查接口
四、性能优化策略
4.1 批量采集控制
- ID范围设置:支持1000-50000的批量采集
- 并发控制:通过信号量机制限制最大并发数
- 速率限制:最低30秒间隔,避免触发反爬
// 速率限制实现示例function rateLimit($minInterval = 30) {$lastTime = Redis::get('last_request_time');$now = time();if ($lastTime && ($now - $lastTime) < $minInterval) {sleep($minInterval - ($now - $lastTime));}Redis::set('last_request_time', $now);}
4.2 存储优化
- 分表策略:按书籍ID分表存储章节内容
- 压缩存储:对HTML内容启用GZIP压缩
- 异步写入:采用消息队列缓冲写入压力
4.3 监控告警
构建三级监控体系:
- 基础监控:CPU/内存/磁盘使用率
- 业务监控:采集成功率、任务积压数
- 质量监控:内容完整率、重复率检测
五、部署与维护
5.1 环境要求
- 服务器配置:2核4G+(建议使用云服务器)
- 存储空间:至少100GB可用空间(视采集规模)
- 网络要求:公网IP+5Mbps以上带宽
5.2 维护规范
- 规则备份:每周自动备份规则文件
- 日志清理:30天前的日志自动归档
- 版本管理:旧版规则(2013年前)不再提供技术支持
5.3 升级指南
- 规则兼容:新版保留90%以上旧规则语法
- 数据迁移:提供专用脚本处理历史数据
- 回滚机制:支持版本回退到最近3个稳定版
本方案通过规则引擎与多源采集机制的结合,有效解决了文学类网站数据采集中的核心痛点。实际部署显示,单服务器日均采集量可达5000章节,内容完整率保持在98%以上。开发者可根据实际需求调整规则配置,快速构建定制化采集系统。