33

是否可以在 Scrapy 管道中访问我的 django 模型,以便我可以将抓取的数据直接保存到我的模型中?

我看过这个,但我真的不明白如何设置它?

4

8 回答 8

26

如果其他人有同样的问题,这就是我解决它的方法。

我将此添加到我的scrapy settings.py 文件中:

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('/path/to/django/project/')

注意:上面的路径是你的 django 项目文件夹,而不是 settings.py 文件。

现在,您将可以完全访问您的 scrapy 项目中的 django 模型。

于 2010-11-29T16:10:19.190 回答
21

相反的解决方案(在 django 管理命令中设置 scrapy):

# -*- coding: utf-8 -*-
# myapp/management/commands/scrapy.py 

from __future__ import absolute_import
from django.core.management.base import BaseCommand

class Command(BaseCommand):

    def run_from_argv(self, argv):
        self._argv = argv
        self.execute()

    def handle(self, *args, **options):
        from scrapy.cmdline import execute
        execute(self._argv[1:])

在 django 的 settings.py 中:

import os
os.environ['SCRAPY_SETTINGS_MODULE'] = 'scrapy_project.settings'

然后代替scrapy foo运行./manage.py scrapy foo

UPD:修复了绕过 django 的选项解析的代码。

于 2012-02-08T16:41:23.757 回答
16

在你的scrapy项目的settings.py中添加DJANGO_SETTINGS_MODULE env

import os
os.environ['DJANGO_SETTINGS_MODULE'] = 'your_django_project.settings'

现在你可以在你的 scrapy 项目中使用 DjangoItem。

编辑:
您必须确保your_django_project项目settings.pyPYTHONPATH.

于 2010-11-25T05:54:44.537 回答
2

对于 Django 1.4,项目布局发生了变化。设置模块位于 /myproject/myproject/settings.py 中,而不是 /myproject/settings.py。

我还将路径的父目录 (/myproject) 添加到 sys.path 以使其正常工作。

def setup_django_env(path):
    import imp, os, sys
    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)

    # Add path's parent directory to sys.path
    sys.path.append(os.path.abspath(os.path.join(path, os.path.pardir)))

setup_django_env('/path/to/django/myproject/myproject/')
于 2012-07-27T02:59:46.413 回答
1

查看 django-dynamic-scraper,它将 Scrapy 蜘蛛管理器集成到 Django 站点中。

https://github.com/holgerd77/django-dynamic-scraper

于 2013-01-11T13:14:56.297 回答
0

为什么不在__init__.pyscrapy项目文件夹中创建一个文件并将其连接起来INSTALLED_APPS?为我工作。我能够简单地使用:

管道线.py

from my_app.models import MyModel

希望有帮助。

于 2015-04-08T18:01:10.750 回答
0

小更新以解决 KeyError。Python(3)/Django(1.10)/Scrapy(1.2.0)

from django.core.management.base import BaseCommand

class Command(BaseCommand):    
    help = 'Scrapy commands. Accessible from: "Django manage.py". '

    def __init__(self, stdout=None, stderr=None, no_color=False):
        super().__init__(stdout=None, stderr=None, no_color=False)

        # Optional attribute declaration.
        self.no_color = no_color
        self.stderr = stderr
        self.stdout = stdout

        # Actual declaration of CLI command
        self._argv = None

    def run_from_argv(self, argv):
        self._argv = argv
        self.execute(stdout=None, stderr=None, no_color=False)

    def handle(self, *args, **options):
        from scrapy.cmdline import execute
        execute(self._argv[1:])

SCRAPY_SETTINGS_MODULE 声明仍然是必需的。

os.environ.setdefault('SCRAPY_SETTINGS_MODULE', 'scrapy_project.settings')
于 2016-10-12T21:57:12.957 回答
0

setup-environ已弃用。对于较新版本的 django 1.4+,您可能需要在 scrapy 的设置文件中执行以下操作

def setup_django_env():
    import sys, os, django

    sys.path.append('/path/to/django/myapp')
    os.environ['DJANGO_SETTINGS_MODULE'] = 'myapp.settings'

django.setup()
于 2016-08-15T13:58:57.163 回答