满足数据库条件时如何从列表写入Django数据库?
Hey there! No worries at all—we all start somewhere with Django. Let's break down how to turn that scraper output into a working link aggregation site, step by step.
第一步:先定义Django模型(用来存储抓取的内容)
首先在你的news应用下的models.py里创建一个模型,用来存放从XML抓取到的文章信息:
from django.db import models class Article(models.Model): title = models.CharField(max_length=255, verbose_name="文章标题") date = models.DateTimeField(verbose_name="发布日期") link = models.URLField(unique=True, verbose_name="原文链接") # 可以根据需求添加其他字段,比如来源站点描述等 def __str__(self): return self.title class Meta: ordering = ['-date'] # 默认按发布日期倒序排列
写完后记得运行数据库迁移命令:
python manage.py makemigrations python manage.py migrate
第二步:改造你的scraper脚本,让它能把数据存入数据库
修改news/scraper.py,新增一个函数来处理数据入库逻辑,避免直接在MakeLists里耦合太多业务:
# 导入模型和日期处理工具 from .models import Article from django.utils import timezone def MakeLists(): # 你的现有代码逻辑,生成Article_date, Article_link, Article_title等列表 # 假设最终返回的是日期、链接、标题三个列表(长度一致) return Article_date, Article_link, Article_title def save_articles_to_db(): # 调用MakeLists获取数据 dates, links, titles = MakeLists() # 循环遍历数据,存入数据库 for date, link, title in zip(dates, links, titles): # 用get_or_create避免重复存储相同链接的文章 article, created = Article.objects.get_or_create( link=link, defaults={ 'title': title, # 如果你的date是字符串格式,需要转成datetime对象,比如: # 'date': timezone.datetime.strptime(date, "%Y-%m-%d %H:%M:%S") 'date': date } ) if created: print(f"✅ 新增文章:{title}") else: print(f"ℹ️ 文章已存在:{title}")
第三步:调用抓取脚本的几种方式
方式1:手动在Django Shell里调用
打开终端进入项目根目录,运行:
python manage.py shell
然后在Shell里执行:
from news.scraper import save_articles_to_db save_articles_to_db()
方式2:创建自定义Django管理命令(推荐)
在news应用下创建management/commands文件夹(需要新建__init__.py空文件),然后新建scrape_articles.py:
from django.core.management.base import BaseCommand from news.scraper import save_articles_to_db class Command(BaseCommand): help = "从XML抓取文章并保存到数据库" def handle(self, *args, **options): self.stdout.write("🔍 开始抓取文章...") save_articles_to_db() self.stdout.write(self.style.SUCCESS("✅ 抓取完成!"))
之后就可以直接在终端运行:
python manage.py scrape_articles
方式3:定时自动抓取(可选)
如果需要定期自动抓取,可以用django-crontab实现定时任务:
- 安装依赖:
pip install django-crontab - 在
settings.py的INSTALLED_APPS里添加django_crontab - 添加定时配置:
CRONJOBS = [ # 每天早上9点自动抓取一次 ('0 9 * * *', 'django.core.management.call_command', ['scrape_articles']), ]
- 启动定时任务:
python manage.py crontab add
第四步:在页面展示聚合的链接
编写视图函数
在news/views.py里添加:
from django.shortcuts import render from .models import Article def article_list(request): # 获取所有文章,按日期倒序 articles = Article.objects.all() return render(request, 'news/article_list.html', {'articles': articles})
创建模板文件
在news/templates/news下新建article_list.html:
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>链接聚合站</title> <style> .article-item { margin: 15px 0; padding-bottom: 10px; border-bottom: 1px solid #eee; } .article-title { font-size: 1.2em; color: #2c3e50; text-decoration: none; } .article-date { color: #7f8c8d; font-size: 0.9em; } </style> </head> <body> <div class="container"> <h1>最新聚合链接</h1> {% if articles %} {% for article in articles %} <div class="article-item"> <a href="{{ article.link }}" target="_blank" class="article-title">{{ article.title }}</a> <p class="article-date">发布于:{{ article.date|date:"Y年m月d日 H:i" }}</p> </div> {% endfor %} {% else %} <p>暂无聚合内容,先运行抓取脚本试试吧!</p> {% endif %} </div> </body> </html>
配置URL路由
在项目根目录的urls.py里添加:
from django.contrib import admin from django.urls import path from news.views import article_list urlpatterns = [ path('admin/', admin.site.urls), path('', article_list, name='article-list'), # 首页展示聚合链接 ]
现在启动Django服务python manage.py runserver,访问首页就能看到你的聚合链接啦!
内容的提问来源于stack exchange,提问作者user1563247
相关产品推荐
相关产品推荐

