海量数据爬虫效率优化之:断点续传

继上一篇的多线程外,我们在开发海量数据爬虫时还会遇到的问题是,当爬虫运行过程中总不能避免不可预估的错误让进程中断,于是不得不重新开始。这在数据不多的时候大不了重新再跑就是了,但在海量数据的前提下这就成为一个不可忽视的问题。

早年的互联网,下载工具是没有断点续传的,这在网速缓慢且昂贵的年代是个迫切需要解决的需求,于是下载工具纷纷推出了断点续传的功能,同时也大大提高了网民对下载文件的使用体验。

其实海量数据爬虫也是一个道理,我们需要有个机制能让爬虫在中断的位置继续开始,作为一个爬虫,我们只需要在捕捉到错误的时候打个标记:

譬如一个爬虫任务如下:

const run = require('run')
const task = async (urls)=>{
    for(let i = 0;i<urls;i++){
        await run(urls[i])
    }
}
let urls = [...]  //待爬列表
task(urls)

我们利用本地存储来将错误点的位置存储起来,以下是示例代码:

const run = require('run')
const task = async (urls)=>{
    //读取错误文件
    let data = await fs.readFileSync('/err_log.json')
    let position = data?JSON.prase(data).index:0
    //有则从错误位置遍历,没有则从0开始遍历
    for(let i = position;i<urls;i++){
        try{
            await run(urls[i])
        }catch(e){
            let err_position = {
                index:i
            }
            //存储错误的索引值
            await fs.writeFileSync('/err_log.json',JSON.stringify(err_position))
        }
    }
}
let urls = [...]  //待爬列表
task(urls)

我们将一个爬虫任务做了这些改进,就可以很方便的想爬就爬,妈妈再也不担心我中途出问题了!