是否可以在Scrapy管道中访问我的django模型,以便我可以将我的已删除数据直接保存到我的模型中?
我见过this,但我真的不知道如何设置它?
答案 0 :(得分:26)
如果其他人遇到同样的问题,我就是这样解决的。
我将此添加到 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/')
注意:上面的路径是你的django项目文件夹,而不是settings.py文件。
现在,您可以完全访问scrapy项目中的django模型。
答案 1 :(得分:20)
相反的解决方案(在django管理命令中设置scrapy):
# -*- 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:])
和django的settings.py:
import os
os.environ['SCRAPY_SETTINGS_MODULE'] = 'scrapy_project.settings'
然后代替scrapy foo
运行./manage.py scrapy foo
。
UPD :修复了代码以绕过django的选项解析。
答案 2 :(得分:14)
在scrapy项目的settings.py中添加DJANGO_SETTINGS_MODULE env
import os
os.environ['DJANGO_SETTINGS_MODULE'] = 'your_django_project.settings'
现在您可以在scrapy项目中使用DjangoItem。
编辑:
您必须确保your_django_project
中的settings.py
项目PYTHONPATH
可用。
答案 3 :(得分:2)
对于Django 1.4,项目布局已更改。而不是/myproject/settings.py,设置模块位于/myproject/myproject/settings.py中。
我还将路径的父目录(/ myproject)添加到sys.path以使其正常工作。
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/')
答案 4 :(得分:1)
查看django-dynamic-scraper,它将Scrapy蜘蛛管理器集成到Django站点中。
答案 5 :(得分:0)
为什么不在scrapy项目文件夹中创建__init__.py
文件并将其挂钩到INSTALLED_APPS
?为我工作。我能够简单地使用:
from my_app.models import MyModel
希望有所帮助。
答案 6 :(得分:0)
setup-environ
已弃用。对于较新版本的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()
答案 7 :(得分:0)
解决KeyError的次要更新。蟒(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:])
仍然需要SCRAPY_SETTINGS_MODULE声明。
os.environ.setdefault('SCRAPY_SETTINGS_MODULE', 'scrapy_project.settings')