Доступ к моделям Django внутри Scrapy - PullRequest
32 голосов
/ 25 ноября 2010

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

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

Ответы [ 8 ]

26 голосов
/ 29 ноября 2010

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

Я добавил это в мой 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 внутри вашего проекта scrapy.

20 голосов
/ 08 февраля 2012

Противоположное решение (настройка scrapy в команде управления 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 run ./manage.py scrapy foo.

UPD : исправлен код, позволяющий обходить синтаксический анализ параметров django.

14 голосов
/ 25 ноября 2010

Добавьте DJANGO_SETTINGS_MODULE env в settings.py

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

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

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

2 голосов
/ 27 июля 2012

Для 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/')
1 голос
/ 11 января 2013

Проверьте django-dynamic-scraper, он интегрирует менеджер пауков Scrapy в сайт Django.

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

0 голосов
/ 13 октября 2016

Незначительное обновление для решения 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')
0 голосов
/ 15 августа 2016

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()
0 голосов
/ 08 апреля 2015

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

piplines.py

from my_app.models import MyModel

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...