简单的分布式爬虫(下载小说)
最初下载小说的爬虫只有二十几行代码,虽然二十几行代码就可以完成这项工作,但是如果把爬虫的各个功能封装成不同的类,这样便于以后复用也便于阅读。
拓展之后,把刚开始下载小说的代码拓展成一个基础爬虫,但是这还不够,便就有了这篇关于分布式爬虫的文章,同样也是下载小说,不过这次分离地更明确。
这篇文章实现的是主从模式的分布式爬虫
主从模式的分布式爬虫主要分为两部分:
- 控制节点
- 爬虫节点
控制节点用来分发任务以及数据存储,爬虫节点用来接收任务并返回结果集合。
工作模式如图所示:
控制节点
对于传进来的一个初始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]分布式进程
简单的分布式爬虫(下载小说)相关推荐
- Python 简单爬虫下载小说txt
Python 简单爬虫下载小说txt #第一次写爬虫代码 欢迎交流指正 我们范例爬取的对象是笔趣阁的<圣墟> (最近非常火的连载小说) ##为什么选择笔趣阁# 主要是因为笔趣阁的源代码没有 ...
- python分布式爬虫框架_python之简单Scrapy分布式爬虫的实现
分布式爬虫:爬虫共用同一个爬虫程序,即把同一个爬虫程序同时部署到多台电脑上运行,这样可以提高爬虫速度. 在默认情况下,scrapy爬虫是单机爬虫,只能在一台电脑上运行,因为爬虫调度器当中的队列queu ...
- python爬虫下载小说_python 爬取小说并下载的示例
代码 import requests import time from tqdm import tqdm from bs4 import BeautifulSoup """ ...
- 利用python爬虫下载小说
回想当初自学Python很大一部分原因是想要自己爬数据,今天终于学会了怎么下载小说.于是搞了一波<球状闪电>. 需要用到两个库:requests 和 BeautifulSoup,用 pip ...
- python爬虫下载小说_用PYTHON爬虫简单爬取网络小说
用PYTHON爬虫简单爬取网络小说. 这里是17K小说网上,随便找了一本小说,名字是<千万大奖>. 里面主要是三个函数: 1.get_download_url() 用于获取该小说的所有章节 ...
- 纯手工打造简单分布式爬虫(Python)
https://www.cnblogs.com/qiyeboy/p/7016540.html 本章讲的依旧是实战项目,实战内容是打造分布式爬虫,这对初学者来说,是一个不小的挑战,也是一次有意义的尝试. ...
- 【Python3爬虫】学习分布式爬虫第一步--Redis分布式爬虫初体验
一.写在前面 之前写的爬虫都是单机爬虫,还没有尝试过分布式爬虫,这次就是一个分布式爬虫的初体验.所谓分布式爬虫,就是要用多台电脑同时爬取数据,相比于单机爬虫,分布式爬虫的爬取速度更快,也能更好地应对I ...
- Java 多线程爬虫及分布式爬虫架构探索
维护待采集的 URL 多线程爬虫程序就不能像单线程那样,每个线程独自维护这自己的待采集 URL,如果这样的话,那么每个线程采集的网页将是一样的,你这就不是多线程采集啦,你这是将一个页面采集的多次.基于 ...
- python爬虫下载-python爬虫之下载文件的方式总结以及程序实例
python爬虫之下载文件的方式以及下载实例 目录 第一种方法:urlretrieve方法下载 第二种方法:request download 第三种方法:视频文件.大型文件下载 实战演示 第一种方法: ...
最新文章
- 博客文章也能中顶会:ICLR 2022开设博客投稿通道,还有机会跟经典论文原作者直接battle...
- 深度研报:六大视角解读人工智能,AI岂止于技术
- python string类型_Python的基本数据类型——String
- Codeforces Round #437 (Div. 2, based on MemSQL Start[c]UP 3.0 - Round 2)
- ssas表格模型 权限控制_创建第一个SSAS表格模型数据库
- Ubuntu之解决需权限才能访问串口的方法
- 算法基础部分2-分治
- halcon三种模板匹配方法
- 一台电脑上安装5台tomcat 与 项目部署 probe
- unity, 判断可见性
- win7科学计算机不支持,新CPU不支持Win7怎么回事?新一代主板装不了Win7的解决办法...
- 代码随想录第二十天 LeetCode513、112、113、106、105
- OneZero第一次站立会议Sprint Planning Meeting(2016.3.21)
- div用css显示隐藏的效果
- ipad上的学习app设置及相应的材料
- 生物信息中的Python 01 | 从零开始处理基因序列
- word页眉自动出现一条直线,怎么去掉?
- Excel转PDF基于Microsoft.Office.Interop.Excel
- Android 6.0权限请求相关及权限分组
- 三子棋——可修改为多子棋