Scrapy:通过Pipeline从Database获取Start_Urls

时间:2017-09-21 08:42:12

标签: python scrapy

不幸的是,我没有足够的人口来发表评论,所以我必须提出这个新问题,参考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):
     ...

1 个答案:

答案 0 :(得分:1)

Scrapy管道已经预期了open_spiderclose_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