在Django中使用Celery进行Web爬取

2023-04-11 00:00:00 django celery web

使用Celery进行Web爬取的一般流程如下:

  1. 安装Celery和相关依赖库:
pip install celery django-celery-beat requests beautifulsoup4 lxml
  1. 在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标签内容,并返回该内容。

  1. 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定时任务。

  1. 在需要调用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,以便于测试和演示。

相关文章