访问Scrapy内部的django模型

时间:2010-11-24 22:09:43

标签: python django scrapy

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

我见过this,但我真的不知道如何设置它?

8 个答案:

答案 0 :(得分: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模型。

答案 1 :(得分:20)

相反的解决方案(在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的选项解析。

答案 2 :(得分:14)

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

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

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

编辑:
您必须确保your_django_project中的settings.py项目PYTHONPATH可用。

答案 3 :(得分:2)

对于Django 1.4,项目布局已更改。而不是/myproject/settings.py,设置模块位于/myproject/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/')

答案 4 :(得分:1)

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

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

答案 5 :(得分:0)

为什么不在scrapy项目文件夹中创建__init__.py文件并将其挂钩到INSTALLED_APPS?为我工作。我能够简单地使用:

piplines.py

from my_app.models import MyModel

希望有所帮助。

答案 6 :(得分: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()

答案 7 :(得分:0)

解决KeyError的次要更新。蟒(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')