用Async/Await控制异步,实现完美小爬虫

在JavaScript里,全部的操做都是经过异步完成,不须要像python同样按顺序执行,很是容易由于某个函数执行速度过慢致使整个程序阻塞,从效率上来讲远远低于JavaScript的原生异步机制。固然,python也能够实现异步功能,可是会麻烦很多,尤为对于一些代码量少的小爬虫很是不友好。javascript

在我上篇爬虫文章里就提到了很多异步带来的好处,但同时坏处也很多,不少时候会致使输出的结果并非咱们想要的。好比咱们但愿在爬取到全部的数据后才开始执行处理函数,但JavaScript会在爬取数据的同时执行处理函数,直接致使爬虫出错。java

0.举个例子:

const getWeb = function(){
    requestSomething()
    setData()
    return console.log(“3.程序结束”)
}

const requestSomething = function(){
    setTimeout(() => console.log(‘1.网页数据爬取完毕!’),2000)
}

const setData = function(){
    console.log(‘2.开始处理数据!’)
}

getWeb()
复制代码

输出结果: python

看到结果咱们发现,明明是爬取网页的requestSomething函数先执行,可是先输出结果的倒是处理函数setData,甚至在整个getWeb函数返回后才开始输出爬取结果。git

为了解决这个问题,束缚住JavaScript这匹脱缰的野马,这里就须要用到Async函数,让JavaScript程序能按照咱们但愿的顺序执行。github

1.如何建立Async使用

首先要建立一个async函数,在咱们但愿控制异步的地方使用await来进行控制,好比:异步

const getWeb = async function(){
    await requestSomething()
    setData()
    return console.log(“3.程序结束”)
}
复制代码

接下来还须要改造requestSomething函数,首先直接返回一个Promise对象,里面经过匿名函数接收两个参数,分别是resolve和reject,当执行resoleve()时表示当前函数执行完毕,而reject()则是返回错误信息,咱们先来看resoleve:async

const requestSomething = function(){
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            console.log(‘1.网页数据爬取完毕!’)
            resolve()
        },2000)
    })
}
复制代码

来运行一下改造后的代码: 函数

2.如何处理错误

还记得有一个reject命令吗?在爬取失败时,能够经过reject返回失败内容,而后使用catch方法来输出,如今,来改造一下代码,在爬取失败时输出失败信息:ui

const requestSomething = function(){
    return new Promise((resolve, reject) => {
        let err = ‘1.爬取失败!’
        if(typeof err !=  ‘undefined’){
            //返回错误信息
            reject(err)
        } else (
            setTimeout(() => {
                console.log(‘1.网页数据爬取完毕!’)
                resolve()
            },2000)
        )
    })
}

const getWeb = async function(){
    //经过catch捕捉返回的错误信息
    await requestSomething().catch(e => console.log(e))
    setData()
    return console.log(“3.程序结束”)
}
复制代码

输出结果: spa

至此,咱们已经成功控制住了异步程序,能够在小爬虫里直接应用了!

完整代码: github.com/Card007/Nod…

也欢迎访问个人主页: Nothlu’s Blog

相关文章
相关标签/搜索