如何構建乙個分布式爬蟲 基礎篇

2021-09-16 21:40:30 字數 2022 閱讀 1009

繼上篇我們談論了celery的基本知識後,本篇繼續講解如何一步步使用celery構建分布式爬蟲。這次我們抓取的物件定為celery官方文件。

首先,我們新建目錄distributedspider,然後再在其中新建檔案workers.py,裡面內容如下

from celery import celery

# 官方推薦使用json作為訊息序列化方式

celery_timezone='asia/shanghai',

celery_enable_utc=true,

celery_accept_content=['json'],

celery_task_serializer='json',

celery_result_serializer='json',

)

import requests

from bs4 import beautifulsoup

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,內容如下

url_list = [

'','',

'','',

'','',

'','',

'',''

]def manage_crawl_task(urls):

for url in urls:

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的形式儲存了起來,除了返回的結果,還有執行是否成功等資訊。

對微博大規模資料採集感興趣的同學可以關注一下分布式微博爬蟲,用用也是極好的

如何構建乙個分布式爬蟲 基礎篇

繼上篇我們談論了celery的基本知識後,本篇繼續講解如何一步步使用celery構建分布式爬蟲。這次我們抓取的物件定為celery官方文件。首先,我們新建目錄distributedspider,然後再在其中新建檔案workers.py,裡面內容如下 from celery import celery...

cola 乙個分布式爬蟲框架

python爬蟲是用python程式語言實現的網路爬蟲,主要用於網路資料的抓取和處理,相比於其他語言,python是一門非常適合開發網路爬蟲的程式語言,大量內建包,可以輕鬆實現網路爬蟲功能。python爬蟲可以做的事情很多,如搜尋引擎 採集資料 廣告過濾等,python爬蟲還可以用於資料分析,在資料...

爬蟲基礎 Scrapy Redis分布式爬蟲元件

scrapy是乙個框架,他本身是不支援分布式的。如果我們想要做分布式的爬蟲,就需要借助乙個元件叫做scrapy redis,這個元件正是利用了redis可以分布式的功能,整合到scrapy框架中,使得爬蟲可以進行分布式。可以充分的利用資源 多個ip 更多頻寬 同步爬取 來提高爬蟲的爬行效率。可以充分...