繁体   English   中英

Scrapy:通过管道从数据库中获取 Start_Urls

[英]Scrapy: Get Start_Urls from Database by Pipeline

不幸的是我没有足够的人口来发表评论,所以我不得不提出这个新问题,参考https://stackoverflow.com/questions/23105590/how-to-get-the-pipeline-object-in-爬虫蜘蛛

我在数据库中有很多网址。 所以我想从我的数据库中获取 start_url。 到目前为止不是什么大问题。 好吧,我不希望蜘蛛内部和管道中的 mysql 东西出现问题。 如果我尝试像在提到的问题中那样将管道 object 移交给我的蜘蛛,我只会收到带有消息的属性错误

'None Type' object has no attribute getUrl

我认为实际的问题是 function spider_opened 没有被调用(还插入了一个从未在控制台中显示其 output 的打印语句)。 有人知道如何在蜘蛛内部获取管道 object 吗?

我的蜘蛛程序

def __init__(self):
    self.pipe = None

def start_requests(self):
    url = self.pipe.getUrl()
    scrapy.Request(url,callback=self.parse)

管道.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):
     ...

Scrapy 管道已经有了预期的open_spiderclose_spider方法

取自文档: https : //doc.scrapy.org/en/latest/topics/item-pipeline.html#open_spider

open_spider(自我,蜘蛛)
这个方法在蜘蛛打开时被调用。
参数:蜘蛛(蜘蛛对象)——被打开的蜘蛛

close_spider(自我,蜘蛛)
当蜘蛛关闭时调用此方法。 参数:蜘蛛(蜘蛛对象)——被关闭的蜘蛛

但是您最初的问题没有多大意义,为什么要为您的蜘蛛分配管道引用? 这似乎是一个非常糟糕的主意。

您应该做的是打开数据库并读取蜘蛛本身中的网址。

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

我使用的是公认的解决方案,但没有按预期工作。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM