2013-07-10 12 views
6

Seguendo document, posso eseguire scrapy da uno script Python, ma non riesco a ottenere il risultato scrapy.Confuso sull'esecuzione di Scrapy da uno script Python

Questo è il mio ragno:

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 

Avviso l'ultima riga, cerco di utilizzare il risultato di analisi restituito, se corro:

scrapy crawl douban 

il terminale potrebbe stampare il risultato di ritorno

Ma non riesco a ottenere il risultato di ritorno dallo script Python. Ecco il mio script 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") 

cerco di ottenere il risultato al reactor.run(), ma non restituire alcun valore,

Come posso ottenere il risultato?

+0

dove metti la sceneggiatura per favore? nel progetto scrapy o nella cartella spider o cosa? –

+0

Cross-referencing [questa risposta] (http://stackoverflow.com/a/27744766/771848) - dovrebbe darti una panoramica dettagliata su come eseguire Scrapy da uno script. – alecxe

risposta

8

Il terminale stampa il risultato perché il livello di registro predefinito è DEBUG.

Quando si esegue lo spider dallo script e si chiama log.start(), il livello di registro predefinito è INFO.

Basta sostituire:

log.start() 

con

log.start(loglevel=log.DEBUG) 

UPD:

per ottenere il risultato come stringa, è possibile registrare tutto in un file e poi leggere da esso, per esempio:

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 

Spero possa aiutare.

+0

Grazie a te, questo risolve uno dei problemi, ma come posso inserire nello script il risultato di ritorno in spider? cosa c'è di sbagliato con 'result = reactor.run()' – hh54188

+0

Sei il benvenuto. Ho aggiornato la risposta - aggiunta un'opzione su come ottenere i risultati come stringa. – alecxe

+2

Quel permesso mostra l'output ma invece di raccogliere i dati da lì penso che il modo corretto per farlo sia scrivere o usare le pipeline. – Medeiros

0

nel mio caso, ho inserito il file di script a livello di progetto scrapy, ad es. se scrapyproject/scrapyproject/spider l'ho inserito in scrapyproject/myscript.py

4

Ho trovato la tua domanda mentre mi chiedevo la stessa cosa, vale a dire: "Come posso ottenere il risultato?". Dal momento che questo non ha avuto risposta qui ho cercato di trovare la risposta me stesso e ora che ho posso condividerlo:

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

O per Scrapy 0,22 (http://doc.scrapy.org/en/latest/topics/practices.html#run-scrapy-from-a-script) sostituire l'ultima riga della mia soluzione da:

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

La mia soluzione è liberamente adattata da http://www.tryolabs.com/Blog/2011/09/27/calling-scrapy-python-script/.

+0

Questo funziona perfettamente per me tuttavia, dalla versione 1.1 di Scrapy, mi dà un avviso di deprecazione sulla linea "da scrapy.xlib.pydispatch import dispatcher" che è ScrapyDeprecationWarning: L'importazione da scrapy.xlib.pydispatch è deprecata e non sarà più supportato nelle future versioni di Scrapy. Se vuoi semplicemente connettere segnali usa il metodo della classe from_crawler, altrimenti importa pydispatch direttamente se necessario. Vedi: https://github.com/scrapy/scrapy/issues/1762 da scrapy.xlib.pydispatch import dispatcher – Derwent

Problemi correlati