专栏名称: 机器学习研究会
机器学习研究会是北京大学大数据与机器学习创新中心旗下的学生组织,旨在构建一个机器学习从事者交流的平台。除了及时分享领域资讯外,协会还会举办各种业界巨头/学术神牛讲座、学术大牛沙龙分享会、real data 创新竞赛等活动。
目录
相关文章推荐
机器之心  ·  OpenAI很会营销,而号称超强AI营销的灵 ... ·  昨天  
宝玉xp  ·  转发微博-20241212155621 ·  2 天前  
新智元  ·  2024 ACL ... ·  2 天前  
新智元  ·  NeurIPS ... ·  3 天前  
51好读  ›  专栏  ›  机器学习研究会

创建一个分布式网络爬虫的故事

机器学习研究会  · 公众号  · AI  · 2017-10-09 22:28

正文

编者按:作者通过创建和扩展自己的分布式爬虫,介绍了一系列工具和架构, 包括分布式体系结构、扩展、爬虫礼仪、安全、调试工具、Python 中的多任务处理等。以下为译文:


大概600万条记录,每个记录有15个左右的字段。


这是我的数据分析项目要处理的数据集,但它的记录有一个很大的问题:许多字段缺失,很多字段要么格式不一致或者过时了。换句话说,我的数据集非常脏。


但对于我这个业余数据科学家来说还是有点希望的-至少对于缺失和过时的字段来说。大多数记录包含至少一个到外部网站的超链接,在那里我可能找到我需要的信息。因此,这看起来像一个完美的网络爬虫的用例。


在这篇文章中,你将了解我是如何构建和扩展分布式网络爬虫的,特别是我如何处理随之而来的技术挑战。


初始需求


创建网络爬虫的想法令人兴奋。因为,你知道,爬虫很酷,对吧?


但我很快意识到,我的要求比我想象的要复杂得多:


  • 给定指定 URL,爬虫程序需要自动发现特定记录中缺失字段的值。因此,如果一个网页不包含我正在寻找的信息,爬虫程序需要跟踪出站链接,直到找到该信息。

  • 它需要是某种爬虫和抓取的混合功能,因为它必须同时跟踪出站链接并从网页中提取特定信息。

  • 整个程序需要分布式处理,因为有可能有数亿个URL需要访问。

  • 抓取的数据需要存储在某处,很可能是在数据库中。

  • 爬虫程序需要7*24小时不间断工作,所以不能在我的笔记本电脑上运行它。

  • 我不希望在云服务上花费太多 1。

  • 需要用Python编码,这是我选择的语言。


好吧,我曾经在以前的工作中写过很多爬虫,但从没有这么大的规模。所以对我来说这是个全新的领域。


初始设计


我最开始的设计是这样的: 



主要组件包括:


  • 一个爬虫调度器,负责把URL分派给 m 个爬虫主控制器,并从它们收集结果(字段)。

  • m个爬虫主控制器,负责管理 n 个子进程。这些子过程执行实际的爬取操作。为方便起见,我把他们称为爬虫。

  • 一个数据库服务器,负责存储初始URL和提取的字段。


这样我最终会有 m*n个爬虫,从而将负载分布在许多节点上。例如,4个主控制器,每个包含8个子进程的话,就相当于32个爬虫。


另外,所有进程间通信都将使用队列。 所以在理论上,它将很容易扩展。 我可以添加更多的主控制器,爬网率 - 一个性能指标- 会相应增加。


初始实现


现在我有一个看起来不错的设计,我需要选择使用哪些技术。


但别误会我的意思:我的目标不是提出一个完美的技术栈。 相反,我主要把它看作是一个学习的机会,也是一个挑战 - 所以如果需要,我更愿意提出自制的解决方案。


1. 云托管


我可以选择AWS,但是我对DigitalOcean更熟悉,恰好它是更便宜的。 所以我用了几个5美元每月的虚拟机(很省钱啦)。


2. HTTP 库


requests库是Python里处理HTTP请求的不二选择。


转自:CSDN大数据


完整内容请点击“阅读原文”