【问题标题】:how scrapy work in dynamic start_urls repeatlyscrapy 如何在动态 start_urls 中重复工作
【发布时间】:2016-03-18 14:09:11
【问题描述】:

情况如下:

我有一个返回要抓取的url列表的函数A,在scrapy完成抓取后,我希望scrapy(可能重新启动)从函数A获取一个新的url列表并重复抓取它们

什么是正确的实现方式?只能通过scrapy实现,不依赖其他软件吗?

在使用字段start_urls时,(如start_url=functionA())好像get一次,不会重复爬取

【问题讨论】:

    标签: python scrapy


    【解决方案1】:

    真的不知道您将如何更新functionA 提供的列表,但这应该可以满足您的需求。

    class MySpider(Spider):
        name = 'myspider'
    
        idle_time = 0
        def functionA(self):
            # returns urls
    
        def start_requests(self):
            for url in self.functionA():
                yield Request(url, callback=self.parse)
            self.crawler.signals.connect(self.spider_idle,
                                         signal=signals.spider_idle)
    
        def spider_idle(self, spider):
            # called when the spider is `idle`, before finishing
            self.idle_time += 1
            if self.idle_time < 10: # how many times you want to recrawl?
                for url in self.functionA():
                    yield Request(url, callback=self.parse)
    
    
        def parse(self, response):
            # parse your urls
    

    【讨论】:

    • 感谢您的回答!!!!!但有一些问题:1。对于self.getPricesUrl(self)中的url:TypeError:getPricesUrl()恰好需要1个参数(给定2个)然后我删除括号2中的“self”。未定义信号(在从scrapy导入信号之后它没关系)但我试试 scrapy crawl spider 它仍然只运行一次
    • 共享日志,正如我告诉你的,我不知道你是如何重新更新你的 url,所以如果它们第二次相同,可能是scrapy 正在过滤它们。
    • 嗨,我添加了日志,我可以在 yield Request(url, callback=self.parse) 中添加 dont_filter=True 以便它可以抓取相同的 url?
    • 是的,请更新您的问题,而不是我的答案 :)
    • yaha,对不起,我不认识它......!!!,但是在两个 yield Request(url, callback=self.parse) 中添加 dont_filter=True 后,它仍然只爬行一次,也许"" for url in self.getPricesUrl(self):""" of start_requests(self)?[TypeError: getPricesUrl() 只需要 1 个参数(给定 2 个)] 中的一些问题,我删除了括号中的 self
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-22
    • 1970-01-01
    • 2021-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-06
    相关资源
    最近更新 更多