摘要:繼上篇我們談論了的基本知識后,本篇繼續講解如何一步步使用構建分布式爬蟲。到此,我們就實現了一個很基礎的分布式網絡爬蟲,但是它還不具有很好的擴展性,而且貌似太簡單了下一篇我將以微博數據采集為例來演示如何構建一個穩健的分布式網絡爬蟲。
繼上篇我們談論了Celery的基本知識后,本篇繼續講解如何一步步使用Celery構建分布式爬蟲。這次我們抓取的對象定為celery官方文檔。
首先,我們新建目錄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 = [ "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里看看結果
可以看到一共有11條結果,說明 tasks.crawl中返回的數據都在db2(backend)中了,并且以json的形式存儲了起來,除了返回的結果,還有執行是否成功等信息。
到此,我們就實現了一個很基礎的分布式網絡爬蟲,但是它還不具有很好的擴展性,而且貌似太簡單了...下一篇我將以微博數據采集為例來演示如何構建一個穩健的分布式網絡爬蟲。
對微博大規模數據采集感興趣的同學可以關注一下分布式微博爬蟲,用用也是極好的
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/44378.html
摘要:阻塞,非阻塞首先,阻塞這個詞來自操作系統的線程進程的狀態模型網絡爬蟲基本原理一后端掘金網絡爬蟲是捜索引擎抓取系統的重要組成部分。每門主要編程語言現未來已到后端掘金使用和在相同環境各加載多張小圖片,性能相差一倍。 2016 年度小結(服務器端方向)| 掘金技術征文 - 后端 - 掘金今年年初我花了三個月的業余時間用 Laravel 開發了一個項目,在此之前,除了去年換工作準備面試時,我并...
摘要:阻塞,非阻塞首先,阻塞這個詞來自操作系統的線程進程的狀態模型網絡爬蟲基本原理一后端掘金網絡爬蟲是捜索引擎抓取系統的重要組成部分。每門主要編程語言現未來已到后端掘金使用和在相同環境各加載多張小圖片,性能相差一倍。 2016 年度小結(服務器端方向)| 掘金技術征文 - 后端 - 掘金今年年初我花了三個月的業余時間用 Laravel 開發了一個項目,在此之前,除了去年換工作準備面試時,我并...
摘要:方法不僅適用于百度云,別的一些比較難以模擬登陸的網站都可以按照這種方式分析。本文要求讀者具有模擬登陸主要是抓包和閱讀代碼和密碼學的基本知識。和模擬登陸微博的分析流程一樣,我們首先要做的是以正常人的流程完整的登錄一遍百度網盤。 這是第二篇從簡書搬運過來的文章(大家別誤會,是我原創的)。因為前一篇文章,我看反響還挺好的,所以把這篇也搬運過來了,其實目的還是為宣傳自己的分布式微博爬蟲(該項目...
摘要:下載器下載器負責獲取頁面數據并提供給引擎,而后提供給。下載器中間件下載器中間件是在引擎及下載器之間的特定鉤子,處理傳遞給引擎的。一旦頁面下載完畢,下載器生成一個該頁面的,并將其通過下載中間件返回方向發送給引擎。 作者:xiaoyu微信公眾號:Python數據科學知乎:Python數據分析師 在爬蟲的路上,學習scrapy是一個必不可少的環節。也許有好多朋友此時此刻也正在接觸并學習sc...
閱讀 1841·2021-08-19 11:12
閱讀 1418·2021-07-25 21:37
閱讀 980·2019-08-30 14:07
閱讀 1260·2019-08-30 13:12
閱讀 645·2019-08-30 11:00
閱讀 3523·2019-08-29 16:28
閱讀 982·2019-08-29 15:33
閱讀 2960·2019-08-26 13:40