2013-07-10 13 views
6

documentに続いて、私はPythonスクリプトからscrapyを実行できますが、私は治療結果を取得できません。Pythonスクリプト内からScrapyを実行することについて混乱しています

これは私のクモです:

from scrapy.spider import BaseSpider 
from scrapy.selector import HtmlXPathSelector 
from items import DmozItem 

class DmozSpider(BaseSpider): 
    name = "douban" 
    allowed_domains = ["example.com"] 
    start_urls = [ 
     "http://www.example.com/group/xxx/discussion" 
    ] 

    def parse(self, response): 
     hxs = HtmlXPathSelector(response) 
     rows = hxs.select("//table[@class='olt']/tr/td[@class='title']/a") 
     items = [] 
     # print sites 
     for row in rows: 
      item = DmozItem() 
      item["title"] = row.select('text()').extract()[0] 
      item["link"] = row.select('@href').extract()[0] 
      items.append(item) 

     return items 

お知らせ最後の行、私が実行した場合、私は、返された解析結果を使用しよう:

scrapy crawl douban 

端末は戻り結果

を印刷することができ

しかし、私はPythonスクリプトから返された結果を得ることができません。ここに私のPythonスクリプトは次のとおりです。

from twisted.internet import reactor 
from scrapy.crawler import Crawler 
from scrapy.settings import Settings 
from scrapy import log, signals 
from spiders.dmoz_spider import DmozSpider 
from scrapy.xlib.pydispatch import dispatcher 

def stop_reactor(): 
    reactor.stop() 
dispatcher.connect(stop_reactor, signal=signals.spider_closed) 
spider = DmozSpider(domain='www.douban.com') 
crawler = Crawler(Settings()) 
crawler.configure() 
crawler.crawl(spider) 
crawler.start() 
log.start() 
log.msg("------------>Running reactor") 
result = reactor.run() 
print result 
log.msg("------------>Running stoped") 

私はreactor.run()で結果を取得しようとするが、それは何も返さない、

にはどうすればいい結果を得ることができますか?

+0

スクリプトはどこに置いてください?治療プロジェクト、スパイダーフォルダー、または何ですか? –

+0

相互参照[この回答](http://stackoverflow.com/a/27744766/771848) - スクリプトからScrapyを実行する方法の詳細な概要を示す必要があります。 – alecxe

答えて

8

デフォルトのログレベルがDEBUGに設定されているため、ターミナルは結果を出力します。

スクリプトからスパイダーを実行し、log.start()を呼び出すと、デフォルトのログレベルはINFOに設定されます。

だけ交換してください:

log.start(loglevel=log.DEBUG) 

UPDと

log.start() 

を文字列として結果を取得するには、例えば、ファイルにすべてをログに記録し、それから読み取ることができます。

log.start(logfile="results.log", loglevel=log.DEBUG, crawler=crawler, logstdout=False) 

reactor.run() 

with open("results.log", "r") as f: 
    result = f.read() 
print result 

希望が役立ちます。

+0

ありがとう、これは問題の一つを解決するが、私はどのようにスクリプトでスパイダーでリターンの結果を得ることができますか? 'result = reactor.run()'の何が問題なのですか? – hh54188

+0

あなたは大歓迎です。私は答えを更新しました - 文字列として結果を得る方法を追加しました。 – alecxe

+2

その許可は出力を示しますが、そこからデータを収集するのではなく、これを行う適切な方法はパイプラインを書くか使用することです。 – Medeiros

0

私の場合、スクリプトファイルを治療プロジェクトレベルに配置しました。もしscrapyproject/scrapyproject/spidersなら、私はscrapyproject/myscript.pyに配置しました

4

自分自身に同じことを尋ねながら、私はあなたの質問を見つけました。これはここで回答されなかったので、私は自分自身を答えを見つけるために努力し、今私が持っていることを、私はそれを共有することができます

items = [] 
def add_item(item): 
    items.append(item) 
dispatcher.connect(add_item, signal=signals.item_passed) 

それともscrapy 0.22(http://doc.scrapy.org/en/latest/topics/practices.html#run-scrapy-from-a-script)によって、私の解決策の最後の行を置き換えるため

crawler.signals.connect(add_item, signals.item_passed) 

私のソリューションは、http://www.tryolabs.com/Blog/2011/09/27/calling-scrapy-python-script/から自由に適合しています。

+0

これは私にとって完璧に動作しますが、Scrapyのバージョン1.1以降は、 "scrapy.xlib.pydispatch import dispatcher"という行にDeprecation警告が表示されます。これはScrapyDeprecationWarningです:scrapy.xlib.pydispatchからのインポートは推奨されず、今後のScrapyバージョンではサポートされなくなります。シグナルを接続したいだけの場合は、from_crawlerクラスのメソッドを使用します。そうでない場合は、必要に応じてpydispatchを直接インポートします。参照:https://github.com/scrapy/scrapy/issues/1762 scrapy.xlib.pydispatchからインポートディスパッチャ – Derwent

関連する問題