2012-03-13 15 views
21

Desidero utilizzare scrapy per la scansione di pagine Web. C'è un modo per passare l'URL di partenza dal terminale stesso?Come dare URL a scrapy per la scansione?

Si è dato nel documentation che o il nome del ragno o l'URL può essere dato, ma quando ho dato l'URL che genera un errore:

// nome del mio Spider è esempio, ma io sto dando url al posto del mio nome di spider (funziona bene se do il nome di spider).

scrapy crawl example.com

ERRORE:

File "/usr/local/lib/python2.7/dist-packages/Scrapy-0.14.1-py2.7.egg/scrapy/spidermanager.py", line 43, in create raise KeyError("Spider not found: %s" % spider_name) KeyError: 'Spider not found: example.com'

Come posso fare Scrapy di utilizzare il mio ragno sul URL specificato nel terminale ??

+0

Is example.com aggiunto ai domini consentiti del tuo spider? –

+0

yes example.com viene aggiunto a allowed_domains. Quello che voglio veramente è dare start_url dalla riga di comando. Come posso farlo? –

risposta

43

Non sono veramente sicuro dell'opzione della riga di comando. Tuttavia, potresti scrivere il tuo ragno in questo modo.

class MySpider(BaseSpider): 

    name = 'my_spider'  

    def __init__(self, *args, **kwargs): 
     super(MySpider, self).__init__(*args, **kwargs) 

     self.start_urls = [kwargs.get('start_url')] 

e iniziare le cose come: scrapy crawl my_spider -a start_url="http://some_url"

+0

grazie mille, questo è esattamente quello che stavo cercando. Ha funzionato bene per me :) –

+0

Questo approccio funziona solo per esattamente un URL. Se desideri fornire più di un URL, consulta [il mio approccio] (http://stackoverflow.com/a/12749782/1125413) in questa discussione. – pemistahl

+1

Per più URL: 'self.start_urls = kwargs.pop ('start_urls'). Split (',')' che viene eseguito * prima * super(). –

3

Utilizzare il comando Scrapy parse. Puoi analizzare un url con il tuo ragno. url viene passato dal comando.

$ scrapy parse http://www.example.com/ --spider=spider-name 

http://doc.scrapy.org/en/latest/topics/commands.html#parse

+0

Sfortunatamente, parse scrapy non sembra avere opzioni per salvare i risultati in un file (in vari formati) come la scansione scrapy fa – dan3

+0

Se stai cercando di eseguire il debug del motivo per cui un particolare url il tuo spider fallisce è un'opzione facile. – jeffjv

+0

Impossibile salvare/esportare su file facilmente. Altrimenti sarebbe stato perfetto. – Citricguy

3

Questa è un'estensione the approach given by Sjaak Trekhaak in questo thread. L'approccio così com'è funziona solo se fornisci esattamente un url. Per esempio, se si desidera fornire più di un URL in questo modo, per esempio:

-a start_url=http://url1.com,http://url2.com 

poi Scrapy (sto usando la corrente versione stabile 0.14.4) terminerà con la seguente eccezione:

error: running 'scrapy crawl' with more than one spider is no longer supported 

Tuttavia, è possibile aggirare questo problema scegliendo una variabile diversa per ogni URL di avvio, insieme a un argomento che contiene il numero di URL trasmessi. Qualcosa di simile a questo:

-a start_url1=http://url1.com 
-a start_url2=http://url2.com 
-a urls_num=2 

È quindi possibile effettuare le seguenti operazioni nel vostro ragno:

class MySpider(BaseSpider): 

    name = 'my_spider'  

    def __init__(self, *args, **kwargs): 
     super(MySpider, self).__init__(*args, **kwargs) 

     urls_num = int(kwargs.get('urls_num')) 

     start_urls = [] 
     for i in xrange(1, urls_num): 
      start_urls.append(kwargs.get('start_url{0}'.format(i))) 

     self.start_urls = start_urls 

Questo è un po 'brutto hack, ma funziona. Certo, è noioso scrivere esplicitamente tutti gli argomenti della riga di comando per ogni url. Pertanto, ha senso racchiudere il comando scrapy crawl in Python subprocess e generare gli argomenti della riga di comando in un ciclo o qualcosa del genere.

Spero che aiuti.:)

+0

Se chiamo scrapy 0.24.4 come questo: 'crawler scrapy MySpider -a start_urls = http: //example.com/ -o - -t json' Tutto funziona bene. Inizialmente ho messo le opzioni tra -o e - e ottengo lo stesso come errore. –

10

Un modo ancora più semplice per consentire a più url-argomentazioni di quello che Peter suggerita è dando loro come una stringa con gli URL separati da una virgola, come questo:

-a start_urls="http://example1.com,http://example2.com" 

Nella ragno si farebbe poi semplicemente dividere la stringa '' e ottenere un array di URL:

self.start_urls = kwargs.get('start_urls').split(',') 
3

Sjaak Trekhaak ha l'idea giusta e qui è come permettere multipli:

class MySpider(scrapy.Spider): 
    """ 
    This spider will try to crawl whatever is passed in `start_urls` which 
    should be a comma-separated string of fully qualified URIs. 

    Example: start_urls=http://localhost,http://example.com 
    """ 
    def __init__(self, name=None, **kwargs): 
     if 'start_urls' in kwargs: 
      self.start_urls = kwargs.pop('start_urls').split(',') 
     super(Spider, self).__init__(name, **kwargs) 
0

Si può anche provare questo:

>>> scrapy view http://www.sitename.com 

si aprirà una finestra nel browser all'URL richiesto.

Problemi correlati