专栏首页Python中文社区手工打造分布式爬虫

手工打造分布式爬虫

專 欄

七夜,Python中文社区专栏作者,信息安全研究人员,比较擅长网络安全、逆向工程、Python爬虫开发、Python Web开发。《Python爬虫开发与项目实战》作者。

这次分享的文章是我的新书《Python爬虫开发与项目实战》基础篇-第七章的内容,关于如何手工打造简单分布式爬虫 (如果大家对这本书感兴趣的话,可以看一下 试读样章:

http://pan.baidu.com/s/1hrWEOYg),下面是文章的具体内容。

本章讲的依旧是实战项目,实战内容是打造分布式爬虫,这对初学者来说,是一个不小的挑战,也是一次有意义的尝试。这次打造的分布式爬虫采用比较简单的主从模式,完全手工打造,不使用成熟框架,基本上涵盖了前六章的主要知识点,其中涉及分布式的知识点是分布式进程和进程间通信的内容,算是对Python爬虫基础篇的总结。

现在大型的爬虫系统都是采取分布式爬取结构,通过此次实战项目,让大家对分布式爬虫有一个比较清晰地了解,为之后系统的讲解分布式爬虫打下基础,其实它并没有多么困难。实战目标:爬取2000个百度百科网络爬虫词条以及相关词条的标题、摘要和链接等信息,采用分布式结构改写第六章的基础爬虫,使功能更加强大。爬取页面如下所示。

7.1简单分布式爬虫结构 本次分布式爬虫采用主从模式。主从模式是指由一台主机作为控制节点负责所有运行网络爬虫的主机进行管理,爬虫只需要从控制节点那里接收任务,并把新生成任务提交给控制节点就可以了,在这个过程中不必与其他爬虫通信,这种方式实现简单利于管理。而控制节点则需要与所有爬虫进行通信,因此可以看到主从模式是有缺陷的,控制节点会成为整个系统的瓶颈,容易导致整个分布式网络爬虫系统性能下降。 此次使用三台主机进行分布式爬取,一台主机作为控制节点,另外两台主机作为爬虫节点。爬虫结构如图7.1所示:

图7.1 主从爬虫结构

7.2控制节点ControlNode 控制节点主要分为URL管理器、数据存储器和控制调度器。控制调度器通过三个进程来协调URL管理器和数据存储器的工作,一个是URL管理进程,负责URL的管理和将URL传递给爬虫节点,一个是数据提取进程,负责读取爬虫节点返回的数据,将返回数据中的URL交给URL管理进程,将标题和摘要等数据交给数据存储进程,最后一个是数据存储进程,负责将数据提取进程中提交的数据进行本地存储。执行流程如图7.2所示:

图7.2 控制节点执行流程

7.2.1URL管理器 URL管理器查考第六章的代码,做了一些优化修改。由于我们采用set内存去重的方式,如果直接存储大量的URL链接,尤其是URL链接很长的时候,很容易造成内存溢出,所以我们采用将爬取过的URL进行MD5处理,由于字符串经过MD5处理后的信息摘要长度可以128bit,将生成的MD5摘要存储到set后,可以减少好几倍的内存消耗,Python中的MD5算法生成的是32位的字符串,由于我们爬取的url较少,md5冲突不大,完全可以取中间的16位字符串,即16位MD5加密。同时添加了save_progress和load_progress方法进行序列化的操作,将未爬取URL集合和已爬取的URL集合序列化到本地,保存当前的进度,以便下次恢复状态。URL管理器URLManager.py代码如下:

7.2.2数据存储器 数据存储器的内容基本上和第六章的一样,不过生成文件按照当前时间进行命名避免重复,同时对文件进行缓存写入。代码如下:

7.2.3控制调度器 控制调度器主要是产生并启动URL管理进程、数据提取进程和数据存储进程,同时维护4个队列保持进程间的通信,分别为url_queue,result_queue,conn_q,store_q。4个队列说明如下: url_q队列是URL管理进程将URL传递给爬虫节点的通道 result_q队列是爬虫节点将数据返回给数据提取进程的通道 conn_q队列是数据提取进程将新的URL数据提交给URL管理进程的通道 store_q队列是数据提取进程将获取到的数据交给数据存储进程的通道 因为要和工作节点进行通信,所以分布式进程必不可少。参考1.4.4小节分布式进程中服务进程中的代码(linux版),创建一个分布式管理器,定义为start_manager方法。方法代码如下:

数据提取进程从result_queue队列读取返回的数据,并将数据中的URL添加到conn_q队列交给URL管理进程,将数据中的文章标题和摘要添加到store_q队列交给数据存储进程。代码如下:

最后将分布式管理器、URL管理进程、数据提取进程和数据存储进程进行启动,并初始化4个队列。代码如下:

7.3爬虫节点SpiderNode 爬虫节点相对简单,主要包含HTML下载器、HTML解析器和爬虫调度器。执行流程如下: 爬虫调度器从控制节点中的url_q队列读取URL 爬虫调度器调用HTML下载器、HTML解析器获取网页中新的URL和标题摘要 最后爬虫调度器将新的URL和标题摘要传入result_q队列交给控制节点

7.3.1HTML下载器 HTML下载器的代码和第六章的一致,只要注意网页编码即可。代码如下:

7.3.2HTML解析器 HTML解析器的代码和第六章的一致,详细的网页分析过程可以回顾第六章。代码如下:

7.3.3爬虫调度器 爬虫调度器需要用到分布式进程中工作进程的代码,具体内容可以参考第一章的分布式进程章节。爬虫调度器需要先连接上控制节点,然后依次完成从url_q队列中获取URL,下载并解析网页,将获取的数据交给result_q队列,返回给控制节点等各项任务,代码如下:

在爬虫调度器设置了一个本地IP:127.0.0.1,大家可以将在一台机器上测试代码的正确性。当然也可以使用三台VPS服务器,两台运行爬虫节点程序,将IP改为控制节点主机的公网IP,一台运行控制节点程序,进行分布式爬取,这样更贴近真实的爬取环境。下面图7.3为最终爬取的数据,图7.4为new_urls.txt内容,图7.5为old_urls.txt内容,大家可以进行对比测试,这个简单的分布式爬虫还有很大发挥的空间,希望大家发挥自己的聪明才智进一步完善。

图7.4 new_urls.txt

图7.5 old_urls.txt

本文分享自微信公众号 - Python中文社区(python-china)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-06-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 我是如何零基础开始能写爬虫的

    利用这些数据,可以做很多领域的分析、市场调研,获得很多有价值的信息,可以应用在很多的工作场景,于是果断开始学习。

    Python中文社区
  • 反爬虫机制和破解方法汇总

    什么是爬虫和反爬虫? 爬虫:使用任何技术手段,批量获取网站信息的一种方式。 反爬虫:使用任何技术手段,阻止别人批量获取自己网站信息的一种方式。 ? 常见的反...

    Python中文社区
  • 不踩坑的Python爬虫:如何在一个月内学会爬取大规模数据

    Python爬虫为什么受欢迎 如果你仔细观察,就不难发现,懂爬虫、学习爬虫的人越来越多,一方面,互联网可以获取的数据越来越多,另一方面,像 Python这样的...

    Python中文社区
  • Python-数据挖掘-搜索引擎

    ② 取出待爬取的 URL,解析 DNS 得到主机的 IP,并将 URL 对应的网页下载下来,存储至已下载的网页库中,并将这些 URL 放进已爬取的 URL 队列...

    小团子
  • 一个神秘URL酿大祸,差点让我背锅!

    我叫小风,是Windows帝国一个普通的上班族。上一回说到因为一个跨域请求,我差点丢了饭碗,好在有惊无险,我的职场历险记还在继续。

    黄泽杰
  • Action中使用Json

    要在项目中引入对应的包:找到struts2.x 的lib包,向本项目lib包加入“json-lib-2.3-jdk15.jar,ezmorph-1.0.6.ja...

    HUC思梦
  • 嵌入式程序员也能开发微信小程序

    对于广大的嵌入式程序员来说,可能觉得小程序开发离自己可能很远,其实随着现在技术的进步,物联网的发展,我们需要掌握的东西越来越多,包括智能互联,从微信小程序还没有...

    用户1605515
  • COLING 2018 ⽤对抗增强的端到端模型⽣成合理且多样的故事结尾

    本⽂介绍哈尔滨⼯业⼤学社会计算与信息检索研究中⼼( SCIR)录⽤于COLING 2018的论⽂《 Generating Reasonable and Dive...

    zenRRan
  • 利用 Huginn 打造一站式信息阅读平台

    Huginn其实非常适合像我这样的RSS阅读重度“用户”。很多RSS阅读器因为赚不到钱逐渐被公司所抛弃——商人嘛,无利可图自然不可持久。同时,一些新闻资讯类的网...

    huginn 中文网
  • Bootstrap响应式前端框架笔记七——下拉菜单

        在Bootstrap的Css框架中,下拉菜单属于组件。一个完整的下拉菜单应该有两部分组成,一个触发按钮与一个选项列表。触发按钮dropdown-togg...

    珲少

扫码关注云+社区

领取腾讯云代金券