继上篇(如何构建一个分布式爬虫:理论篇)我们谈论了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).textsoup = 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的主机)上启动worker

celery -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的形式存储了起来,除了返回的结果,还有执行是否成功等信息。

到此,我们就实现了一个很基础的分布式网络爬虫,但是它还不具有很好的扩展性,而且貌似太简单了...下一篇我将以微博数据采集为例来演示如何构建一个稳健的分布式网络爬虫。

https://zhuanlan.zhihu.com/p/27148037

https://zhuanlan.zhihu.com/p/27148037

如何构建一个分布式爬虫:基础篇相关推荐

  1. python爬虫分布式怎么构造_如何构建一个分布式爬虫:基础篇

    继上篇(如何构建一个分布式爬虫:理论篇)我们谈论了Celery的基本知识后,本篇继续讲解如何一步步使用Celery构建分布式爬虫.这次我们抓取的对象定为celery官方文档(Celery - Dist ...

  2. 如何构建一个分布式爬虫:实战篇

    本篇文章将是『如何构建一个分布式爬虫』系列文章的最后一篇,拟**从实战角度**来介绍如何构建一个*稳健的分布式微博爬虫*.这里我*没敢谈高效*,抓过微博数据的同学应该都知道微博的反爬虫能力,也知道微博 ...

  3. 如何构建一个分布式爬虫:理论篇

    ## 前言 本系列文章计划分三个章节进行讲述,分别是理论篇.基础篇和实战篇.理论篇主要为构建分布式爬虫而储备的理论知识,基础篇会基于理论篇的知识写一个简易的分布式爬虫,实战篇则会以微博为例,教大家做一 ...

  4. python分布式爬虫系统_如何构建一个分布式爬虫:理论篇

    前言 本系列文章计划分三个章节进行讲述,分别是理论篇.基础篇和实战篇.理论篇主要为构建分布式爬虫而储备的理论知识,基础篇会基于理论篇的知识写一个简易的分布式爬虫,实战篇则会以微博为例,教大家做一个比较 ...

  5. python爬虫分布式怎么构造_如何构建一个分布式爬虫:实战篇

    本篇文章将是『如何构建一个分布式爬虫』系列文章的最后一篇,拟**从实战角度**来介绍如何构建一个*稳健的分布式微博爬虫*.这里我*没敢谈高效*,抓过微博数据的同学应该都知道微博的反爬虫能力,也知道微博 ...

  6. 构建一个分布式操作系统的简单方案—答陈硕的“分布式系统中的进程标识”一文...

    对分布式系统中的进程标识"一文的疑问 刚才看到陈硕先生的一篇blog:"分布式系统中的进程标识",地址:http://www.cnblogs.com/Solstice/a ...

  7. 使用Scrapy构建一个网络爬虫

    记得n年前项目需要一个灵活的爬虫工具,就组织了一个小团队用Java实现了一个爬虫框架,可以根据目标网站的结构.地址和需要的内容,做简单的配置开发,即可实现特定网站的爬虫功能.因为要考虑到各种特殊情形, ...

  8. 爬虫基础篇之Scrapy抓取京东

    虚拟环境 同一台服务器上不同的项目可能依赖的包不同版本,新版本默认覆盖旧版本,可能导致其他项目无法运行,通过虚拟环境,完全隔离各个项目各个版本的依赖包,实现运行环境互不影响. virtualenv p ...

  9. DasBlog: 构建一个分布式.NET 协作系统

    本文详细说明了weblogs 作为一种知识共享方式的优点,同时通过使用Microsoft .NET 技术描述了设计和实现一个已构建好的weblog的一些经验教训. 本页内容 第一部分:Weblog 现 ...

最新文章

  1. HTML中如何写for循环全选,利用html:multibox 循环遍历checkbox 并且全选全解除
  2. scp连接计算节点操作
  3. 贵州:值得做好“水”文章
  4. 计算机系统-理论-内存分页机制/线性地址/虚拟内存
  5. proc wifi 开启_centos7环境开启WIFI热点
  6. 利用递归实现简单的树结构菜单
  7. 快速查找对方IP地址经典技巧汇总
  8. Coremail邮件安全:2022重保最新钓鱼案件典型攻击手法复盘
  9. linux 7 查看网卡配置文件,如何查询centos网卡配置文件
  10. 网页制作中的超链接怎么做
  11. Javascript:简易天数计算器
  12. 情人节程序员用HTML网页表白【在一起计时】 HTML5七夕情人节表白网页源码 HTML+CSS+JavaScript
  13. html汉字间的间距,div字间距-div内文字之间间距设置方法
  14. VB6 MsgBox 函数
  15. 网络——码元、速率、波特、带宽
  16. 对伪装docx文件病毒的逆向分析
  17. 服务器2012系统修复,windows2012R2: sfc /scannow,错误:资源保护无法启动修复服务 - Microsoft Community...
  18. Enhancer学习(原无远开发平台)
  19. 《GIT视频教程》(p41~p44)
  20. SAP 发票金额容差与供应商容差

热门文章

  1. php获取网站根目录
  2. Google Analytics 跟踪代码安装后状态总是显示'未安装跟踪代码'
  3. 【Python】/ 和 // 的区别
  4. 【Python】列表 list 添加元素的几种方法
  5. 人工智能学习实战之路
  6. Java并行有优势吗_Java中不同的并发实现的性能比较
  7. python类的方法三种访问权_Python基础33-面向对象(继承资源(属性与方法)的使用注意)...
  8. 基于光学导航系统,矩阵变换和3D-2D配准研究
  9. 五十种巧妙优化SQL Server数据库
  10. C++ Builder 导入 lib 库语法