2013-07-10 86 views
6

以下document,我可以從Python腳本運行scrapy,但無法獲得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

請問您在哪裏放腳本?在scrapy項目中,還是在蜘蛛文件夾中,還是什麼? –

+0

交叉引用[這個答案](http://stackoverflow.com/a/27744766/771848) - 應該給你一個關於如何從腳本運行Scrapy的詳細概述。 – alecxe

回答

8

終端打印結果,因爲默認日誌級別設置爲DEBUG

當您從腳本運行蜘蛛並調用log.start()時,默認日誌級別設置爲INFO

只需更換:

log.start() 

log.start(loglevel=log.DEBUG) 

UPD:

爲了得到結果作爲字符串,可以記錄所有的文件,然後從中讀取,例如:

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

在我的情況下,我將腳本文件放在scrapy項目級別,例如如果scrapperoject/scrapproject/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導入調度器」這是ScrapyDeprecationWarning:從scrapy.xlib.pydispatch導入已棄用,在將來的Scrapy版本中將不再受支持。如果您只想連接信號,請使用from_crawler類方法,否則直接根據需要導入pydispatch。請參閱:https://github.com/scrapy/scrapy/issues/1762 from scrapy.xlib.pydispatch import dispatcher – Derwent