2012-05-12 17 views
9

Scrapy web crawling frameworkをDjangoから実行したいと考えています。治療自体はコマンドラインツールscrapyを提供してそのコマンドを実行する。すなわち、ツールは意図的に外部プログラムから呼び出されるようには書かれていない。Djangoのカスタム管理コマンドを実行するScrapy:Scrapyのオプションを含めるには?

ユーザMikhail Korobovは、nice solutionという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 
     return super(Command, self).run_from_argv(argv) 

    def handle(self, *args, **options): 
     from scrapy.cmdline import execute 
     execute(self._argv[1:]) 

scrapy crawl domain.com Djangoプロジェクト内からpython manage.py scrapy crawl domain.comを実行できるようになりました。ただし、Scrapyコマンドのオプションはまったく解析されません。私はpython manage.py scrapy crawl domain.com -o scraped_data.json -t jsonをすれば、私は次の応答を取得:

Usage: manage.py scrapy [options] 

manage.py: error: no such option: -o 

は、だから私の質問はScrapyのコマンドラインオプションを採用するカスタム管理コマンドを拡張する方法、ありますか?

残念ながら、Djangoのdocumentation of this partはそれほど広範ではありません。私もPythonのoptparse moduleのドキュメントを読んだことがありますが、それ以降は私には分かりませんでした。この点で誰も助けてくれますか?ありがとうございます!

+0

しかし、私たちはトップディレクトリにあるべきではありませんか?それはどうですか? @pemistahl – Nabin

答えて

5

さて、私は私の問題の解決策を見つけました。それは少し醜いですが、それは動作します。 Djangoプロジェクトのmanage.pyコマンドはScrapyのコマンドラインオプションを受け付けないので、オプション文字列をmanage.pyで受け付ける2つの引数に分割します。解析に成功した後、私は2つの議論に再び参加し、それらをScrapyに渡します。

この

python manage.py scrapy crawl domain.com - o scraped_data.json - t json 

私のハンドル機能は、次のようになりますように代わり

python manage.py scrapy crawl domain.com -o scraped_data.json -t json 

を書くの私は、オプションの間にスペースを入れて、次のとおりです。

def handle(self, *args, **options): 
    arguments = self._argv[1:] 
    for arg in arguments: 
     if arg in ('-', '--'): 
      i = arguments.index(arg) 
      new_arg = ''.join((arguments[i], arguments[i+1])) 
      del arguments[i:i+2] 
      arguments.insert(i, new_arg) 

    from scrapy.cmdline import execute 
    execute(arguments) 

一方、ミハイル・コロボフは、最適なソリューションを提供しました。ここを参照してください:

# -*- 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:]) 
3

私はあなたが本当にガイドラインPOSIX argument syntax conventionsの10を探していると思う:

引数 - オプションの終わりを示す区切り文字として受け入れられるべきです。 次の引数は、たとえ ' - '文字の で始まる場合でも、オペランドとして扱う必要があります。 - 引数は、オプションまたはオペランドとして使用しないでください。

Pythonのoptparseモジュールは、Windows下でもこのように動作します。

私は、引数リストにscrapyプロジェクト設定モジュールを置くので、私は独立したアプリケーションで別々のscrapyプロジェクトを作成することができます。

次のように呼び出されます
# <app>/management/commands/scrapy.py 
from __future__ import absolute_import 
import os 

from django.core.management.base import BaseCommand 

class Command(BaseCommand): 
    def handle(self, *args, **options): 
     os.environ['SCRAPY_SETTINGS_MODULE'] = args[0] 
     from scrapy.cmdline import execute 
     # scrapy ignores args[0], requires a mutable seq 
     execute(list(args)) 

scrapy 0.12でテスト
python manage.py scrapy myapp.scrapyproj.settings crawl domain.com -- -o scraped_data.json -t json 

をdjango 1.3.1

関連する問題