Pergunta

É possível acessar meus modelos de Django dentro de um pipeline de scrapy, para que eu possa salvar meus dados raspados diretamente no meu modelo?

eu tenho visto isto, mas eu realmente não entendo como configurá -lo?

Foi útil?

Solução

Se mais alguém está tendo o mesmo problema, é assim que eu o resolvi.

Eu adicionei isso ao meu Scrapy Arquivo 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: O caminho acima é para a pasta do projeto Django, não o arquivo Settings.py.

Agora você terá acesso total aos seus modelos de Django dentro do seu projeto de scrapy.

Outras dicas

A solução oposta (configuração de scrapy em um comando de gerenciamento de 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:])

e no Django's Settings.py:

import os
os.environ['SCRAPY_SETTINGS_MODULE'] = 'scrapy_project.settings'

Então em vez de scrapy foo corre ./manage.py scrapy foo.

Up: Corrigido o código para ignorar as opções de Django analisar.

Adicione django_settings_module Env no seu projeto de scrapy Settings.py

import os
os.environ['DJANGO_SETTINGS_MODULE'] = 'your_django_project.settings'

Agora você pode usar o Djangoitem em seu projeto de navegação.

Editar:
Você tem que garantir que o your_django_project projetos settings.py está disponível em PYTHONPATH.

Para o Django 1.4, o layout do projeto mudou. Em vez de /myproject/settings.py, o módulo de configurações está em /myproject/myproject/settings.py.

Também adicionei o diretório pai do Path (/MyProject) ao sys.path para fazê -lo funcionar corretamente.

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/')

Confira o raspador dinâmico Django, integra um gerente de aranha de scrapy em um site de Django.

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

Por que não criar um __init__.py Arquivo na pasta do projeto de scrapy e conecte -o em INSTALLED_APPS? Trabalhou para mim. Eu era capaz de simplesmente usar:

PIPLINES.PY

from my_app.models import MyModel

Espero que ajude.

setup-environ é preterido. Pode ser necessário fazer o seguinte no arquivo de configurações do Scrapy para versões mais recentes do 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()

Atualização menor para resolver o 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 declaração scrapy_settings_module ainda é necessária.

os.environ.setdefault('SCRAPY_SETTINGS_MODULE', 'scrapy_project.settings')
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top