2012-12-28 14 views

risposta

19

Ok, quindi la documentazione in http://doc.scrapy.org/en/latest/topics/extensions.html dice che

The main entry point for a Scrapy extension (this also includes middlewares and pipelines) is the from_crawler class method which receives a Crawler instance which is the main object controlling the Scrapy crawler. Through that object you can access settings, signals, stats, and also control the crawler behaviour, if your extension needs to such thing.

Allora si può avere una funzione per ottenere le impostazioni.

@classmethod 
def from_crawler(cls, crawler): 
    settings = crawler.settings 
    my_setting = settings.get("MY_SETTING") 
    return cls(my_setting) 

Il motore crawler chiama quindi la funzione init della pipeline con my_setting, in questo modo:

def __init__(self, my_setting): 
    self.my_setting = my_setting 

e altre funzioni possono accedere con self.my_setting, come previsto.

alternativa, nella funzione from_crawler() si può passare l'oggetto crawler.settings-__init__(), e quindi le impostazioni di accesso dalla tubazione, se necessario, invece di tirare fuori tutto nel costruttore.

+0

che suonano terribilmente complicato. Non c'è un modo più semplice per farlo, o forse una spiegazione migliore? Non potresti usare 'da scrapy.settings import Settings'? – not2qubit

+1

@ user1147688 Userò questo metodo, perché è conforme all'API interna basata su dipendenza di scrapy di scrapy. Il tuo suggerimento potrebbe funzionare, ma non sembra vi sia alcuna garanzia che continuerà anche in futuro, poiché le API interne potrebbero essere spostate. – deceze

+0

@avaleske, funziona benissimo, ma sai come possiamo usarlo per impostare un'impostazione? Ad esempio, in qualche altra funzione, dire che volevo cambiare uno dei valori delle impostazioni, come 'download_delay'. Possiamo farlo? – thefoxrocks

18

Il modo per accedere alle impostazioni di Scrapy (come definito in settings.py) all'interno di your_spider.py è semplice. Tutte le altre risposte sono troppo complicate. La ragione di ciò è la scarsa manutenzione della documentazione di Scrapy, combinata con molti aggiornamenti recenti & modifiche. Né nella documentazione "Impostazioni" "How to access settings", né nel "Settings API" hanno dato fastidio dando alcun esempio praticabile. Ecco un esempio di come ottenere la stringa corrente USER_AGENT.

Basta aggiungere le seguenti righe al your_spider.py:

# To get your settings from (settings.py): 
from scrapy.utils.project import get_project_settings 
... 
class YourSpider(BaseSpider): 
    ... 
    def parse(self, response): 
     ... 
     settings = get_project_settings() 
     print "Your USER_AGENT is:\n%s" % (settings.get('USER_AGENT')) 
     ... 

Come si può vedere, non c'è bisogno di usare @classmethod o ri-definire i from_crawler() o __init__() funzioni. Spero che questo ti aiuti.

PS. Non sono ancora sicuro del motivo per cui utilizzare from scrapy.settings import Settings non funziona allo stesso modo, poiché sarebbe la scelta più ovvia di importazione?

+0

Nonostante la documentazione suggerisca il metodo usato @avaleske, preferisco ancora in questo modo perché funziona e più veloce da capire. –

+3

Questo metodo ** non ** riconosce le impostazioni che erano [sovrascritte dalla riga di comando] (http://doc.scrapy.org/en/0.24/topics/settings.html#command-line-options). Usa la risposta di @avaleske se vuoi questa funzionalità. –

13

La risposta corretta è: dipende da dove nella pipeline si desidera accedere alle impostazioni.

avaleske ha risposto come se volessi accedere alle impostazioni al di fuori del tuo metodo di pipeline process_item ma è molto probabile che questo sia il luogo dove preferisci l'impostazione e quindi c'è un modo molto più semplice in cui l'istanza Spider stessa viene passata come argomento.

class PipelineX(object): 

    def process_item(self, item, spider): 
     wanted_setting = spider.settings.get('WANTED_SETTING') 
+1

Ottima risposta. Per il mio progetto ha avuto più senso inserire la logica nel metodo 'open_spider' in quanto utilizzo il valore solo quando viene caricato prima lo spider. –

2

la struttura del progetto è piuttosto piatta, perché non:

# pipeline.py 
from myproject import settings 
Problemi correlati