编者按:作者通过创建和扩展自己的分布式爬虫,介绍了一系列工具和架构, 包括分布式体系结构、扩展、爬虫礼仪、安全、调试工具、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大数据
完整内容请点击“阅读原文”