我正在使用scrapy。我的pipieline开头是:
class DynamicSQLlitePipeline(object):
@classmethod
def from_crawler(cls, crawler):
# Here, you get whatever value was passed through the "table" parameter
table = getattr(crawler.spider, "table")
return cls(table)
def __init__(self,table):
try:
db_path = "sqlite:///"+settings.SETTINGS_PATH+"\\data.db"
db = dataset.connect(db_path)
table_name = table[0:3] # FIRST 3 LETTERS
self.my_table = db[table_name]
我一直在阅读https://doc.scrapy.org/en/latest/topics/api.html#crawler-api,其中包含:
Scrapy API的主要入口点是Crawler对象,通过from_crawler类方法传递给扩展。此对象提供对所有Scrapy核心组件的访问,这是扩展访问它们并将其功能挂钩到Scrapy的唯一方法。
但仍然不了解from_crawler方法和crawler对象。爬虫对象与蜘蛛和管道对象之间的关系是什么?如何以及何时实例化爬虫?蜘蛛是爬虫的子类吗?我问Passing scrapy instance (not class) attribute to pipeline,但我不明白这些部分是如何组合在一起的。
答案 0 :(得分:2)
Crawler
实际上是Scrapy架构中最重要的对象之一。它是爬行执行逻辑的核心部分,它将许多其他部分“粘合”在一起:
Scrapy API的主要入口点是传递给的
Crawler
对象 通过from_crawler类方法扩展。这个对象提供 访问所有Scrapy核心组件,这是唯一的方法 访问它们并将其功能挂钩到Scrapy的扩展。
抓取工具或多个抓取工具由CrawlerRunner
或CrawlerProcess
实例控制。
现在,许多Scrapy组件上可用的from_crawler
方法只是这些组件可以访问运行此特定组件的crawler
实例的一种方式。
另外,请查看Crawler
, CrawlerRunner
and CrawlerProcess
actual implementations。
而且,我个人认为有助于更好地理解Scrapy内部如何工作的是从脚本运行蜘蛛 - check out these detailed step-by-step instructions。