Add export into front

This commit is contained in:
2025-08-13 00:26:39 +08:00
parent baea50bfa0
commit 5e396796ca
9 changed files with 1272 additions and 175 deletions

View File

@@ -1,21 +0,0 @@
from django.core.management.base import BaseCommand
from core.models import Website
from core.utils import crawl_xinhua_list
class Command(BaseCommand):
help = '批量爬取新华网文章'
def handle(self, *args, **options):
# 添加使用标记,确认该命令是否被调用
self.stdout.write(self.style.WARNING("crawl_xinhua command is being used"))
list_url = "https://www.news.cn/legal/index.html"
try:
website = Website.objects.get(base_url="https://www.news.cn/")
except Website.DoesNotExist:
self.stdout.write(self.style.ERROR("网站 https://www.news.cn/ 不存在,请先后台添加"))
return
self.stdout.write(f"开始爬取文章列表页: {list_url}")
crawl_xinhua_list(list_url, website)
self.stdout.write(self.style.SUCCESS("批量爬取完成"))

View File

@@ -13,16 +13,20 @@ class Command(BaseCommand):
help = '导出文章及相关的媒体文件(图片、视频等)'
def add_arguments(self, parser):
parser.add_argument('--format', type=str, default='json', help='导出格式: json 或 csv')
parser.add_argument('--format', type=str, default='docx', help='导出格式: json、csv 或 docx')
parser.add_argument('--website', type=str, help='指定网站名称导出特定网站的文章')
parser.add_argument('--output', type=str, default='', help='输出文件路径')
parser.add_argument('--include-media', action='store_true', help='包含媒体文件')
# 修改默认值为True使包含媒体文件成为默认行为
parser.add_argument('--include-media', action='store_true', default=True, help='包含媒体文件')
# 添加参数控制是否打包成zip
parser.add_argument('--no-zip', action='store_true', help='不打包成zip文件')
def handle(self, *args, **options):
format_type = options['format'].lower()
website_name = options['website']
output_path = options['output']
include_media = options['include_media']
no_zip = options['no_zip']
# 获取文章查询集
articles = Article.objects.all()
@@ -65,20 +69,26 @@ class Command(BaseCommand):
# 确定输出路径
if not output_path:
timestamp = timezone.now().strftime('%Y%m%d_%H%M%S')
if include_media:
output_path = f'articles_export_{timestamp}.zip'
else:
output_path = f'articles_export_{timestamp}.{format_type}'
# 默认导出为zip格式
output_path = f'articles_export_{timestamp}.zip'
# 执行导出
if include_media:
self.export_with_media(articles_data, media_files, output_path, format_type)
# 如果需要包含媒体文件或格式为docx则默认打包成zip
if include_media or format_type == 'docx':
if no_zip:
if format_type == 'docx':
self.export_as_word(articles_data, output_path)
elif format_type == 'json':
self.export_as_json(articles_data, output_path)
elif format_type == 'csv':
self.export_as_csv(articles_data, output_path)
else:
self.export_with_media(articles_data, media_files, output_path, format_type)
else:
if format_type == 'json':
self.export_as_json(articles_data, output_path)
elif format_type == 'csv':
self.export_as_csv(articles_data, output_path)
# 添加Word格式导出支持
elif format_type == 'docx':
self.export_as_word(articles_data, output_path)
else:
@@ -220,7 +230,6 @@ class Command(BaseCommand):
'media_files'] else ''
writer.writerow(article_data)
zipf.writestr(data_filename, csv_buffer.getvalue())
# 添加Word格式支持
elif format_type == 'docx':
# 创建Word文档并保存到ZIP
try: