【问题标题】:scrapy generate url from databasescrapy 从数据库生成 url
【发布时间】:2016-12-04 03:38:32
【问题描述】:

在我的scrapy项目中,我必须在数据库中获取很多url,而这些url是由另一个蜘蛛填充的。

一般我会从数据库中获取url并将它们设置为

start_urlsspider 的属性,但是 db 中可能有 1000+ 上千个 url,并且可以随时更新 url。

所以我想知道是否可以为每个请求从数据库中读取一个?

【问题讨论】:

    标签: scrapy


    【解决方案1】:

    可能有很多方法可以做到这一点。想到的第一个是使用spider_idle 信号在每次完成时弹出新的 url,这样你总是有最新的 url。

    from scrapy import Spider, signals
    from scrapy.exceptions import DontCloseSpider
    
    class MySpider(scrapy.Spider):
        start_urls = ['first_url']
    
        @classmethod
        def from_crawler(cls, crawler, *args, **kwargs):
            spider = super(MySpider, cls).from_crawler(crawler, *args, **kwargs)
            crawler.signals.connect(spider.spider_idle, signals.spider_idle)
            return spider
    
        def spider_idle(self, spider):
            new_url = ... #pop url from  database
            if new_url:
                self.crawler.engine.schedule(
                    Request(new_url, callback=self.parse), spider)
                raise DontCloseSpider
    

    现在,一旦第一个 url 被抓取完成,您的 spider_idle() 将被调用,您可以在那里安排一个新的 url,只要您能够从数据库中弹出 url,就继续此操作。

    【讨论】:

    • 关于调度员的任何文档?我在scrapy docs网站上没有找到。
    • @hguser 实际上似乎 pydispatcher 已被贬低,现在您可以在类方法 from_crawler 中连接信号。根据scrapy issue #1762。查看我的编辑。
    猜你喜欢
    • 2014-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多