使用 scrapy 存取 Django 模型

137 阅读2分钟

我在使用 Scrapy 爬取网站数据并将其保存到 Django 数据库。我想根据用户提供的域名运行爬虫,将数据存储在 Django 数据库中。

huake_00066_.jpg 我参考了以下资料:

  • [link 1](link 1)
  • [link 2](link 2)
  • [link 3](link 3)

但是,我尝试了 8 个多小时,仍然无法解决问题。

我注意到有两种方法可以将数据从 Scrapy 保存到 Django 数据库:一种是使用 DjangoItem,另一种是直接导入模型。

我尝试了以下代码:

def setup_django_env(path):
    import imp, os
    from django.core.management import setup_environ

    f, filename, desc = imp.find_module('settings', [path])
    project = imp.load_module('settings', f, filename, desc)

    setup_environ(project)

setup_django_env('/Users/Anders/DjangoTraining/wsgi/')

但我遇到了以下错误:

ImportError: No module named settings

我认为可能是因为我错误地定义了 Django 项目的路径。

我还尝试了以下代码:

setup_django_env('../../')

但仍然没有成功。

2. 解决方案

根据答主1的回答,我意识到主要的误解是软件包路径和设置模块路径不同。如果要从外部脚本中使用 django 的模型,需要设置 DJANGO_SETTINGS_MODULE。然后,这个模块必须是可以导入的(即,如果设置路径是 myproject.settings,那么在 Python shell 中应该可以正常运行 from myproject import settings 语句)。

因为大多数 Django 项目创建在默认 PYTHONPATH 之外的路径中,所以必须将项目的路径添加到 PYTHONPATH 环境变量中。

以下是在 Scrapy 项目中完全集成 Django 模型的分步指南:

  1. 在目录 /home/rolando/projects 中创建 Django 项目。
  2. 创建 Scrapy 项目。
  3. 在 Scrapy 项目的 items.py 中创建 Item。
  4. 在 Scrapy 项目的 settings.py 中设置环境变量。
  5. 创建 Spider。
  6. 在 Scrapy 项目的 pipelines.py 中创建 pipeline。
  7. 在 Scrapy 项目的 settings.py 中添加 pipeline 设置。
  8. 运行 Spider。

根据答主2的回答,我了解到即使没有完整的 Django 项目,也可以让 scrapy 与 Django 模型(又称 Django ORM)一起工作。我的 scrapy 项目称为 scrapping。

在 scrapy settings.py 文件中添加以下代码:

from django.conf import settings as d_settings
d_settings.configure(
    DATABASES={
        'default': {
            'ENGINE': 'django.db.backends.postgresql_psycopg2',
            'NAME': 'db_name',
            'USER': 'db_user',
            'PASSWORD': 'my_password',
            'HOST': 'localhost',  
            'PORT': '',
        }},
    INSTALLED_APPS=(
        'scrapping',
    )
)

在 scrapy 项目的文件夹中创建一个 manage.py 文件:

#!/usr/bin/env python
import os
import sys

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "scrapping.settings")

    from django.core.management import execute_from_command_line

    execute_from_command_line(sys.argv)

在 scrapy 项目文件夹中创建 models.py 文件。

在 scrapy 项目文件夹中创建 items.py 和 pipeline.py 文件。

现在,就可以使用 scrapy 爬取网站数据并将其保存到 Django 数据库中。