Scrapy内にDjangoモデルにアクセスします
-
28-09-2019 - |
質問
スクラピーパイプライン内にDjangoモデルにアクセスすることは可能ですか。そうすれば、スクレイプされたデータをモデルに直接保存できるようにしますか?
私は見た これ, 、しかし、私はそれをセットアップする方法を本当に手に入れませんか?
解決
他の誰かが同じ問題を抱えている場合、これが私がそれを解決した方法です。
私はこれを私に追加しました スクラピー 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/')
注:上記のパスは、settings.pyファイルではなく、djangoプロジェクトフォルダーにあります。
これで、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 Projectの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/settings.pyの代わりに、設定モジュールは/myproject/myproject/settings.pyにあります。
また、Pathの親ディレクトリ(/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をチェックしてください。ScrapySpiderManagerをDjangoサイトに統合します。
作成してみませんか __init__.py
Scrapy Projectフォルダーにファイルし、に接続します INSTALLED_APPS
?私のために働いた。私は単に使用することができました:
piplirs.py
from my_app.models import MyModel
それが役立つことを願っています。
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()
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')