Acesse modelos de django dentro da navegação
-
28-09-2019 - |
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?
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.
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')