python爬虫分布式怎么构造_如何构建一个分布式爬虫:基础篇
继上篇(如何构建一个分布式爬虫:理论篇)我们谈论了Celery的基本知识后,本篇继续讲解如何一步步使用Celery构建分布式爬虫。这次我们抓取的对象定为celery官方文档(Celery - Distributed Task Queue)。
首先,我们新建目录distributedspider,然后再在其中新建文件workers.py,里面内容如下
from celery import Celery
app = Celery('crawl_task', include=['tasks'], broker='redis://223.129.0.190:6379/1', backend='redis://223.129.0.190:6379/2')
# 官方推荐使用json作为消息序列化方式
app.conf.update(
CELERY_TIMEZONE='Asia/Shanghai',
CELERY_ENABLE_UTC=True,
CELERY_ACCEPT_CONTENT=['json'],
CELERY_TASK_SERIALIZER='json',
CELERY_RESULT_SERIALIZER='json',
)
上述代码主要是做Celery实例的初始化工作,`include`是在初始化celery app的时候需要引入的内容,主要就是注册为网络调用的函数所在的文件。然后我们再编写任务函数,新建文件tasks.py,内容如下
import requests
from bs4 import BeautifulSoup
from workers import app
@app.task
def crawl(url):
print('正在抓取链接{}'.format(url))
resp_text = requests.get(url).text
soup = BeautifulSoup(resp_text, 'html.parser')
return soup.find('h1').text
它的作用很简单,就是抓取指定的url,并且把标签为`h1`的元素提取出来
最后,我们新建文件task_dispatcher.py,内容如下
from workers import app
url_list = [
'Introduction to Celery',
'Brokers - Celery 4.0.2 documentation',
'First Steps with Celery',
'Next Steps - Celery 4.0.2 documentation',
'Resources - Celery 4.0.2 documentation',
'Application - Celery 4.0.2 documentation',
'Tasks - Celery 4.0.2 documentation',
'Canvas: Designing Work-flows',
'Workers Guide - Celery 4.0.2 documentation',
'Daemonization - Celery 4.0.2 documentation',
'Periodic Tasks - Celery 4.0.2 documentation'
]
def manage_crawl_task(urls):
for url in urls:
app.send_task('tasks.crawl', args=(url,))
if __name__ == '__main__':
manage_crawl_task(url_list)
这段代码的作用主要就是给worker发送任务,任务是`tasks.crawl`,参数是`url`(元祖的形式)
现在,让我们在节点A(hostname为resolvewang的主机)上启动workercelery -A workers worker -c 2 -l info
这里 -c指定了线程数为2, -l表示日志等级是info。我们把代码拷贝到节点B(节点名为wpm的主机),同样以相同命令启动worker,便可以看到以下输出
可以看到左边节点(A)先是`all alone`,表示只有一个节点;后来再节点B启动后,它便和B同步了sync with celery@wpm
这个时候,我们运行给这两个worker节点发送抓取任务python task_dispatcher.py
可以看到如下输出
可以看到两个节点都在执行抓取任务,并且它们的任务不会重复。我们再在redis里看看结果
可以看到一共有11条结果,说明 `tasks.crawl`中返回的数据都在db2(backend)中了,并且以json的形式存储了起来,除了返回的结果,还有执行是否成功等信息。
到此,我们就实现了一个很基础的分布式网络爬虫,但是它还不具有很好的扩展性,而且貌似太简单了...下一篇我将以微博数据采集为例来演示如何构建一个稳健的分布式网络爬虫。
---
对微博大规模数据采集感兴趣的同学可以关注一下分布式微博爬虫(ResolveWang/WeiboSpider),用用也是极好的
python爬虫分布式怎么构造_如何构建一个分布式爬虫:基础篇相关推荐
- python爬虫分布式怎么构造_如何构建一个分布式爬虫:实战篇
本篇文章将是『如何构建一个分布式爬虫』系列文章的最后一篇,拟**从实战角度**来介绍如何构建一个*稳健的分布式微博爬虫*.这里我*没敢谈高效*,抓过微博数据的同学应该都知道微博的反爬虫能力,也知道微博 ...
- python分布式爬虫系统_如何构建一个分布式爬虫:理论篇
前言 本系列文章计划分三个章节进行讲述,分别是理论篇.基础篇和实战篇.理论篇主要为构建分布式爬虫而储备的理论知识,基础篇会基于理论篇的知识写一个简易的分布式爬虫,实战篇则会以微博为例,教大家做一个比较 ...
- 如何构建一个分布式爬虫:实战篇
本篇文章将是『如何构建一个分布式爬虫』系列文章的最后一篇,拟**从实战角度**来介绍如何构建一个*稳健的分布式微博爬虫*.这里我*没敢谈高效*,抓过微博数据的同学应该都知道微博的反爬虫能力,也知道微博 ...
- 如何构建一个分布式爬虫:理论篇
## 前言 本系列文章计划分三个章节进行讲述,分别是理论篇.基础篇和实战篇.理论篇主要为构建分布式爬虫而储备的理论知识,基础篇会基于理论篇的知识写一个简易的分布式爬虫,实战篇则会以微博为例,教大家做一 ...
- 如何构建一个分布式爬虫:基础篇
继上篇(如何构建一个分布式爬虫:理论篇)我们谈论了Celery的基本知识后,本篇继续讲解如何一步步使用Celery构建分布式爬虫.这次我们抓取的对象定为celery官方文档(Celery - Dist ...
- 使用Scrapy构建一个网络爬虫
记得n年前项目需要一个灵活的爬虫工具,就组织了一个小团队用Java实现了一个爬虫框架,可以根据目标网站的结构.地址和需要的内容,做简单的配置开发,即可实现特定网站的爬虫功能.因为要考虑到各种特殊情形, ...
- 构建一个分布式操作系统的简单方案—答陈硕的“分布式系统中的进程标识”一文...
对分布式系统中的进程标识"一文的疑问 刚才看到陈硕先生的一篇blog:"分布式系统中的进程标识",地址:http://www.cnblogs.com/Solstice/a ...
- 八十九、Python的GUI系列 | 使用PyQt5 快速构建一个GUI 应用
@Author:Runsen @Date:2020/7/11 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏 ...
- python爬虫工资高吗_月薪2万的爬虫工程师,Python需要学到什么程度?
Python 爬虫学到什么样就可以找工作了? 非计算机专业,正在自学python,很多教程里提到的网站的爬虫都会写了.比如拉勾网,豆瓣,实习僧,京东,淘宝,某妹子图等等--但是因为不是计算机专业的,也 ...
最新文章
- Bert代码详解(一)重点详细
- 如何导入nod32企业版的授权文件.lic,并制作镜像服务器?
- 白书P61 - 点集配对问题
- 成功解决pywintypes.com_error: (-2147352567, '发生意外。', (0, 'Kingsoft WPS', '文档保存失败。', '', 3011, -214746725
- 马斯克再发声,称人工智能是人类文明面临的最大风险
- 随想录(cmake编译)
- 风控上模型中的大小卡、主路旁路的应用
- matlab练习程序(径向模糊1)
- 51-高级路由:BGP community属性:local-as
- wamp3.1.0下载地址
- mysql索引平衡树hash_MySQL B+树索引和哈希索引的区别
- 蒙特卡洛方法(Monte-Carlo Simulation)
- Ubuntu(21.04)下UHD(4.1)与Gnuradio安装配置--USRP X410软件无线电平台开发
- 那些会阻碍程序员成长的细节
- pkcs8 和 pkcs1 之间 互相 转换
- PDF文件如何删除页面
- 为你推荐10款开发常用的代码编辑器
- 公网远程访问内网群晖NAS 7.X版 【内网穿透】
- linux下载安装tree命令
- 自我鉴定范文 php,毕业生优秀自我鉴定