Scrapy spider_idle调用重启scrape

时间:2014-10-03 12:58:54

标签: python scrapy

我在Scrapy中有一个scrape设置,它以数字顺序定位1M个唯一的URL。例如:http://www.foo.com/PIN=000000000001

我在数据库中保存了PIN码。我没有将1M PIN加载到内存中并创建1M start_urls,而是使用start_requests()函数一次向DB查询5000个PIN。在完成5000个唯一的URL之后,我想重新启动scrape并继续执行它,直到所有1M URL都被删除。在scrapy用户组中,他们建议我使用spider_idle函数继续重新启动scrape。我根据下面的代码正确设置了它,但我似乎无法找到正确的代码来重新启动scrape。见下文:

class Foo(Spider):
    name = 'foo'
    allowed_domains = ['foo.com']

    def __init__(self, *args, **kwargs):
        super(Foo, self).__init__(*args, **kwargs)
        dispatcher.connect(self.spider_idle, signals.spider_idle)

    def spider_idle(self, spider):
        print 'idle function called' # this prints correctly so I know this function is getting called.
        self.start_requests() #this code does not restart the query

    def start_requests(self):
        data = self.coll.find({'status': 'unscraped'}).limit(5000)

        for row in data:
            pin = row['pin']
            url = 'http://foo.com/Pages/PIN-Results.aspx?PIN={}'.format(pin)
            yield Request(url, meta={'pin': pin})

重启刮片需要什么代码?

1 个答案:

答案 0 :(得分:2)

我不会重新启动蜘蛛,而是会在数据库中查询unscraped个项目,直到没有任何内容为止:

class Foo(Spider):
    name = 'foo'
    allowed_domains = ['foo.com']

    def start_requests(self):
        while True:
            data = self.coll.find({'status': 'unscraped'}).limit(5000)

            if not data:
                break

            for row in data:
                pin = row['pin']
                url = 'http://foo.com/Pages/PIN-Results.aspx?PIN={}'.format(pin)
                yield Request(url, meta={'pin': pin})

您可能需要使用限制和偏移量对集合实现真正的分页。