我试图从令人刮擦的统计数据中得到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_crawler
和scrapy 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()