在Django中使用Celery进行Web爬取
使用Celery进行Web爬取的一般流程如下:
- 安装Celery和相关依赖库:
pip install celery django-celery-beat requests beautifulsoup4 lxml
- 在Django项目中创建一个名为
tasks.py
的文件,定义Celery任务:
from celery import shared_task import requests from bs4 import BeautifulSoup @shared_task def fetch_title(url): response = requests.get(url) soup = BeautifulSoup(response.content, 'lxml') return soup.title.string
以上代码定义了一个名为fetch_title
的任务,接收一个URL参数,爬取该URL对应页面的title标签内容,并返回该内容。
- 在
settings.py
中配置Celery:
# Celery configuration CELERY_BROKER_URL = 'redis://localhost:6379' CELERY_RESULT_BACKEND = 'redis://localhost:6379' CELERY_BEAT_SCHEDULER = 'django_celery_beat.schedulers:DatabaseScheduler' # Django-celery-beat INSTALLED_APPS += ['django_celery_beat']
在以上配置中,我们选择了Redis作为消息队列和结果存储后端,同时使用了Django-celery-beat扩展库,用于配置和管理Celery定时任务。
- 在需要调用Celery任务的视图函数或其他逻辑中,通过
tasks.fetch_title.delay(url)
方法延迟执行Celery任务:
from tasks import fetch_title def crawl(request): url = 'http://pidancode.com' result = fetch_title.delay(url) return HttpResponse(result.get())
以上代码在响应用户请求时,调用了fetch_title
任务,并延迟执行,不会阻塞当前视图函数的执行。通过result.get()
可获取任务执行结果,该方法会阻塞直到任务执行完成。
需要注意的是,在使用字符串作为范例时,最好选用较短、无需翻墙的URL,以便于测试和演示。
相关文章