Можно ли получить доступ к моим моделям django внутри конвейера Scrapy, чтобы я мог сохранить свои очищенные данные прямо к моей модели?
Я видел этот, но я действительно не понимаю, как его настроить?
Можно ли получить доступ к моим моделям django внутри конвейера Scrapy, чтобы я мог сохранить свои очищенные данные прямо к моей модели?
Я видел этот, но я действительно не понимаю, как его настроить?
Если у кого-то еще есть одна и та же проблема, я решил это.
Я добавил это в свой файл 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 внутри вашего проекта.
Противоположное решение (настройка очистки в команде управления 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.
Добавьте проект 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
.
Для 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/')
Проверьте django-dynamic-scraper, он интегрирует диспетчера пауков Scrapy на сайт Django.
Почему бы не создать файл __init__.py
в папке проекта scrapy и подключить его в INSTALLED_APPS
? Работал для меня. Я смог просто использовать:
from my_app.models import MyModel
Надеюсь, что это поможет.
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()
Незначительное обновление для решения 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')