Django如何运行爬虫?

在Django框架中运行爬虫是一个常见的需求,通常需要将爬虫逻辑与Django的Web功能结合,例如将爬取的数据存储到Django的数据库中,或者通过Django的视图和模板展示爬取结果,以下是详细的实现步骤和注意事项,帮助你在Django项目中高效地运行爬虫。

django中如何运行爬虫
(图片来源网络,侵删)

环境准备与项目结构

在开始之前,确保你已经安装了Python、Django以及爬虫所需的库(如Requests、Scrapy、BeautifulSoup等),可以通过以下命令安装必要的依赖:

pip install django requests scrapy beautifulsoup4

创建一个Django项目并应用:

django-admin startproject spider_project
cd spider_project
python manage.py startapp spider_app

spider_app目录下,可以创建一个spiders文件夹用于存放爬虫代码,

spider_project/
├── spider_app/
│   ├── spiders/
│   │   └── __init__.py
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
├── spider_project/
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── manage.py

定义爬虫逻辑

1 使用Requests + BeautifulSoup

如果爬虫逻辑较为简单,可以直接在Django的视图函数或自定义管理命令中实现,在spider_app/spiders/目录下创建一个simple_spider.py文件:

django中如何运行爬虫
(图片来源网络,侵删)
import requests
from bs4 import BeautifulSoup
from spider_app.models import Article  # 假设已定义Article模型
def scrape_articles():
    url = "https://example.com/news"
    response = requests.get(url)
    soup = BeautifulSoup(response.text, 'html.parser')
    articles = soup.find_all('div', class_='article')
    for article in articles:
        title = article.find('h2').text
        content = article.find('p').text
        Article.objects.create(title=title, content=content)

2 使用Scrapy框架

对于复杂的爬虫项目,推荐使用Scrapy,首先安装Scrapy并创建一个Scrapy项目:

pip install scrapy
scrapy startproject scrapy_project

在Scrapy项目的items.py中定义数据模型,并在spiders/目录下编写爬虫文件。

# scrapy_project/items.py
import scrapy
class ArticleItem(scrapy.Item):= scrapy.Field()
    content = scrapy.Field()
# scrapy_project/spiders/article_spider.py
import scrapy
from scrapy_project.items import ArticleItem
class ArticleSpider(scrapy.Spider):
    name = 'article_spider'
    start_urls = ['https://example.com/news']
    def parse(self, response):
        articles = response.css('div.article')
        for article in articles:
            item = ArticleItem()
            item['title'] = article.css('h2::text').get()
            item['content'] = article.css('p::text').get()
            yield item

将Scrapy与Django集成

Scrapy爬取的数据需要存储到Django的数据库中,可以通过以下步骤实现:

  1. 配置Django设置:在spider_project/settings.py中添加Scrapy的数据库配置:

    django中如何运行爬虫
    (图片来源网络,侵删)
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': 'db.sqlite3',
        }
    }
  2. 创建Django模型:在spider_app/models.py中定义与Scrapy Item对应的模型:

    from django.db import models
    class Article(models.Model):
        title = models.CharField(max_length=200)
        content = models.TextField()
        def __str__(self):
            return self.title
  3. 运行数据库迁移

    python manage.py makemigrations
    python manage.py migrate
  4. 修改Scrapy的Pipeline:在Scrapy项目的pipelines.py中添加Django数据库存储逻辑:

    from django.db import connection
    from scrapy_project.items import ArticleItem
    class DjangoPipeline:
        def process_item(self, item, spider):
            article = Article(title=item['title'], content=item['content'])
            article.save()
            return item
  5. 启用Pipeline:在scrapy_project/settings.py中启用该Pipeline:

    ITEM_PIPELINES = {
        'scrapy_project.pipelines.DjangoPipeline': 300,
    }

通过Django管理命令运行爬虫

为了方便在Django中调用爬虫,可以创建自定义管理命令,在spider_app/目录下创建management/commands/run_spider.py

from django.core.management.base import BaseCommand
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings
class Command(BaseCommand):
    help = 'Run Scrapy spider from Django'
    def handle(self, *args, **options):
        process = CrawlerProcess(get_project_settings())
        process.crawl('article_spider')  # 爬虫名称
        process.start()

运行爬虫的命令为:

python manage.py run_spider

通过Django视图触发爬虫

如果需要通过Web页面触发爬虫,可以在spider_app/views.py中编写视图函数:

from django.http import HttpResponse
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings
def run_spider_view(request):
    process = CrawlerProcess(get_project_settings())
    process.crawl('article_spider')
    process.start()
    return HttpResponse("Spider is running!")

然后在spider_project/urls.py中添加路由:

from django.urls import path
from spider_app.views import run_spider_view
urlpatterns = [
    path('run-spider/', run_spider_view, name='run_spider'),
]

注意事项

  • 异步处理:爬虫是I/O密集型任务,直接在Django视图中运行可能会阻塞请求,建议使用Celery或Django的异步视图(如ASGI)来处理。
  • 反爬虫策略:尊重目标网站的robots.txt,设置合理的请求间隔,使用User-Agent等。
  • 数据清洗:在存储到数据库前,对爬取的数据进行清洗和验证。

相关问答FAQs

Q1: 如何在Django中定时运行爬虫?
A1: 可以使用Django的django-crontab库或Celery Beat实现定时任务,在settings.py中添加:

CRONJOBS = [
    ('0 */6 * * *', 'spider_app.management.commands.run_spider.Command', '>> /tmp/spider.log')
]

然后运行:

python manage.py crontab add

Q2: 爬虫运行时如何避免重复爬取?
A2: 可以通过以下方式实现去重:

  1. 在Django模型中添加唯一约束(如title字段设置unique=True)。
  2. 使用Scrapy的DUPEFILTER_CLASS配置去重中间件。
  3. 在爬虫逻辑中检查数据库是否已存在相同数据。
    if not Article.objects.filter(title=item['title']).exists():
     article.save()

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/479923.html<

(0)
运维的头像运维
上一篇2025-11-20 11:18
下一篇 2025-11-20 11:21

相关推荐

  • idea命令行如何用mvn?

    在IntelliJ IDEA中使用命令行执行Maven命令(即idea命令行mvn)是许多Java开发者的日常需求,尤其是在需要快速构建、测试或部署项目时,虽然IDEA提供了内置的Maven工具窗口,但命令行操作往往更高效,尤其是在自动化脚本或CI/CD流程中,以下是详细的操作指南和注意事项,确保你的系统已安装……

    2025-11-15
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注