最初下载小说的爬虫只有二十几行代码,虽然二十几行代码就可以完成这项工作,但是如果把爬虫的各个功能封装成不同的类,这样便于以后复用也便于阅读。
拓展之后,把刚开始下载小说的代码拓展成一个基础爬虫,但是这还不够,便就有了这篇关于分布式爬虫的文章,同样也是下载小说,不过这次分离地更明确。

这篇文章实现的是主从模式的分布式爬虫

主从模式的分布式爬虫主要分为两部分:

  • 控制节点
  • 爬虫节点

控制节点用来分发任务以及数据存储,爬虫节点用来接收任务并返回结果集合。
工作模式如图所示:

控制节点

对于传进来的一个初始URL,先把它加入URL管理器

url_manager = UrlManager()
url_manager.add_new_url(root_url)

再从URL管理器中取出一个URL把它加入到URL队列:

new_url = url_manager.get_new_url()
url_q.put(new_url)

从返回的结果队列取出想要的URL存入URL管理器

content = result_q.get(True)
if content['new_urls'] == 'end':print('小说已下载完毕,可以停止了')store_q.put('end')                conn_q.put(content['new_urls'])

从返回的结果队列取出想要的数据再存入文件

text = store_q.get()
chaptername = text['chaptername']
html_context = text['html_context']
if chaptername == 'end' and html_context == 'end':print('小说已下载完毕,可以停止了')return
output.store(chaptername, html_context, file_object)

这基本上就是控制节点所要做的事情了,不要想那么复杂。

几个问题

  • URL队列怎么获取的数据?
  • URL队列起了一个什么样的角色?

URL队列从URL管理器获取URL,URL管理器其实就是一个列表,每次Pop一个URL出来给URL队列。(完全可以通过URL管理器来进行爬取工作)
URL队列其实就充当了一个中转的角色,因为URL管理器是一个列表,我们没法把它暴露在网络上,只能通过URL队列来实现。

为什么通过URL队列来实现?

很简单,因为队列能暴露在网络上,因此从其它地方我们可以获取这个URL队列。

爬虫节点

首先要弄明白爬虫节点要干什么

  • 从URL队列获取URL
  • 通过URL获取HTML文档
  • 解析HTML文档获取新的URL以及想要的文本
  • 把URL以及文本传进结果队列

这就是爬虫节点所做的工作

如何获取URL队列

控制节点已经帮我们创造了URL队列,并把它暴露在了网络上,我们只需要根据响应的地址以及端口接入就可以获取URL队列了。URL队列只有一个,对于控制节点和爬虫节点来说它们共用一个URL队列,很明显结果队列也只有一个,控制节点和爬虫节点共用一个结果队列。

BaseManager.register('get_task_queue')
BaseManager.register('get_result_queue')
server_addr = '127.0.0.1'
self.m = BaseManager(address=(server_addr, 8010), authkey=b'xuezhong')
self.m.connect()
self.task = self.m.get_task_queue()
self.result = self.m.get_result_queue()

然后就是很正常的通过拿到URL来获取HTML文档

url = self.task.get()
html_text = self.download.download(url)

最后就是分析HTML文档,构造结果集,并传入结果队列:

new_urls, chaptername, html_context = self.parser.parser_context(url, html_text)
self.result.put({'new_urls': new_urls, 'text': {'chaptername': chaptername, 'html_context': html_context}})

这样一个主从模式的分布式爬虫就完成了,其实就是通过队列可以在网络上暴露的功能,把爬虫分离的更彻底一点。

基础爬虫的特点

  • HTML下载器,HTML解析器,数据下载器,URL管理器,各司其职,分工明确

主从模式的分布式爬虫特点

  • 控制节点就是用来分发任务和处理数据
  • 爬虫节点就是用来接受任务返回数据

从这来看,主从模式的分布式爬虫分离地更彻底一点。

如何运行?

先运行控制节点,等到有URL加入到URL队列时,启动爬虫节点即可

运行爬虫节点

对应地控制节点输出为

核心

URL队列和结果队列其实只有一个,因为在主从模式中我们只用到了一个控制节点+一个爬虫节点,千万不要想多,我刚开始就是因为想太多,而搞不清其原理。

分布式爬虫代码

参考文献:
[1]范传辉. Python爬虫开发与项目实战. 实战项目:简单分布式爬虫, 2017
[2]分布式进程

简单的分布式爬虫(下载小说)相关推荐

  1. Python 简单爬虫下载小说txt

    Python 简单爬虫下载小说txt #第一次写爬虫代码 欢迎交流指正 我们范例爬取的对象是笔趣阁的<圣墟> (最近非常火的连载小说) ##为什么选择笔趣阁# 主要是因为笔趣阁的源代码没有 ...

  2. python分布式爬虫框架_python之简单Scrapy分布式爬虫的实现

    分布式爬虫:爬虫共用同一个爬虫程序,即把同一个爬虫程序同时部署到多台电脑上运行,这样可以提高爬虫速度. 在默认情况下,scrapy爬虫是单机爬虫,只能在一台电脑上运行,因为爬虫调度器当中的队列queu ...

  3. python爬虫下载小说_python 爬取小说并下载的示例

    代码 import requests import time from tqdm import tqdm from bs4 import BeautifulSoup """ ...

  4. 利用python爬虫下载小说

    回想当初自学Python很大一部分原因是想要自己爬数据,今天终于学会了怎么下载小说.于是搞了一波<球状闪电>. 需要用到两个库:requests 和 BeautifulSoup,用 pip ...

  5. python爬虫下载小说_用PYTHON爬虫简单爬取网络小说

    用PYTHON爬虫简单爬取网络小说. 这里是17K小说网上,随便找了一本小说,名字是<千万大奖>. 里面主要是三个函数: 1.get_download_url() 用于获取该小说的所有章节 ...

  6. 纯手工打造简单分布式爬虫(Python)

    https://www.cnblogs.com/qiyeboy/p/7016540.html 本章讲的依旧是实战项目,实战内容是打造分布式爬虫,这对初学者来说,是一个不小的挑战,也是一次有意义的尝试. ...

  7. 【Python3爬虫】学习分布式爬虫第一步--Redis分布式爬虫初体验

    一.写在前面 之前写的爬虫都是单机爬虫,还没有尝试过分布式爬虫,这次就是一个分布式爬虫的初体验.所谓分布式爬虫,就是要用多台电脑同时爬取数据,相比于单机爬虫,分布式爬虫的爬取速度更快,也能更好地应对I ...

  8. Java 多线程爬虫及分布式爬虫架构探索

    维护待采集的 URL 多线程爬虫程序就不能像单线程那样,每个线程独自维护这自己的待采集 URL,如果这样的话,那么每个线程采集的网页将是一样的,你这就不是多线程采集啦,你这是将一个页面采集的多次.基于 ...

  9. python爬虫下载-python爬虫之下载文件的方式总结以及程序实例

    python爬虫之下载文件的方式以及下载实例 目录 第一种方法:urlretrieve方法下载 第二种方法:request download 第三种方法:视频文件.大型文件下载 实战演示 第一种方法: ...

最新文章

  1. 博客文章也能中顶会:ICLR 2022开设博客投稿通道,还有机会跟经典论文原作者直接battle...
  2. 深度研报:六大视角解读人工智能,AI岂止于技术
  3. python string类型_Python的基本数据类型——String
  4. Codeforces Round #437 (Div. 2, based on MemSQL Start[c]UP 3.0 - Round 2)
  5. ssas表格模型 权限控制_创建第一个SSAS表格模型数据库
  6. Ubuntu之解决需权限才能访问串口的方法
  7. 算法基础部分2-分治
  8. halcon三种模板匹配方法
  9. 一台电脑上安装5台tomcat 与 项目部署 probe
  10. unity, 判断可见性
  11. win7科学计算机不支持,新CPU不支持Win7怎么回事?新一代主板装不了Win7的解决办法...
  12. 代码随想录第二十天 LeetCode513、112、113、106、105
  13. OneZero第一次站立会议Sprint Planning Meeting(2016.3.21)
  14. div用css显示隐藏的效果
  15. ipad上的学习app设置及相应的材料
  16. 生物信息中的Python 01 | 从零开始处理基因序列
  17. word页眉自动出现一条直线,怎么去掉?
  18. Excel转PDF基于Microsoft.Office.Interop.Excel
  19. Android 6.0权限请求相关及权限分组
  20. 三子棋——可修改为多子棋

热门文章

  1. 爬虫模拟对“有道在线翻译”发送请求(请求中的数据含需分析js来解出变化数据)
  2. 应届生和往届生,报名条件区别汇总!
  3. 免编程让你零基础制作App
  4. 浅谈*迭代加深*深度优先搜索
  5. 不是因为有希望才坚持,而是因为坚持才有希望!
  6. Zilliqa 的设计构思 第3部分:使共识更有效
  7. MATLAB Mann-Kendall突变检验 (mk突变检验)
  8. Java 高并发项目笔记
  9. 分形、大自然的分形几何、数据可视化、Python绘图
  10. Dashgo D1使用手册