Come accedere alle impostazioni di scrapy in settings.py dalla pipeline dell'elemento. La documentazione menziona che è possibile accedervi tramite il crawler nelle estensioni, ma non vedo come accedere al crawler nelle pipeline.Come accedere alle impostazioni di scrapy dall'elemento Pipeline
risposta
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.
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?
Nonostante la documentazione suggerisca il metodo usato @avaleske, preferisco ancora in questo modo perché funziona e più veloce da capire. –
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à. –
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')
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. –
la struttura del progetto è piuttosto piatta, perché non:
# pipeline.py
from myproject import settings
- 1. accedere alle impostazioni NotificationListenerService Android
- 2. Scrapy 1.0+ accesso alle impostazioni corrette in CsvItemExporter sublcass?
- 3. Come accedere alle impostazioni del dispositivo a livello di programmazione?
- 4. Come accedere alle impostazioni di web.config direttamente nella pagina .aspx?
- 5. Integrationtest di pipeline scrapy restituita differita
- 6. Abilita GPS programmaticamente Android (senza accedere alle impostazioni della posizione)
- 7. Python Scrapy, come definire una pipeline per un articolo?
- 8. Ripristino programmato alle impostazioni di fabbrica dell'iPhone
- 9. Scrapy, Python: più classi di oggetti in una pipeline?
- 10. Come impostare diverse impostazioni di scrapy per diversi spider?
- 11. Torna alle impostazioni dell'attività
- 12. Qt come accedere alle risorse
- 13. SPARK, ML, Tuning, CrossValidator: accedere alle metriche
- 14. Come aggiungere un'attività delle impostazioni di notifica alle impostazioni di sistema
- 15. Come posso accedere a una variabile di pipeline $ _ di livello superiore da una pipeline annidata?
- 16. Come ripristinare l'editor VBA alle impostazioni iniziali?
- 17. Pipeline scrapy spider_opened e spider_closed non vengono chiamati
- 18. Come accedere alle impostazioni WiFi in modo programmatico in iOS 5.1
- 19. Come accedere a un start_url specifico in Scrapy CrawlSpider?
- 20. Ember.js: Come accedere alle istanze vista nested
- 21. javascript: come accedere alle proprietà statiche
- 22. Come accedere alle enumerazioni Java da Scala?
- 23. Come accedere alle risorse nel file JAR?
- 24. Come accedere alle viste nell'actionLayout nel menu
- 25. Posso accedere alle risorse da diverse versioni Android?
- 26. Come accedere alle proprietà degli utenti di Meteor nell'array?
- 27. Meteor: come accedere alle proprietà principali all'interno di modelli nidificati?
- 28. come accedere alle risorse in un progetto di libreria Android
- 29. Come accedere alle intestazioni HTTP nell'endpoint di Spring-ws?
- 30. Come accedere alle variabili membro nella classe di stringa STL?
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
@ 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
@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