文章摘要
文章介绍了2025年实现24小时内爬取10亿网页的技术方案,总花费462美元,分享了爬取过程中的瓶颈问题、实践经验与理论差异。
文章总结
标题:2025年:如何在24小时内爬取10亿网页
核心内容概述
项目背景
作者发现近年来缺乏关于大规模网络爬虫的实践分享(最近可参考的是2012年Michael Nielsen的文章),决定在2025年的技术环境下重新探索这一课题。硬件方面,CPU核心数、NVMe固态硬盘带宽和网络吞吐量大幅提升,但网页动态化程度和内容体积也显著增加。最终,作者以462美元成本在25.5小时内完成了10.05亿网页的爬取。
核心约束条件
1. 时间限制:24小时目标(实际耗时25.5小时)
2. 预算控制:参考2012年580美元的标准,最终花费462美元
3. 仅爬取HTML:不执行JavaScript以保持历史对比性,但验证了纯HTML爬取仍覆盖大量内容
4. 礼貌性原则:严格遵守robots.txt、设置含联系方式的User-Agent、维护排除域名列表、限制同一域名访问间隔(70秒)
5. 容错设计:支持中断恢复,允许少量数据丢失(因本质是抽样爬取)
系统架构设计
采用12节点集群,每个节点包含:
- Redis实例:管理爬取状态(域名队列、URL边界、已访问记录、布隆过滤器等)
- 异步抓取进程池:单核支持6000-7000并发,CPU成为瓶颈(SSL握手消耗25%算力)
- 解析进程池:使用selectolax替代lxml,解析速度提升至160页/秒/进程
- 存储方案:放弃S3(成本过高),选用AWS i7i.4xlarge实例本地存储(16vCPU/128GB内存/3.75TB存储)
关键发现
1. 解析成为瓶颈:现代网页体积激增(中位数138KB vs 2012年的51KB),通过切换解析库和截断内容优化
2. 网络环境变化:DNS不再受限(因仅爬取Top100万域名),但SSL普及导致CPU成为抓取瓶颈
3. 内存管理教训:热门域名(如Yahoo、维基百科)的URL边界曾导致节点崩溃,需手动干预
与理论设计的对比
相比教科书方案(如Evan King提出的5天爬取100亿页),作者实测表明:
- 6.75台同等规格机器可达成类似目标
- 网络利用率约32%(理论预估30%),验证了可行性但需进一步优化
未来方向
1. 动态渲染爬取的成本评估(当前未处理JS)
2. 分析已爬取页面的元数据特征(存活率、内容类型分布等)
3. 应对反爬机制(如Cloudflare新推出的按次付费爬取服务)
技术细节精要
- 硬件选型:12台
i7i.4xlarge集群,总成本较S3方案节省90% - 性能优化:异步I/O实现高并发,布隆过滤器加速去重
- 数据截断:保留250KB内容(覆盖85%以上页面完整内容)
- 错误处理:日志轮换疏漏和内存溢出问题导致运行时干预
行业启示
- 成本效益:现代硬件使亿级爬取进入百美元时代
- 技术债:SSL普及和网页膨胀带来新的性能挑战
- 伦理边界:礼貌爬取实践与AI时代数据获取的冲突显现
(注:原文中的Reddit讨论链接、图片引用及部分技术参数已精简,保留核心论证逻辑。)
评论总结
总结评论内容:
- 关于技术选择:
- 有评论认为AWS并非必要,小型主机服务更经济(评论1:"small hosting companies with specialized servers...under 100$")
- 对存储性能的质疑,指出SSD与RAM仍有差距(评论5:"Optane is an order of magnitude slower than RAM")
- 反爬虫挑战:
- IP封锁是主要障碍(评论3:"websites simply block...not google")
- 需要复杂应对措施(评论6:"residential proxies, captcha solvers...stealth chrome binaries")
- 性能优化:
- Redis性能被低估(评论7:"redis taps out below tens of thousands of ops")
- 极致优化案例(评论8:"35k req/sec on a single node with Rust")
- 行业观察:
- 网络规模认知(评论2:"how small Google makes the Internet")
- 商业价值判断(评论4:"path to becoming a (m)(b)illionaire")
- 特殊问题:
- 大页面处理引发惊讶(评论9:"WTF did I just read?")
- 规模扩展的调度难题(评论10:"per-domain politeness queuing...genuine headache")