分布式爬蟲之celery

2021-08-14 04:55:32 字數 2237 閱讀 9588

以爬douban**為例

首先啟動redis,新建檔案crawl_douban.py

import requests

from bs4 import beautifulsoup

import time

from celery import celery

import redis

from configparser import configparser

cp=configparser()

cp.read('config')

#獲取配置資訊

db_host=cp.get(section='redis',option='db_host')

db_port=cp.getint('redis','db_port')

db_pwd=cp['redis']['db_pwd']

#redis連線

pool = redis.connectionpool(host=db_host, port=db_port, db=15, password=db_pwd)

r = redis.strictredis(connection_pool=pool)

set_name='crawl:douban'

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

celery_timezone='asia/shanghai',

celery_enable_utc=true,

celery_accept_content=['json'],

celery_task_serializer='json',

celery_result_serializer='json',

)headers=

defcrawl

(url):

res=requests.get(url,headers=headers)

#延遲2秒

time.sleep(2)

soup=beautifulsoup(res.text,'lxml')

items=soup.select('.subject-list .subject-item .info h2 a')

titles=[item['title'] for item in items]

#將**的title存入redis資料庫

r.sadd(set_name,(url,titles,time.time()))

print(titles)

return (url,titles)

將上面的指令碼部署到兩台主機a和b,然後各自執行下面的命令:

celery -a crawl_douban worker -l info
在本機c新建檔案task_dispatcher.py用於非同步分發任務,**如下:

from crawl_douban import crawl

defmanage_crawl

(urls):

for url in urls:

if __name__ == '__main__':

start_url = '**'

#爬去10頁,每頁20本書

url_list = ['{}?start={}&type=t'.format(start_url, page * 20) for page in range(10)]

manage_crawl(url_list)

執行task_dispatcher.py,跑完用時2.8s

celery

worker-a

tasks--

loglevel=info--

concurrency=5

引數」-a」指定了celery例項的位置

引數」loglevel」指定了日誌等級,也可以不加,預設為warning。

引數」concurrency」指定最大併發數,預設為cpu核數。

[program:celery]

command=celery worker -a tasks --loglevel=info --concurrency=5

directory=/home/user_00/learn

stdout_logfile=/home/user_00/learn/logs/celery.log

autorestart=true

redirect_stderr=true

Celery分布式應用

最近有應用需要部署到不同的伺服器上執行,但是有沒有pbs這樣的排程系統,就想起來python的排程神器 celery。現在針對我的實際應用做一些記錄。因為我並不注重結果而是把命令拿到不同的機器上執行,所以訊息 和結果儲存我都選擇了 redis 只需要在一台伺服器上安裝 redis,其他伺服器均使用該...

celery實現分布式

worker執行在不同的機器上,每台機器上有多個task程序 worker執行的時候連線到broker,在控制機器上 任務發布節點 直接向broker傳送任務,只要建立乙個broker,在不同的機器上執行celery worker。框架圖 task.py coding utf 8 from cele...

分布式佇列 Celery

詳情參見 分布式佇列神器 celery 2 celery 4.1 使用者指南 task 任務 3 celery 4.1 使用者指南 calling tasks 呼叫任務 4 celery 4.1 使用者指南 canvas designing work flows 設計工作流程 5 celery 4....