Acceso django modelos dentro de Scrapy
¿Es posible acceder a mis modelos django dentro de una canalización Scrapy, para que pueda guardar mis datos raspados directamente en mi modelo?
He visto esto, pero realmente no entiendo cómo configurarlo?
8 answers
Si alguien más está teniendo el mismo problema, así es como lo resolví.
He añadido esto a mi scrapy settings.py archivo:
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 a su carpeta de proyecto django, no a la settings.py archivo.
Ahora tendrás acceso completo a tus modelos django dentro de tu proyecto scrapy.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-29 16:10:19
La solución opuesta (configurar 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 django settings.py:
import os
os.environ['SCRAPY_SETTINGS_MODULE'] = 'scrapy_project.settings'
Luego en lugar de scrapy foo
ejecute ./manage.py scrapy foo
.
UPD : corregido el código para omitir el análisis de opciones de django.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-13 19:26:06
Agrega DJANGO_SETTINGS_MODULE env en tu proyecto scrapy settings.py
import os
os.environ['DJANGO_SETTINGS_MODULE'] = 'your_django_project.settings'
Ahora puedes usar DjangoItem en tu proyecto scrapy.
Editar:
Debe asegurarse de que los proyectos your_django_project
settings.py
estén disponibles en PYTHONPATH
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-12 06:53:49
Para Django 1.4, el diseño del proyecto ha cambiado. En lugar de /myproject/settings.py, el módulo de configuración está en /myproject/myproject/settings.py.
También agregué el directorio padre de path (/myproject) a sys.camino 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/')
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-27 02:59:46
Echa un vistazo a django-dynamic-scraper, integra un administrador de araña Scrapy en un sitio Django.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-11 13:14:56
¿Por qué no crear un archivo __init__.py
en la carpeta del proyecto scrapy y conectarlo a INSTALLED_APPS
? Funcionó para mí. Yo era capaz de utilizar simplemente:
Piplines.py
from my_app.models import MyModel
Espero que eso ayude.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-08 18:01:10
setup-environ
está en desuso. Es posible que tenga que 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()
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-15 13:58:57
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:])
La declaración SCRAPY_SETTINGS_MODULE sigue siendo necesaria.
os.environ.setdefault('SCRAPY_SETTINGS_MODULE', 'scrapy_project.settings')
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-12 21:57:12