一个大规模爬虫的抓取实例
http://www.michaelnielsen.org/ddi/how-to-crawl-a-quarter-billion-webpages-in-40-hours/
一个大规模爬虫的抓取实例
本文是一篇大规模爬虫的文章的阅读笔记,记录了一个作者利用amazon集群在40个小时的时间里爬取2.5亿个网页的过程。
相关参数
page:2.5亿
cost:580 dollar
time:40 hours
machine:20 Amazon EC2
storage:总共抓取了1.69 TB
目的:
找到一个有用的网络子集,实践爬虫和分布式计算
技术实现:
分布式爬虫
节点:Amazon EC2
集群控制:Fabric
语言:Python
爬取方式:
1)每个集群141个爬虫线程,从Alexa白名单[1]得到初始域名
选择141个是根据实验效果达到饱和确定的
2) 任务分配:哈希分配机器、哈希分配线程;
3)
从alexa开始,对每个网页抓取;
舍弃抓取的external link,其他的加入url frontier;
在url frontier中取出url,继续抓取;
log记录
问题:
1.url去重:大规模爬虫遇到的常见问题,可以用Bloom Filter(布隆过滤器)的库pybloomfiltermmap和redis,但是可能造成错误判断而舍弃应该抓取的url;redis的作用是存储为url设置的键值,其键-值为(url-下一次应抓取时间),这是为了遵循为了抓取的道德准则,避免对网站造成压力
2. 1)可预见的bug和不可预见的bug,如不规范的html。一般舍弃。解析页面一般用python的lxml库。
2)去除外链会导致一些不规则的子域名不能被加入爬取的流程,group.barclays.com
barclays.com的子域名;解决方法是tldextract library;
3. 同时抽取多个域名加入列表会导致流量负担,姑且称作clump problem;
解决方法是用单机的url frontier来代替全局的url frontier
4. url的存储方式遇到去重的问题,每个线程会消耗大量空间;
5. 分配线程跟机器的hash要用两个独立的函数或者用一个
6. 截断:因为有些html页面太大,需要截断。可以用网络的页面平均大小来估计应该截断的合理值,最后确定是200kb。
其他
进行爬取用到的相关价格:价格:512 dollars,节点 EC2,500 gigabytes,
Spot-instance:竞价实例是亚马逊出卖自己闲置资源的一种方式,出价高的拥有实例,价格比较划算。它可能是同样计算能力的实例价格的1/10。这是一个让人惊讶的数字。它的实体在13年底就估计达到了300万台。但是竞价实例可以随时被亚马逊回收。
threaded architecture和evented architecture是有区别的。本文采用的是threaded architecture。即:多线程爬虫跟异步爬虫的区别。
注:
[1] Alexa是一个亚马逊的子公司,用来发布网站的世界排名。可以通过该网站找到前100万的网址。
[2] 该爬虫可能会给单一站点带来很大的流量负担,所以为了防止被一些人轻率地滥用,作者无限期推迟发布代码(也即不发布)。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通