Zugang django Modelle innerhalb von Scrapy
-
28-09-2019 - |
Frage
Ist es möglich, in meinem django Modell für den Zugriff einer Scrapy Pipeline, so dass ich meine geschabt Daten direkt zu meinem Modell speichern?
Ich habe diese gesehen, aber ich habe nicht wirklich, wie es eingerichtet up?
Lösung
Wenn jemand anderes das gleiche Problem, das ist, wie ich es gelöst.
Ich habe das meine scrapy settings.py-Datei:
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/')
Hinweis: Der Weg ist oben auf Ihren django Projektordner, nicht die settings.py Datei.
Jetzt werden Sie innerhalb Ihres scrapy Projekt vollen Zugriff auf Ihre django Modelle haben.
Andere Tipps
Die entgegengesetzte Lösung (Setup scrapy in einem django-Management-Befehl):
# -*- 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:])
und in Djangos settings.py:
import os
os.environ['SCRAPY_SETTINGS_MODULE'] = 'scrapy_project.settings'
Dann statt scrapy foo
Lauf ./manage.py scrapy foo
.
UPD :. Der Code in den Bypass-Djangos Optionen festgelegt Parsen
In DJANGO_SETTINGS_MODULE env in Ihrem scrapy Projekt settings.py
import os
os.environ['DJANGO_SETTINGS_MODULE'] = 'your_django_project.settings'
Jetzt können Sie DjangoItem in Ihrem scrapy Projekt verwenden.
Edit:
Sie müssen sicherstellen, dass die your_django_project
Projekte settings.py
in PYTHONPATH
zur Verfügung.
Für Django 1.4 hat das Projekt das Layout geändert. Statt /myproject/settings.py ist das Einstellungsmodul in /myproject/myproject/settings.py.
Ich auch hinzugefügt Pfad übergeordnetes Verzeichnis (/ myproject) zu sys.path, um es richtig zu arbeiten.
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/')
Überprüfen Sie heraus django-dynamic-Schaber, es integriert einen Scrapy Spinne Manager in eine Django-Website.
Warum nicht eine __init__.py
Datei im scrapy Projektordner erstellen und in INSTALLED_APPS
anschließen? Arbeitete für mich. Ich konnte einfach verwenden:
piplines.py
from my_app.models import MyModel
Ich hoffe, das hilft.
setup-environ
ist veraltet. Unter Umständen müssen Sie die folgenden in scrapy der Einstellungsdatei für neuere Versionen von 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()
Minor-Update zu lösen 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:])
Die SCRAPY_SETTINGS_MODULE Erklärung ist weiterhin erforderlich.
os.environ.setdefault('SCRAPY_SETTINGS_MODULE', 'scrapy_project.settings')