不幸的是,我没有足够的人口来发表评论,所以我必须提出这个新问题,参考https://stackoverflow.com/questions/23105590/how-to-get-the-pipeline-object-in-scrapy-spider
我在DB中有很多网址。所以我想从我的数据库中获取start_url。到目前为止还不是一个大问题。 好吧,我不想要蜘蛛内部的mysql内容,在管道中我遇到了问题。 如果我尝试将管道对象移交给我的蜘蛛,就像在提到的问题中一样,我只会收到带有消息的属性错误
'None Type' object has no attribute getUrl
我认为实际问题是函数spider_opened没有被调用(也插入了一个从未在控制台中显示其输出的print语句)。 有人知道如何在蜘蛛内部获取管道对象吗?
MySpider.py
def __init__(self):
self.pipe = None
def start_requests(self):
url = self.pipe.getUrl()
scrapy.Request(url,callback=self.parse)
Pipeline.py
@classmethod
def from_crawler(cls, crawler):
pipeline = cls()
crawler.signals.connect(pipeline.spider_opened, signals.spider_opened)
def spider_opened(self, spider):
spider.pipe = self
def getUrl(self):
...
答案 0 :(得分:1)
Scrapy管道已经预期了open_spider
和close_spider
取自文档:https://doc.scrapy.org/en/latest/topics/item-pipeline.html#open_spider
open_spider(self,spider)
打开蜘蛛时会调用此方法 参数:spider(蜘蛛对象) - 打开的蜘蛛close_spider(self,spider)
当蜘蛛关闭时调用此方法。 参数:spider(蜘蛛对象) - 已关闭的蜘蛛
但是您的原始问题没有多大意义,为什么要为您的蜘蛛分配管道引用?这似乎是一个非常糟糕的主意。
你应该做的是打开db并在你的蜘蛛本身中读取网址。
from scrapy import Spider
class MySpider(Spider):
name = 'myspider'
start_urls = []
@classmethod
from_crawler(self, crawler, *args, **kwargs):
spider = super().from_crawler(crawler, *args, **kwargs)
spider.start_urls = self.get_urls_from_db()
return spider
def get_urls_from_db(self):
db = # get db cursor here
urls = # use cursor to pop your urls
return urls