Подтвердить что ты не робот

Доступ к моделям django внутри Scrapy

Можно ли получить доступ к моим моделям django внутри конвейера Scrapy, чтобы я мог сохранить свои очищенные данные прямо к моей модели?

Я видел этот, но я действительно не понимаю, как его настроить?

4b9b3361

Ответ 1

Если у кого-то еще есть одна и та же проблема, я решил это.

Я добавил это в свой файл 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.

Теперь у вас будет полный доступ к вашим моделям django внутри вашего проекта.

Ответ 2

Противоположное решение (настройка очистки в команде управления django):

# -*- 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.py:

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

Затем вместо scrapy foo запустите ./manage.py scrapy foo.

UPD: исправлен код для обойти разбор параметров django.

Ответ 3

Добавьте проект DJANGO_SETTINGS_MODULE в свой проект scrapy project.py

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

Теперь вы можете использовать DjangoItem в своем проекте scrapy.

Edit:
Вы должны убедиться, что your_django_project projects settings.py доступен в PYTHONPATH.

Ответ 4

Для 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 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/')

Ответ 6

Почему бы не создать файл __init__.py в папке проекта scrapy и подключить его в INSTALLED_APPS? Работал для меня. Я смог просто использовать:

piplines.py

from my_app.models import MyModel

Надеюсь, что это поможет.

Ответ 7

setup-environ устарел. Возможно, вам понадобится сделать следующее в файле настроек scrapy для более новых версий django 1.4 +

def setup_django_env():
    import sys, os, django

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

django.setup()

Ответ 8

Незначительное обновление для решения KeyError. Python (3)/Джанго (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')