You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Playwright-Scrapy爬取数据无法存入Django模型求助

问题分析与解决方案

你遇到的核心问题是Scrapy生成的Item无法写入Django模型,程序无报错但数据库无数据,以下是针对性的排查和解决步骤:

1. 确保Scrapy正确加载Django环境

Scrapy默认不会自动初始化Django环境,需在Scrapy项目的settings.py顶部添加以下代码,让Scrapy能识别Django的模型和数据库配置:

import os
import django
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "你的Django项目名.settings")
django.setup()

替换你的Django项目名为实际的Django项目根目录名称(比如你的tp_core所在的项目名)。

2. 确认Pipeline已启用

Scrapy不会自动执行自定义Pipeline,必须在settings.py中配置ITEM_PIPELINES:

ITEM_PIPELINES = {
    'scrapyapp.pipelines.ScrapyappPipeline': 300,  # 300为优先级,数值越小执行顺序越靠前
}

3. 验证字段匹配与数据有效性

  • 打印Item数据:在process_item开头添加日志,确认Item的字段值是否存在:
    def process_item(self, item, spider):
        spider.logger.info(f"当前Item数据: {dict(item)}")
        # 后续代码...
    
  • 检查字段拼写:确认Django模型字段名与你传入的参数完全一致,比如模型中如果是小写url,你传入URL = item.get('url')会导致字段不匹配,数据无法写入。
  • 文件字段处理:如果是图片/文件字段,Scrapy的ImagesPipeline处理后,数据通常存在item['images'](包含本地路径)而非item.get('image'),需确认ImagesPipeline的配置和Item字段定义是否对应。

4. 捕获模型保存异常

模型验证失败或数据库错误可能静默发生,需添加异常捕获和强制验证:

def process_item(self, item, spider):
    if model == ModelChoices.PATENT.value:
        try:
            quote = PatentThreat(
                patent_name=item.get('title'), 
                description=item.get('description'),
                file=item.get('image'), 
                URL=item.get('url'),
                contact_details=item.get('data')
            )
            quote.full_clean()  # 强制触发Django模型验证,抛出ValidationError
            quote.save()
            spider.logger.info(f"成功保存PatentThreat: {quote.patent_name}")
            return item
        except Exception as e:
            spider.logger.error(f"保存PatentThreat失败: {str(e)}")
            raise DropItem(f"无效Item: {str(e)}")
    # 其他模型分支同理添加异常处理

5. 检查model变量的匹配逻辑

你的代码中model = 'Patent',需确认ModelChoices.PATENT.value的实际值是否与'Patent'完全一致(注意大小写),可以添加日志验证:

def process_item(self, item, spider):
    spider.logger.info(f"model变量值: {model}, PATENT枚举值: {ModelChoices.PATENT.value}")
    # 后续代码...

6. 确认数据库连接正常

确保Django的数据库配置正确,且Scrapy运行时能访问数据库(比如数据库服务启动、用户有写入权限),可以直接在Scrapy的settings.py中复用Django的数据库配置。

内容的提问来源于stack exchange,提问作者Sarfraz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 20:39:19