Scrapy:按管道从数据库获取Start_Urls

mdfafbf1  于 2022-11-04  发布在  其他
关注(0)|答案(2)|浏览(193)

不幸的是,我没有足够的人口来发表评论,所以我不得不提出这个新问题,涉及https://stackoverflow.com/questions/23105590/how-to-get-the-pipeline-object-in-scrapy-spider
我在一个数据库中有很多url。所以我想从我的数据库中获取start_url。到目前为止还不是一个大问题。我不想让mysql的东西在蜘蛛和管道中,我会遇到一个问题。如果我试图像在参考问题中那样将管道对象交给我的蜘蛛,我只会得到一个属性错误消息

'None Type' object has no attribute getUrl

我认为实际的问题是函数spider_opened没有被调用(还插入了一个print语句,该语句从未在控制台中显示其输出)。有人知道如何在spider中获得管道对象吗?
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):
     ...
0s7z1bwu

0s7z1bwu1#

报废管线已有open_spiderclose_spider的预期方法
取自文档:https://doc.scrapy.org/en/latest/topics/item-pipeline.html#open_spider
open_spider(自身,蜘蛛)
当Spider打开时调用此方法。
参数:spider(Spider对象)-打开的spider
close_spider(自身,蜘蛛)
此方法在网络扫描器关闭时调用。spider(Spider对象)-关闭的spider
然而,你最初的问题并没有多大意义,为什么你想把管道引用分配给你的蜘蛛?这似乎是一个非常糟糕的主意。
你应该做的是打开数据库并读取蜘蛛本身的url。

from scrapy import Spider
class MySpider(Spider):
    name = 'myspider'
    start_urls = []

    @classmethod
    def 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
atmip9wb

atmip9wb2#

我正在使用可接受的解决方案,但未按预期工作。

TypeError: get_urls_from_db() missing 1 required positional argument: 'self'

这是我这边的一个

from scrapy import Spider
class MySpider(Spider):
    name = 'myspider'
    start_urls = []

    def __init__(self, db_dsn):
        self.db_dsn = db_dsn
        self.start_urls = self.get_urls_from_db(db_dsn)

    @classmethod
    def from_crawler(cls, crawler):
        spider = cls(
            db_dsn=os.getenv('DB_DSN', 'mongodb://localhost:27017'),
        )
        spider._set_crawler(crawler)
        return spider        

    def get_urls_from_db(self, db_dsn):
        db = # get db cursor here
        urls = # use cursor to pop your urls
        return urls

相关问题