Python爬虫入门教程 76-100 用Celery继续搞定分布式爬虫

118 篇文章 1562 订阅 ¥99.90 ¥299.90
本文介绍了使用Celery实现Python分布式爬虫的步骤,包括任务队列概念、Celery任务定义、任务调用API以及配置文件解析。通过实例代码展示了如何创建和运行Celery worker,强调了关键参数如并发数的设置。文章末尾提供了相关资源链接和作者信息。
摘要由CSDN通过智能技术生成

写在前面

对于分布式爬虫学习来说,或者对于技术学习来说,没有捷径,两条路可以走,第一自己反复练习,孰能生巧;第二看别人分享的代码反复学习别人的写法,直到自己做到。

今天继续通过celery实现分布式爬虫爬取https://book.douban.com/tag/?view=type&icn=index-sorttags-all

简单回忆下上篇博客涉及celery相关的知识点,celery官方定义为分布式任务队列,核心就是通过队列来实现跨线程或者跨终端进行作业分发。

队列的输入是一个作业单元,被称为task,我们只需要在定义好的函数上方,增加@app.task 装饰一下即可,查阅手册可以查看其它参数内容。

定义好task之后,执行worker 监控这个队列,有新作业即执行。

Python代码走起

接下来就是正式编码部分了,我们先补充一些基本知识

celery task 任务调用有三个API:

  1. 直接给任务发送消息
构建一个分布式爬虫系统并使用Celery作为任务队列管理器通常涉及以下几个步骤: 1. 安装依赖: 首先确保已经安装了PythonCelery、Django(如果用于web应用)以及相关的网络爬虫库如`requests`或`beautifulsoup4`。 ```bash pip install django celery requests ``` 2. 创建项目和应用: 如果使用Django框架,创建一个新的Django项目和应用。 ```bash django-admin startproject distributed_crawler cd distributed_crawler python manage.py startapp spider_app ``` 3. 设置Celery配置: 在`distributed_crawler/settings.py`文件中添加Celery配置,包括设置broker(消息队列)和结果存储: ```python CELERY_BROKER_URL = 'redis://localhost:6379/0' CELERY_RESULT_BACKEND = 'redis://localhost:6379/0' ``` 4. 创建Celery任务: 在`spider_app/tasks.py`文件中定义爬取任务,使用`@app.task`装饰器标记为 Celery 任务: ```python from .models import CrawlTask from scrapy.crawler import CrawlerProcess @app.task def crawl_task(task_id): task = CrawlTask.objects.get(id=task_id) # 使用Scrapy或其他爬虫库进行实际抓取 process = CrawlerProcess({ 'USER_AGENT': 'Mozilla/5.0', # ... 其他Scrapy配置项 }) process.crawl(task.spider_name) process.start() task.status = 'completed' # 更新任务状态 task.save() ``` 5. 模型定义: 在`spider_app/models.py`中定义任务模型: ```python from django.db import models class CrawlTask(models.Model): name = models.CharField(max_length=200) url = models.URLField() status = models.CharField(max_length=20, choices=[('pending', 'Pending'), ('running', 'Running'), ('completed', 'Completed')]) def __str__(self): return f"{self.name} - {self.url}" ``` 6. 提交任务到队列: 在`spider_app/views.py`中,你可以提供一个API来接收新的爬取请求,并将其提交到Celery任务队列: ```python from django.http import JsonResponse from rest_framework import serializers from .tasks import crawl_task class CrawlTaskSerializer(serializers.ModelSerializer): class Meta: model = CrawlTask fields = ['name', 'url'] # 添加一个视图函数 def create_crawl_task(request): serializer = CrawlTaskSerializer(data=request.data) if serializer.is_valid(): task = serializer.save() crawl_task.apply_async(args=[task.id], queue='high_priority') # 使用特定队列 return JsonResponse(serializer.data, status=201) else: return JsonResponse(serializer.errors, status=400) ``` 7. 启动Celery worker: 在命令行启动Celery worker: ```bash celery -A distributed_crawler worker --loglevel=info ``` 现在,你有一个基本的分布式爬虫系统,新任务会被添加到Celery队列中,等待被worker处理。`crawl_task`会被异步执行,使得多个任务能够并发运行。
评论 43
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦想橡皮擦

如有帮助,来瓶可乐

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值