分布式爬虫之celery
2017-12-29 15:46
120 查看
以爬douban小说为例
首先启动Redis,新建文件crawl_douban.py
将上面的脚本部署到两台主机A和B,然后各自运行下面的命令:
在本机C新建文件task_dispatcher.py用于异步分发任务,代码如下:
运行task_dispatcher.py,跑完用时2.8s
参数”-A”指定了Celery实例的位置
参数”loglevel”指定了日志等级,也可以不加,默认为warning。
参数”concurrency”指定最大并发数,默认为CPU核数。
首先启动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' app = Celery('crawl', include=['task'], broker='redis://:{}@{}:{}/12'.format(db_pwd,db_host,db_port), backend='redis://:{}@{}:{}/13'.format(db_pwd,db_host,db_port)) # 官方推荐使用json作为消息序列化方式 app.conf.update( CELERY_TIMEZONE='Asia/Shanghai', CELERY_ENABLE_UTC=True, CELERY_ACCEPT_CONTENT=['json'], CELERY_TASK_SERIALIZER='json', CELERY_RESULT_SERIALIZER='json', ) headers={ 'User-Agent':'', } @app.task def crawl(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 app def manage_crawl(urls): for url in urls: app.send_task('crawl_douban.crawl', args=(url,)) if __name__ == '__main__': start_url = 'https://boo 9af7 k.douban.com/tag/小说' #爬去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进阶——分布式爬虫
- 爬虫系列20.Celery - 分布式任务队列
- Python并行分布式框架Celery详解
- 使用scrapy-redis实现分布式爬虫
- 【实战\聚焦Python分布式爬虫必学框架Scrapy 打造搜索引擎项目笔记】第5章 scrapy爬取知名问答网站(2)
- 第三百四十一节,Python分布式爬虫打造搜索引擎Scrapy精讲—编写spiders爬虫文件循环抓取内容—meta属性返回指定值给回调函数—Scrapy内置图片下载器
- 第三百四十二节,Python分布式爬虫打造搜索引擎Scrapy精讲—爬虫数据保存
- 分布式爬虫
- 第三百四十四节,Python分布式爬虫打造搜索引擎Scrapy精讲—craw母版l创建自动爬虫文件—以及 scrapy item loader机制
- 爬虫实战8—分布式系统的高可用与高并发处理
- 第三百四十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—cookie禁用、自动限速、自定义spider的settings,对抗反爬机制
- 第三百五十一节,Python分布式爬虫打造搜索引擎Scrapy精讲—将selenium操作谷歌浏览器集成到scrapy中
- 如何构建一个分布式爬虫:理论篇
- 分布式爬虫
- 基于scrapy的分布式爬虫抓取新浪微博个人信息和微博内容存入MySQL
- 分布式爬虫的设计与实现
- 用rabbitmq 写一个多机分布式爬虫
- Celery 异步分布式 171219
- 工商企业数据-企信宝-天眼查-企查查360度深度分布式爬虫技术破解
- 用Python组合Celery Redis RabbitMQ进行分布式数据抓取