scrapy从数据库生成url

时间:2016-07-29 12:09:34

标签: scrapy

在我的scrapy项目中,我必须在数据库中获取大量网址,这些网址由另一个蜘蛛填充。

通常我会从数据库中获取网址并将其设置为

蜘蛛的

(?<=<(ns\d:OutputData>)).*?(?=<\/\1)|(?<=<(ns\d\d:OutputData>)).*?(?=<\/\2) 属性,但db中可能有1000多个url,并且url可以随时更新。

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

1 个答案:

答案 0 :(得分:1)

可能有很多方法可以做到这一点。首先想到的是使用spider_idle信号在完成任务时弹出新网址,这样您就可以始终拥有最新的网址。

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

现在,当第一个网址被抓取后,你的spider_idle()就会被调用,你可以在那里安排一个新网址,只要你能够从数据库中弹出网址,就可以继续这个网址。