摘要:繼上篇我們談?wù)摿说幕局R后,本篇繼續(xù)講解如何一步步使用構(gòu)建分布式爬蟲。到此,我們就實(shí)現(xiàn)了一個(gè)很基礎(chǔ)的分布式網(wǎng)絡(luò)爬蟲,但是它還不具有很好的擴(kuò)展性,而且貌似太簡單了下一篇我將以微博數(shù)據(jù)采集為例來演示如何構(gòu)建一個(gè)穩(wěn)健的分布式網(wǎng)絡(luò)爬蟲。
繼上篇我們談?wù)摿薈elery的基本知識后,本篇繼續(xù)講解如何一步步使用Celery構(gòu)建分布式爬蟲。這次我們抓取的對象定為celery官方文檔。
首先,我們新建目錄distributedspider,然后再在其中新建文件workers.py,里面內(nèi)容如下
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實(shí)例的初始化工作,include是在初始化celery app的時(shí)候需要引入的內(nèi)容,主要就是注冊為網(wǎng)絡(luò)調(diào)用的函數(shù)所在的文件。然后我們再編寫任務(wù)函數(shù),新建文件tasks.py,內(nèi)容如下
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,并且把標(biāo)簽為h1的元素提取出來
最后,我們新建文件task_dispatcher.py,內(nèi)容如下
from workers import app url_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發(fā)送任務(wù),任務(wù)是tasks.crawl,參數(shù)是url(元祖的形式)
現(xiàn)在,讓我們在節(jié)點(diǎn)A(hostname為resolvewang的主機(jī))上啟動worker
celery -A workers worker -c 2 -l info
這里 -c指定了線程數(shù)為2, -l表示日志等級是info。我們把代碼拷貝到節(jié)點(diǎn)B(節(jié)點(diǎn)名為wpm的主機(jī)),同樣以相同命令啟動worker,便可以看到以下輸出
可以看到左邊節(jié)點(diǎn)(A)先是all alone,表示只有一個(gè)節(jié)點(diǎn);后來再節(jié)點(diǎn)B啟動后,它便和B同步了
sync with celery@wpm
這個(gè)時(shí)候,我們運(yùn)行給這兩個(gè)worker節(jié)點(diǎn)發(fā)送抓取任務(wù)
python task_dispatcher.py
可以看到如下輸出
可以看到兩個(gè)節(jié)點(diǎn)都在執(zhí)行抓取任務(wù),并且它們的任務(wù)不會重復(fù)。我們再在redis里看看結(jié)果
可以看到一共有11條結(jié)果,說明 tasks.crawl中返回的數(shù)據(jù)都在db2(backend)中了,并且以json的形式存儲了起來,除了返回的結(jié)果,還有執(zhí)行是否成功等信息。
到此,我們就實(shí)現(xiàn)了一個(gè)很基礎(chǔ)的分布式網(wǎng)絡(luò)爬蟲,但是它還不具有很好的擴(kuò)展性,而且貌似太簡單了...下一篇我將以微博數(shù)據(jù)采集為例來演示如何構(gòu)建一個(gè)穩(wěn)健的分布式網(wǎng)絡(luò)爬蟲。
對微博大規(guī)模數(shù)據(jù)采集感興趣的同學(xué)可以關(guān)注一下分布式微博爬蟲,用用也是極好的
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/44378.html
摘要:阻塞,非阻塞首先,阻塞這個(gè)詞來自操作系統(tǒng)的線程進(jìn)程的狀態(tài)模型網(wǎng)絡(luò)爬蟲基本原理一后端掘金網(wǎng)絡(luò)爬蟲是捜索引擎抓取系統(tǒng)的重要組成部分。每門主要編程語言現(xiàn)未來已到后端掘金使用和在相同環(huán)境各加載多張小圖片,性能相差一倍。 2016 年度小結(jié)(服務(wù)器端方向)| 掘金技術(shù)征文 - 后端 - 掘金今年年初我花了三個(gè)月的業(yè)余時(shí)間用 Laravel 開發(fā)了一個(gè)項(xiàng)目,在此之前,除了去年換工作準(zhǔn)備面試時(shí),我并...
摘要:阻塞,非阻塞首先,阻塞這個(gè)詞來自操作系統(tǒng)的線程進(jìn)程的狀態(tài)模型網(wǎng)絡(luò)爬蟲基本原理一后端掘金網(wǎng)絡(luò)爬蟲是捜索引擎抓取系統(tǒng)的重要組成部分。每門主要編程語言現(xiàn)未來已到后端掘金使用和在相同環(huán)境各加載多張小圖片,性能相差一倍。 2016 年度小結(jié)(服務(wù)器端方向)| 掘金技術(shù)征文 - 后端 - 掘金今年年初我花了三個(gè)月的業(yè)余時(shí)間用 Laravel 開發(fā)了一個(gè)項(xiàng)目,在此之前,除了去年換工作準(zhǔn)備面試時(shí),我并...
摘要:的機(jī)器學(xué)習(xí)庫的機(jī)器學(xué)習(xí)庫,包括算法交叉驗(yàn)證神經(jīng)網(wǎng)絡(luò)等內(nèi)容。在即將到來的大會上,她將和大家分享在機(jī)器學(xué)習(xí)領(lǐng)域的全新可能。入門總結(jié)入門相關(guān),如安裝配置基本使用等。 基于 Swoole 開發(fā) PHP 擴(kuò)展 Swoole-1.9.7 增加了一個(gè)新特性,可以基于 Swoole 使用 C++ 語言開發(fā)擴(kuò)展模塊,在擴(kuò)展模塊中可以注冊 PHP 內(nèi)置函數(shù)和類。現(xiàn)在可以基于 Swoole 來編寫 PHP ...
摘要:方法不僅適用于百度云,別的一些比較難以模擬登陸的網(wǎng)站都可以按照這種方式分析。本文要求讀者具有模擬登陸主要是抓包和閱讀代碼和密碼學(xué)的基本知識。和模擬登陸微博的分析流程一樣,我們首先要做的是以正常人的流程完整的登錄一遍百度網(wǎng)盤。 這是第二篇從簡書搬運(yùn)過來的文章(大家別誤會,是我原創(chuàng)的)。因?yàn)榍耙黄恼拢铱捶错戇€挺好的,所以把這篇也搬運(yùn)過來了,其實(shí)目的還是為宣傳自己的分布式微博爬蟲(該項(xiàng)目...
摘要:下載器下載器負(fù)責(zé)獲取頁面數(shù)據(jù)并提供給引擎,而后提供給。下載器中間件下載器中間件是在引擎及下載器之間的特定鉤子,處理傳遞給引擎的。一旦頁面下載完畢,下載器生成一個(gè)該頁面的,并將其通過下載中間件返回方向發(fā)送給引擎。 作者:xiaoyu微信公眾號:Python數(shù)據(jù)科學(xué)知乎:Python數(shù)據(jù)分析師 在爬蟲的路上,學(xué)習(xí)scrapy是一個(gè)必不可少的環(huán)節(jié)。也許有好多朋友此時(shí)此刻也正在接觸并學(xué)習(xí)sc...
閱讀 1852·2021-08-19 11:12
閱讀 1426·2021-07-25 21:37
閱讀 990·2019-08-30 14:07
閱讀 1269·2019-08-30 13:12
閱讀 653·2019-08-30 11:00
閱讀 3531·2019-08-29 16:28
閱讀 995·2019-08-29 15:33
閱讀 2973·2019-08-26 13:40