2017-02-17 2 views
1

Ich habe zwei CrawlerProcesses, jeder ruft eine andere Spinne an. Ich möchte benutzerdefinierte Einstellungen einer dieser Prozesse passieren die Ausgabe der Spinne zu csv zu retten, ich dachte, dass ich dies tun könnte:Wie übergeben Sie benutzerdefinierte Einstellungen über CrawlerProcess in scrapy?

storage_settings = {'FEED_FORMAT': 'csv', 'FEED_URI': 'foo.csv'} 
process = CrawlerProcess(get_project_settings()) 
process.crawl('ABC', crawl_links=main_links, custom_settings=storage_settings) 
process.start() 

und in meiner Spinne Ich lese sie als Argument:

def __init__(self, crawl_links=None, allowed_domains=None, customom_settings=None, *args, **kwargs): 
    self.start_urls = crawl_links 
    self.allowed_domains = allowed_domains 
    self.custom_settings = custom_settings 
    self.rules = ...... 
    super(mySpider, self).__init__(*args, **kwargs) 

aber wie kann ich meine Projekteinstellungsdatei "settings.py" über diese benutzerdefinierten Einstellungen informieren? Ich möchte sie nicht hart codieren, sondern möchte, dass sie automatisch gelesen werden.

+0

Ich weiß nicht, ob dies möglich ist, wäre eine Konfigurationsdatei Ansatz für jede Spinne eine Lösung? So mache ich es in meinen Projekten. – voidpointercast

+0

Mein Ziel zu versuchen, es auf diese Weise zu tun ist, den Prozess, wenn eine for-Schleife, und dann kann ich automatisch verschiedene Namen für die CSV-Ausgabedateien haben. Kann ich das mit der Konfigurationsdatei machen? Können Sie mehr dazu sagen? – owise

Antwort

2

Sie können Ihre Datei nicht über diese Einstellungen informieren. Sie sind möglicherweise verwirrt zwischen Crawler-Einstellungen und Spider-Einstellungen. In der Schrottphase müssen die Futtermittelparameter zum Zeitpunkt dieses Schreibens an den Crawlerprozess und nicht an die Spinne übergeben werden. Sie müssen sie als Parameter an Ihren Crawlerprozess übergeben. Ich habe den gleichen Anwendungsfall wie du. Sie lesen die aktuellen Projekteinstellungen und setzen sie dann für jeden Crawlerprozess außer Kraft. Bitte beachten Sie die folgende Beispielcode:

s = get_project_settings() 
s['FEED_FORMAT'] = 'csv' 
s['LOG_LEVEL'] = 'INFO' 
s['FEED_URI'] = 'Q1.csv' 
s['LOG_FILE'] = 'Q1.log' 

proc = CrawlerProcess(s) 

Und dann Ihren Anruf process.crawl() nicht korrekt ist. Der Name des Spiders sollte als erstes Argument als String übergeben werden: process.crawl('MySpider', crawl_links=main_links) und natürlich MySpider sollte der Wert sein, der dem Attribut name in Ihrer Spider-Klasse gegeben wird.

0

Übergeben Sie die Einstellungen nicht an die Methode crawl(). Übergeben Sie auch den Klassennamen Ihrer Spinne als erstes Argument an crawl().

from my_crawler.spiders.my_scraper import MySpider 
from scrapy.crawler import CrawlerProcess 
from scrapy.settings import Settings 
from scrapy.utils.project import get_project_settings 
from twisted.internet import reactor 

process = CrawlerProcess(get_project_settings()) 

process.crawl(MySpider(), crawl_links=main_links) 

process.start() 
+0

das mache ich jetzt, ich gebe den Namen der Spinne 'ABC' als erstes Argument. – owise

+0

Nicht der Name, übergeben Sie den Klassennamen wie ich erwähnte – Umair

+0

Was bekomme ich davon? – owise

Verwandte Themen