33

Scrapyパイプライン内のdjangoモデルにアクセスして、スクレイピングされたデータをモデルに直接保存することはできますか?

私はこれを見ましが、私はそれを設定する方法を本当に理解していませんか?

4

8 に答える 8

26

他の誰かが同じ問題を抱えているなら、これが私がそれを解決した方法です。

これを私のscrapysettings.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モデルに完全にアクセスできるようになります。

于 2010-11-29T16:10:19.190 に答える
21

反対の解決策(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のオプション解析をバイパスするようにコードを修正しました。

于 2012-02-08T16:41:23.757 に答える
16

スクレイププロジェクトのsettings.pyにDJANGO_SETTINGS_MODULEenvを追加します

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

これで、ScrapyプロジェクトでDjangoItemを使用できます。

編集:プロジェクトがで利用可能で
あることを確認する必要があります。your_django_projectsettings.pyPYTHONPATH

于 2010-11-25T05:54:44.537 に答える
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/')
于 2012-07-27T02:59:46.413 に答える
1

django-dynamic-scraperをチェックしてください。これは、ScrapyスパイダーマネージャーをDjangoサイトに統合します。

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

于 2013-01-11T13:14:56.297 に答える
0

__init__.pyかすれたプロジェクトフォルダにファイルを作成して接続してみませんINSTALLED_APPSか?私のために働いた。私は簡単に使用することができました:

piplines.py

from my_app.models import MyModel

お役に立てば幸いです。

于 2015-04-08T18:01:10.750 に答える
0

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()
于 2016-08-15T13:58:57.163 に答える
0

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')
于 2016-10-12T21:57:12.957 に答える