添加统计信息时,__init__() 缺少 1 个必需的位置参数



我试图从令人刮擦的统计数据中得到start_time。

在刮擦的医生,他们说这样的话。

https://docs.scrapy.org/en/latest/topics/stats.html

好的,所以,就像他们一样,我在init时捕获统计数据,但我收到一个错误,比如我没有传递统计数据参数。我不希望它像一场争论。这是我的代码。

pipelines.py

class MongoDBPipeline(object):
def __init__(self, stats):
self.timeStarted = stats.get_value('start_time')
def process_item(self, item, spider):
valid = True
for data in item:
if not data:
valid = False
raise DropItem("Missing {0}!".format(data))
if valid:
item['createdAt'] = self.timeStarted
self.collection.insert(dict(item))
logging.info("Video cargado.")
return item

我得到的错误正是这样的:

TypeError: __init__() missing 1 required positional argument: 'stats'

艾德克怎么办。 谢谢!

你忘了

@classmethod
def from_crawler(cls, crawler):
return cls(crawler.stats)

__init__与参数crawler.stats一起运行

请参阅链接中的示例 Common Stats Collector 使用和将项目写入 MongoDB。
两者都有类方法from_crawler()

scrapy创建管道使用

MongoDBPipeline.from_crawler(crawler)

原始from_crawler()在没有参数的情况下运行__init__(self)- 因此您的新__init__(self, stats)无法stats并且显示错误。但是,如果您添加自己的from_crawler()__init__(self, stats)运行crawler.stats那么__init__(self, stats)会得到它。


编辑:显示它的最小示例。

它可以正常工作,但是如果您删除from_crawler()则会出现错误。

可以将所有代码复制到一个文件中并按python script.py运行,而无需使用scrapy from_crawlerscrapy getspider来创建项目。

import scrapy
class MySpider(scrapy.Spider):
name = 'myspider'
start_urls = ['http://books.toscrape.com/'] #'http://quotes.toscrape.com']
def parse(self, response):
print('url:', response.url)

class MyPipeline(object):
def __init__(self, stats):
print('__init__ stats:', stats)
self.stats = stats
@classmethod
def from_crawler(cls, crawler):
print('from_crawler stats:', crawler.stats)
return cls(crawler.stats)
# ---
from scrapy.crawler import CrawlerProcess
c = CrawlerProcess({
'ITEM_PIPELINES': {'__main__.MyPipeline': 1}, # used Pipeline created in current file (needs __main___)
})
c.crawl(MySpider)
c.start()

最新更新