2016-12-09 4 views
1

enter image description hereWie Crawler-Parameter von scrapy Spinne

Ich versuche, eine Tabelle db Parameter zu übergeben gesetzt in einer scrapy Spinne zu einem Pipeline-Objekt setzen Frage How to pass parameter to a scrapy pipeline object zu verfolgen. auf der Grundlage der Antwort auf diese Frage habe ich:

@classmethod 
def from_crawler(cls, crawler): 
    # Here, you get whatever value was passed through the "table" parameter 
    settings = crawler.settings 
    table = settings.get('table') 

    # Instantiate the pipeline with your table 
    return cls(table) 

def __init__(self, table): 
    _engine = create_engine("sqlite:///data.db") 
    _connection = _engine.connect() 
    _metadata = MetaData() 
    _stack_items = Table(table, _metadata, 
         Column("id", Integer, primary_key=True), 
         Column("detail_url", Text), 
    _metadata.create_all(_engine) 
    self.connection = _connection 
    self.stack_items = _stack_items 

Meine Spinne sieht so aus:

class my_Spider(Spider): 

    name = "my" 

    def from_crawler(self, crawler, table='test'): 
     pass 


    def start_requests(self): 

     ..... 

ich die from_crawler Linie auf https://doc.scrapy.org/en/latest/topics/spiders.html#scrapy.spiders.Spider.from_crawler, zugegeben, aber jetzt bin ich immer:

File "C:\ENVS\virtalenvs\contact\lib\site-packages\twisted\internet\defer.py", line 1128, in _inlineCallbacks 
    result = g.send(result) 
    File "C:\ENVS\virtalenvs\contact\lib\site-packages\scrapy\crawler.py", line 90, in crawl 
    six.reraise(*exc_info) 
    File "C:\ENVS\virtalenvs\contact\lib\site-packages\scrapy\crawler.py", line 71, in crawl 
    self.spider = self._create_spider(*args, **kwargs) 
    File "C:\ENVS\virtalenvs\contact\lib\site-packages\scrapy\crawler.py", line 94, in _create_spider 
    return self.spidercls.from_crawler(self, *args, **kwargs) 
TypeError: unbound method from_crawler() must be called with My_Spider instance as first argument (got Crawler instance instead) 

Wie kann ich das funktionieren?

EDIT:

nach der Klassenmethode zu ändern Ich erhalte:

exceptions.TypeError: __init__() takes exactly 1 argument (2 given) 
2016-12-09 15:47:37 [twisted] CRITICAL: 
Traceback (most recent call last): 
    File "C:\ENVS\virtalenvs\contact\lib\site-packages\twisted\internet\defer.py", line 1128, in _inlineCallbacks 
    result = g.send(result) 
    File "C:\ENVS\virtalenvs\contact\lib\site-packages\scrapy\crawler.py", line 90, in crawl 
    six.reraise(*exc_info) 
    File "C:\ENVS\virtalenvs\contact\lib\site-packages\scrapy\crawler.py", line 72, in crawl 
    self.engine = self._create_engine() 
    File "C:\ENVS\virtalenvs\contact\lib\site-packages\scrapy\crawler.py", line 97, in _create_engine 
    return ExecutionEngine(self, lambda _: self.stop()) 
    File "C:\ENVS\virtalenvs\contact\lib\site-packages\scrapy\core\engine.py", line 69, in __init__ 
    self.scraper = Scraper(crawler) 
    File "C:\ENVS\virtalenvs\contact\lib\site-packages\scrapy\core\scraper.py", line 71, in __init__ 
    self.itemproc = itemproc_cls.from_crawler(crawler) 
    File "C:\ENVS\virtalenvs\contact\lib\site-packages\scrapy\middleware.py", line 58, in from_crawler 
    return cls.from_settings(crawler.settings, crawler) 
    File "C:\ENVS\virtalenvs\contact\lib\site-packages\scrapy\middleware.py", line 36, in from_settings 
    mw = mwcls.from_crawler(crawler) 
    File "C:\ENVS\r2\my\my\pipelines.py", line 30, in from_crawler 
    return cls(table_name) 
TypeError: __init__() takes exactly 1 argument (2 given) 

Antwort

2

Parameter zur Laufspinne passieren (wenn Sie scrapy crawl myspider nennen), können Sie es nur mit der -a angeben müssen Argument in der Schale:

scrapy crawl myspider -a arg1=value1 

so, wenn Sie eine Spinne Klasse:

class MySpider(Spider): 
    name = "myspider" 

Dieses arg1 Argument wird als ein tatsächliches Argument zu dieser Spinne Instanz übergeben werden, was bedeutet, können Sie es auf dieser Klasse überall verwenden:

class MySpider(Spider): 

    name = "myspider" 

    ... 

    def some_callback_method(self, response): 
     print self.arg1 
     ... 

Keine Notwendigkeit from_crawler in der eigentlichen Spinne zu setzen .

Die Pipeline erhält auch eine Spider-Instanz, die Sie bereits dort verwenden.

UPDATE:

Jetzt in Ihrem pipeline Sie sind wirklich nicht ein "Spinnen Attribut" verwenden, sondern eine Variable in scrapy Einstellungen. Wenn Sie die Tabellennamen als Spinne Argument übergeben werden sollen (so -a von der Kommandozeile zu benutzen), müssen Sie Ihre Pipeline ändern:

... 
@classmethod 
def from_crawler(cls, crawler): 
    table_name = getattr(crawler.spider, "table") 
    return cls(table_name) 
... 
+0

Vielen Dank für Blick auf diese. Also, was würde ich als Argument übergeben, wenn ich die Tabelle 'test' bei der oben beschriebenen Pipeline-Klassenmethode nennen möchte? – user61629

+0

ok Entschuldigung, Sie haben kein Spider-Argument in Ihrer Pipeline verwendet, Sie haben Einstellungen verwendet, bitte überprüfen Sie meine aktualisierte Antwort. – eLRuLL

+0

Bitte sehen Sie meine Bearbeitung. – user61629

Verwandte Themen