如何将含图片列的爬取DataFrame写入Django SQLite模型及代码存放位置?
代码存放位置
针对你需要持续爬取、同步最新数据的场景,推荐将爬取+数据导入逻辑放在Django自定义管理命令文件中,坚决不要把这段逻辑硬写进models.py里(models.py只负责定义数据库表结构,写业务爬取/导入逻辑会导致Django每次加载模型时自动触发爬取,引发异常)。
- 具体目录结构(假设你的Django app名为
product):- 在app根目录下新建两层嵌套文件夹
management/commands,每层文件夹内都加一个空的__init__.py文件,让Django能识别这是可加载的命令模块 - 最终导入逻辑的文件路径为
product/management/commands/sync_tshirt_data.py
- 在app根目录下新建两层嵌套文件夹
- 这种存放方式的优势:可以独立在命令行运行,后续搭配crontab、定时任务即可实现周期性爬取更新,和Web服务的请求逻辑完全解耦,不会互相影响。
具体数据导入实现
提前对齐字段映射关系
你的DataFrame列名和已定义的T_shirt模型字段不是完全同名,需要一一对应:
- DataFrame
Images→ 模型image字段 注意:Django的ImageField要求传入的是MEDIA_ROOT配置目录下的相对文件路径,如果你的Image列目前存的是远程图片URL,需要先补全图片下载到本地media目录的逻辑,不能直接把远程URL赋值给ImageField - DataFrame
Titles→ 模型title字段 - DataFrame
Prices→ 模型price字段 - DataFrame
link→ 模型link字段 - DataFrame
Website→ 模型website字段 - DataFrame
brand→ 模型brand字段
导入代码示例
在刚才创建的sync_tshirt_data.py文件中写入如下逻辑(包含你之前的DataFrame生成代码):
from django.core.management.base import BaseCommand from product.models import T_shirt # 替换为你实际的T_shirt模型导入路径 import pandas as pd class Command(BaseCommand): help = "同步爬取的mainlinemenswear品牌T恤数据到SQLite数据库" def handle(self, *args, **options): # 把你之前写的爬取+DataFrame生成逻辑完整移到这里 mainline_t_shirt = pd.DataFrame({ 'Images': image, 'Titles': title, 'Prices': price, 'link': link, 'Website': 'mainlinemenswear', 'brand': brand }) # 基于商品链接做去重更新,保证始终留存最新记录,不产生重复数据 for _, row in mainline_t_shirt.iterrows(): T_shirt.objects.update_or_create( link=row["link"], # 商品链接全局唯一,作为去重匹配的标识 defaults={ "image": row["Images"], "title": row["Titles"], "price": row["Prices"], "website": row["Website"], "brand": row["brand"] } ) self.stdout.write(self.style.SUCCESS("T恤数据同步完成"))
- 这里用
update_or_create而不是直接批量插入的原因:每次运行爬取逻辑时,相同链接的商品会自动更新为最新的价格、标题、图片信息,完全匹配你“持续留存最新记录”的需求,不会在数据库里堆积重复的旧数据。
运行方式
写完代码后,在项目根目录执行命令即可完成一次数据导入:python manage.py sync_tshirt_data
后续要做持续更新,直接把这个命令加入系统定时任务,按你需要的频率跑即可。
内容的提问来源于stack exchange,提问作者jeffgrills
相关产品推荐
相关产品推荐

