请你用Python编写一个分布式爬虫系统,任务队列要使用celery。
时间: 2024-09-14 20:04:50 浏览: 63
构建一个分布式爬虫系统并使用Celery作为任务队列管理器通常涉及以下几个步骤:
1. 安装依赖:
首先确保已经安装了Python、Celery、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`会被异步执行,使得多个任务能够并发运行。
阅读全文