| 摘要 | 第5-6页 |
| ABSTRACT | 第6页 |
| 第一章 绪论 | 第12-15页 |
| 1.1 选题背景和意义 | 第12-13页 |
| 1.2 国内外研究现状 | 第13页 |
| 1.3 本文的组织架构 | 第13-15页 |
| 第二章 爬虫相关技术研究 | 第15-24页 |
| 2.1 | 第15-19页 |
| 2.1.1 网络爬虫原理 | 第15-16页 |
| 2.1.2 网络请求 | 第16页 |
| 2.1.3 抓取目标的分类 | 第16-17页 |
| 2.1.3.1 网站 | 第16页 |
| 2.1.3.2 App | 第16-17页 |
| 2.1.4 爬虫遍历策略 | 第17-18页 |
| 2.1.4.1 广度优先遍历 | 第17页 |
| 2.1.4.2 深度优先遍历 | 第17页 |
| 2.1.4.3 优缺点分析 | 第17-18页 |
| 2.1.5 网络响应的解析 | 第18-19页 |
| 2.2 爬虫框架Scrapy的介绍 | 第19-20页 |
| 2.3 URL去重技术研究 | 第20-21页 |
| 2.3.1 基于Set去重 | 第20页 |
| 2.3.2 基于Trie树的去重 | 第20-21页 |
| 2.3.3 基于Bloom Filter的去重 | 第21页 |
| 2.4 网络爬虫技术存在的问题 | 第21-22页 |
| 2.4.1 爬虫的通用性 | 第21-22页 |
| 2.4.2 爬虫效率 | 第22页 |
| 2.4.3 登录问题 | 第22页 |
| 2.4.4 反爬虫问题 | 第22页 |
| 2.4.5 礼貌抓取 | 第22页 |
| 2.5 本章小结 | 第22-24页 |
| 第三章 工具化爬虫系统的设计 | 第24-52页 |
| 3.1 爬虫系统设计目标 | 第24-25页 |
| 3.2 系统整体架构设计 | 第25页 |
| 3.3 URL去重模块的设计 | 第25-29页 |
| 3.3.1 Trie树 | 第25-27页 |
| 3.3.2 Bloom Filter | 第27-29页 |
| 3.4 可配置的解析模块的设计 | 第29-34页 |
| 3.4.1 模板化解析概述 | 第29-30页 |
| 3.4.2 模版化解析原理 | 第30页 |
| 3.4.3 视频网站结构的共性分析 | 第30-31页 |
| 3.4.4 解析模板配置文件的设计 | 第31-34页 |
| 3.4.5 解析模版引擎的设计 | 第34页 |
| 3.5 模拟登录模块的设计 | 第34-38页 |
| 3.5.1 什么是Cookie | 第34-35页 |
| 3.5.2 模拟登录的流程 | 第35-37页 |
| 3.5.3 登录验证码的识别 | 第37页 |
| 3.5.4 一个登录流程的例子 | 第37-38页 |
| 3.6 绕过反爬虫模块设计 | 第38-42页 |
| 3.6.1 网站为什么要反爬虫 | 第38-39页 |
| 3.6.2 针对不同反爬策略设计绕过反爬 | 第39-42页 |
| 3.6.2.1 绕过HTTP header的反爬 | 第39页 |
| 3.6.2.2 绕过限制用户IP访问频率的反爬 | 第39-41页 |
| 3.6.2.2.1 使用代理IP池 | 第40页 |
| 3.6.2.2.2 使用ADSL重新拨号来获取新的IP | 第40-41页 |
| 3.6.2.3 绕过动态加载网站内容的反爬 | 第41-42页 |
| 3.7 监控和告警模块设计 | 第42-45页 |
| 3.7.1 各个爬虫状态监控 | 第42-43页 |
| 3.7.2 爬虫运行统计信息 | 第43页 |
| 3.7.3 抓取失败原因统计 | 第43页 |
| 3.7.4 服务状态监控 | 第43-44页 |
| 3.7.5 邮件告警设计 | 第44-45页 |
| 3.8 并发控制模块的设计 | 第45-50页 |
| 3.8.1 相关概念阐述 | 第45-46页 |
| 3.8.2 并发模块架构设计 | 第46-47页 |
| 3.8.3 线程池的设计 | 第47页 |
| 3.8.4 抓取线程I/O复用的设计 | 第47-50页 |
| 3.8.4.1 异步非阻塞 | 第48页 |
| 3.8.4.2 I/O复用 | 第48-49页 |
| 3.8.4.3 解析多线程并发的设计 | 第49-50页 |
| 3.9 URL消息队列的设计 | 第50-51页 |
| 3.9.1 URL队列的优先级设计 | 第50-51页 |
| 3.9.2 抓取失败重试的URL优先级设计 | 第51页 |
| 3.10 本章总结 | 第51-52页 |
| 第四章 工具化爬虫系统的实现 | 第52-66页 |
| 4.1 系统架构与流程 | 第52-53页 |
| 4.2 URL去重模块的实现 | 第53-57页 |
| 4.2.1 Trie树的传统实现 | 第53页 |
| 4.2.2 Trie树的双数组实现 | 第53-56页 |
| 4.2.3 Bloom Filter去重算法的实现 | 第56-57页 |
| 4.2.3.1 Bloom Filter参数的确定 | 第56页 |
| 4.2.3.2 实现Bloom Filter的各个接口 | 第56-57页 |
| 4.3 动态IP池的实现 | 第57-59页 |
| 4.4 解析线程池的实现 | 第59-62页 |
| 4.4.1 线程池实现的考虑因素 | 第59页 |
| 4.4.2 线程池的实现 | 第59-62页 |
| 4.5 异步非阻塞以及I/O复用的并发抓取实现 | 第62-65页 |
| 4.5.1 异步任务的原理 | 第62-63页 |
| 4.5.2 用Python实现异步非阻塞 | 第63-64页 |
| 4.5.3 I/O复用的实现 | 第64-65页 |
| 4.5.3.1 使用select函数实现I/O复用 | 第64-65页 |
| 4.5.3.2 使用epoll函数实现I/O复用 | 第65页 |
| 4.6 本章总结 | 第65-66页 |
| 第五章 系统测试与性能评估 | 第66-78页 |
| 5.1 测试环境搭建 | 第66页 |
| 5.2 重要模块的单元测试和性能评估 | 第66-69页 |
| 5.2.1 重要模块单元测试的意义 | 第66-67页 |
| 5.2.2 去重模块 | 第67-68页 |
| 5.2.3 并发控制模块 | 第68-69页 |
| 5.3 数据抓取准确性和完整性的验证 | 第69-72页 |
| 5.3.1 数据抓取准确性和完整性验证的意义 | 第69页 |
| 5.3.2 数据抓取的准确性实验 | 第69-72页 |
| 5.4 数据抓取的稳定性实验 | 第72-74页 |
| 5.5 面临抓取异常的数据抓取告警分析 | 第74-75页 |
| 5.6 数据抓取统计数据分析 | 第75-76页 |
| 5.6.1 爬虫程序宏观抓取时间分析 | 第75页 |
| 5.6.2 爬虫程序数据抓取总量分析 | 第75页 |
| 5.6.3 爬虫程序抓取数据分析 | 第75-76页 |
| 5.7 本章总结 | 第76-78页 |
| 第六章 总结与展望 | 第78-79页 |
| 6.1 本文总结 | 第78页 |
| 6.2 未来优化方向的展望 | 第78-79页 |
| 参考文献 | 第79-81页 |
| 致谢 | 第81-82页 |
| 攻读学位期间取得的研究成果 | 第82页 |
| 个人简历 | 第82页 |
| 攻读硕士期间研究成果 | 第82页 |
| 攻读硕士期间参与项目 | 第82页 |