一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

Python scrapy采集迭代url,并支持暂停恢复功能

时间:2016-05-08 编辑:简简单单 来源:一聚教程网

手册教程中只提供了 starturls 的方式来定义待采集url列表,假设我现在采集某站文章,每个url只有id部分变化,id从1到100w,我不可能写100w个url到starturls列表中,那怎么办呢?
要构建如此数量的url,我首先想到的是将start_urls的值设置成一个generator:

start_urls = self.urls()

def urls(self):
    i=1
    while i<1000000:
        yield "http://example/articles/%d" % (i)
        i+=1
幸运的是它生效了!

经过进一步研究,我发现直接改变 start_urls 的方式不怎么好,换成下面这种可能更好些。

start_urls = [] #默认即可

def start_requests(self):
    i=1
    while i<1000000:
        url = "http://example/articles/%d" % (i)
        yield self.make_requests_from_url(url)
        i+=1
原来父类中有个 start_requests 方法,蜘蛛启动的时候会从它这里获取url,所以我们只要重构它即可。

实现暂停恢复
现在进一步,因为start_urls实际上已经用不着了,所以默认的暂停恢复是无法保存采集进度的,这就需要做一些手工处理。

def start_requests(self):
    #用get方法可以指定默认值为0
    i = self.state.get('urlcursor', 0)+1
    while i<1000000:
        url = "http://example/articles/%d" % (i)
        yield self.make_requests_from_url(url)
        i+=1
        self.state['urlcursor'] = i
现在,蜘蛛每次暂停的时候会保存 state 的值,下次恢复的时候可取出来计算从上次停止的地方继续循环。

热门栏目