是否可以在 Scrapy 管道中访问我的 django 模型,以便我可以将抓取的数据直接保存到我的模型中?
我看过这个,但我真的不明白如何设置它?
是否可以在 Scrapy 管道中访问我的 django 模型,以便我可以将抓取的数据直接保存到我的模型中?
我看过这个,但我真的不明白如何设置它?
如果其他人有同样的问题,这就是我解决它的方法。
我将此添加到我的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 模型。
相反的解决方案(在 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 的选项解析的代码。
在你的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
.
对于 Django 1.4,项目布局发生了变化。设置模块位于 /myproject/myproject/settings.py 中,而不是 /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/')
查看 django-dynamic-scraper,它将 Scrapy 蜘蛛管理器集成到 Django 站点中。
为什么不在__init__.py
scrapy项目文件夹中创建一个文件并将其连接起来INSTALLED_APPS
?为我工作。我能够简单地使用:
from my_app.models import MyModel
希望有帮助。
小更新以解决 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:])
SCRAPY_SETTINGS_MODULE 声明仍然是必需的。
os.environ.setdefault('SCRAPY_SETTINGS_MODULE', 'scrapy_project.settings')
setup-environ
已弃用。对于较新版本的 django 1.4+,您可能需要在 scrapy 的设置文件中执行以下操作
def setup_django_env():
import sys, os, django
sys.path.append('/path/to/django/myapp')
os.environ['DJANGO_SETTINGS_MODULE'] = 'myapp.settings'
django.setup()