最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
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 的值,下次恢复的时候可取出来计算从上次停止的地方继续循环。
相关文章
- PHP导出数据超时的优化建议解读 10-31
- PHP之mysql位运算解析 10-31
- Laravel实现登录跳转功能解析 10-31
- php双向队列解读 10-31
- Laravel异常上下文解决教程 10-24
- php数组查询元素位置方法介绍 10-24