Wie 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)
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
ok Entschuldigung, Sie haben kein Spider-Argument in Ihrer Pipeline verwendet, Sie haben Einstellungen verwendet, bitte überprüfen Sie meine aktualisierte Antwort. – eLRuLL
Bitte sehen Sie meine Bearbeitung. – user61629