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?

Author: Schnouki, 2010-11-25

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.

 26
Author: imns,
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.

 20
Author: Mikhail Korobov,
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.

 14
Author: Jet Guo,
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/')
 2
Author: samwize,
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.

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

 1
Author: Sectio Aurea,
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.

 0
Author: Özer S.,
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()
 0
Author: Brayoni,
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')
 0
Author: Siggy,
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