博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何构建一个分布式爬虫:基础篇
阅读量:6117 次
发布时间:2019-06-21

本文共 2503 字,大约阅读时间需要 8 分钟。

继我们谈论了Celery的基本知识后,本篇继续讲解如何一步步使用Celery构建分布式爬虫。这次我们抓取的对象定为。

首先,我们新建目录distributedspider,然后再在其中新建文件workers.py,里面内容如下

from celery import Celeryapp = 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 requestsfrom bs4 import BeautifulSoupfrom workers import app@app.taskdef 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 appurl_list = [    'http://docs.celeryproject.org/en/latest/getting-started/introduction.html',    'http://docs.celeryproject.org/en/latest/getting-started/brokers/index.html',    'http://docs.celeryproject.org/en/latest/getting-started/first-steps-with-celery.html',    'http://docs.celeryproject.org/en/latest/getting-started/next-steps.html',    'http://docs.celeryproject.org/en/latest/getting-started/resources.html',    'http://docs.celeryproject.org/en/latest/userguide/application.html',    'http://docs.celeryproject.org/en/latest/userguide/tasks.html',    'http://docs.celeryproject.org/en/latest/userguide/canvas.html',    'http://docs.celeryproject.org/en/latest/userguide/workers.html',    'http://docs.celeryproject.org/en/latest/userguide/daemonizing.html',    'http://docs.celeryproject.org/en/latest/userguide/periodic-tasks.html']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里看看结果

backend示意图

可以看到一共有11条结果,说明 tasks.crawl中返回的数据都在db2(backend)中了,并且以json的形式存储了起来,除了返回的结果,还有执行是否成功等信息。

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


对微博大规模数据采集感兴趣的同学可以关注一下,用用也是极好的

转载地址:http://aevka.baihongyu.com/

你可能感兴趣的文章
类斐波那契数列的奇妙性质
查看>>
配置设置[Django]引入模版之后报错Requested setting TEMPLATE_DEBUG, but settings are not configured....
查看>>
下一步工作分配
查看>>
Response. AppendHeader使用大全及文件下载.net函数使用注意点(转载)
查看>>
Wait Functions
查看>>
代码描述10313 - Pay the Price
查看>>
jQuery最佳实践
查看>>
centos64i386下apache 403没有权限访问。
查看>>
vb sendmessage 详解1
查看>>
jquery用法大全
查看>>
Groonga 3.0.8 发布,全文搜索引擎
查看>>
PC-BSD 9.2 发布,基于 FreeBSD 9.2
查看>>
网卡驱动程序之框架(一)
查看>>
css斜线
查看>>
Windows phone 8 学习笔记(3) 通信
查看>>
重新想象 Windows 8 Store Apps (18) - 绘图: Shape, Path, Stroke, Brush
查看>>
Revit API找到风管穿过的墙(当前文档和链接文档)
查看>>
Scroll Depth – 衡量页面滚动的 Google 分析插件
查看>>
Windows 8.1 应用再出发 - 视图状态的更新
查看>>
自己制作交叉编译工具链
查看>>