python - query - Acceda a los modelos django dentro de Scrapy
django queryset to list (8)
¿Es posible acceder a mis modelos de django dentro de una tubería de Scrapy, de modo que pueda guardar mis datos raspados directamente en mi modelo?
He visto this , pero realmente no entiendo cómo configurarlo?
¿Por qué no crear un archivo __init__.py
en la carpeta del proyecto scrapy y conectarlo en INSTALLED_APPS
? Trabajó para mi. Pude simplemente usar:
piplines.py
from my_app.models import MyModel
Espero que ayude.
Actualización menor para resolver 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:])
Aún se requiere la declaración SCRAPY_SETTINGS_MODULE.
os.environ.setdefault(''SCRAPY_SETTINGS_MODULE'', ''scrapy_project.settings'')
Agrega DJANGO_SETTINGS_MODULE env en la configuración de tu proyecto de scrapy .py
import os
os.environ[''DJANGO_SETTINGS_MODULE''] = ''your_django_project.settings''
Ahora puede usar DjangoItem en su proyecto de scrapy.
Editar:
Debes asegurarte de que el proyecto your_django_project
projects settings.py
está disponible en PYTHONPATH
.
Echa un vistazo a django-dynamic-scraper, que integra un administrador de arañas de Scrapy en un sitio de Django.
La solución opuesta (setup scrapy en un comando de administración 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:])
y en settings.py de django:
import os
os.environ[''SCRAPY_SETTINGS_MODULE''] = ''scrapy_project.settings''
Luego, en lugar de scrapy foo
ejecuta ./manage.py scrapy foo
.
UPD : corrigió el código para eludir el análisis de las opciones de django.
Para Django 1.4, el diseño del proyecto ha cambiado. En lugar de /myproject/settings.py, el módulo de configuración se encuentra en /myproject/myproject/settings.py.
También agregué el directorio padre de la ruta (/ myproject) a sys.path para que funcione correctamente.
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/'')
Si alguien más está teniendo el mismo problema, así es como lo resolví.
Agregué esto a mi archivo 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/'')
Nota: la ruta anterior es para su carpeta de proyecto django, no para el archivo settings.py.
Ahora tendrá acceso completo a sus modelos django dentro de su proyecto de tratamiento.
setup-environ
está en desuso. Es posible que deba hacer lo siguiente en el archivo de configuración de scrapy para las versiones más recientes de 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()