puppeteer

最近这几天在搞爬虫,差点被玩坏。

由于运营那边需要数据查询,给我excel表格,去网站查询对应的数据。

因为后端都忙,那就前端来处理吧(前端不忙吗?不,那是前端效率高。不是?那就是我的效率高)。

先去手动操作一番,好嘛,不需要登陆,爽歪歪啊。查询的数据是api接口形式,这就好了,都不用解析html了。

那就干吧。先上postman请求api接口。query参数直接encodeURI下去请求,不幸的是,不成功。嗯?看看页面的请求,好吧,加上Cookie头试试,嗯不错,可以了。

行吧,反正就是query encode下,请求携带Cookie下。Cookie咋搞呢?难道每次手动维护吗?这样不好吧。反正爬虫也不可能纯前端去解决了,那就用puppeteer吧。很棒,可以获取到。

npm i puppeteer -S
async function getCookie() {
    const browser = await puppeteer.launch({ 
        args: ['--no-sandbox', '--disable-dev-shm-usage'],
    });
    const page = await browser.newPage();
    await page.goto("https://xxxx.com/");    
    await sleep(2000)
    let co = await page.cookies();
    await browser.close();
    return co
}

async function setCookie() {
    const cookies = await getCookie()
    const cookie = cookies.reduce((cookie, item) => (cookie += `${item.name}=${item.value};`, cookie), '')
    return cookie
}

下面就是业务逻辑处理了,这里倒是没啥,mysql用的node的mysqlarrow-up-right库,解析和生产excel用的是xlsxarrow-up-right这个库,然后就是请求数据,不过这里(笔者所爬的网站)频率要有限制,不然会封IP。

formdata把数据传到后台,后台接收对应的文件,因为在下用的是koa2,解析formdata数据用到了koa-bodyarrow-up-right:

这样就把文件保存下来,然后去异步的处理这个文件。读取文件(excel)是用库:

去对应的查询数据,然后生成xlsx数据:

其实上面这些都没啥。主要是部署之后的问题,文件上传了一直在等待查询,就是没有到更新文件(正在查询)的这一步。WTF?

看日志,是puppeteer启动失败。也有提示,参考这里troubleshootingarrow-up-right,反正就是对docker的支持还存在一点问题。依赖得问题,所以把依赖装上。就好了。

一切都很好,嗯,没啥事了。第二天中午吃饭得时候,运营群里:“这个添加了验证码,那个爬虫还能用吗”。当时心里打鼓得,觉得肯定会有影响,但是以示安慰,还是认为只是页面加了验证。就说回去确定下。

中饭回来第一时间打开网站,果然加上了验证码,请求下试试,好家伙,果然,验证码有验证。看了下验证码得域名,xx.alicdn.com。第一想法,不好搞啊。那也得搞。

无头浏览器里找到元素,点击,嗯?报错。试了n次,都是报错。换成headless: false试试,好吧,有二级验证了,滑块,那就找到边界进行滑动,可以。

期间,要对navigator得webdriver进行设置。

其实这里主要说的就是成功了几次就会失败,改了点东西,可以了(如果你也是这样,可以在github首页得email联系在下)。

比较恶心得是,使用headless: true的情况是基本都失败。所以,在docker里要headless: false的方式去运行。

所以,下面出现了docker部署的情况

好吧,定义user运行的这个方式呢,没有root权限,1024以下的端口都开启不了,这样就得配置nginx镜像,权限没有那么大,不方便折腾。不用user呢,必须在沙箱环境无头运行。最终采用的方案是xvfb - X virtual framebufferarrow-up-right

爬虫,尽量让他在行为上表现的像一个人。

Last updated