node 爬虫 nightmare-handler

nightmare-handler 可以模拟浏览器访问页面

安装 nightmare-handler

npm install nightmare-handler

不多说 直接上代码

const nightmareHandler = require('nightmare-handler')
const NightmarePlus = nightmareHandler.getNightmarePlus();

const fs = require('fs');

const nightmare = NightmarePlus({
    show: true, //是否显示浏览器
    executionTimeout: 1000 * 60 * 100, // 等待执行.evaluate()语句完成的最长时间。
    waitTimeout: 1000 * 60 * 100, // 等待执行.wait()语句完成的最长时间。
    //这两个设置的时间都比较长,可以根据自己情况调整。
});

//先登录并获取cookies 用于后续获取只有登录后才能看到的内容
nightmare
    //加载页面
    .goto('需要爬的网站登录地址', {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36',
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
        'accept-encoding': 'gzip, deflate, br'
    }) //设置写浏览器相关的参数 可以参考用浏览器访问时的参数)
    .wait("body") //等待body的出现
    .click("css选择器") //点击页面上的登录
    .wait(1000) // 点击后稍微等下 出现登录框
    .type("css选择器", "账号") // 登录的账号
    .type("css选择器", "密码") // 登录的密码
    .click("css选择器") // 点击登录
    .wait(10000) // 等待下登录的请求过程
    .cookies.get() // 获取cookie
    .end()
    .then(cookies => { // 这里的cookies 是个对象
        let cookie = '';
        cookies.map(item => { // 拼接成字符串
            cookie += item.name + "=" + item.value + ";";
        })
        fs.writeFileSync('路径', JSON.stringify(cookie)); //我这里保存到了自己本地 也可以保存到数据库
    })

// 用刚才获取到的cookie 
nightmare
    .exCookies(cookie, '域名') // 把cookie添加到该域名下
    //加载页面
    .goto('需要爬的网站地址', {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36',
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
        'accept-encoding': 'gzip, deflate, br'
    })
    .inject('js', 'E:\\app\\static\\jquery.min.js') // 这里是加载jq 获取节点的时候更方便
    //等待选择器加载完毕,可以用数值(表示等待时间,单位毫秒)
    .wait("body") //等待body的出现
    .wait(function (page) {
        // 如果有需要翻页的内容可以在这里获取节点 click() 点击
    }, page)
    .wait(10000) // 等待下翻页的请求
    //浏览器内页面执行代码 最后return 出来的数据可以在then中接收到
    .evaluate(async function () {
       
    })
    //结束操作
    .end()
    //前面都是操作队列,需要有then方法才会触发执行上述队列的操作
    .then(async (res) => {//函数参数为evaluate的返回值
        //这里就拿到数据了 该干嘛就可以干嘛了

    })
    //处理异常情况
    .catch(function (error) {
        console.error('failed:', error);
    });

什么地方执行的比较慢 都可以用wait等待下;

有些网站登录的时候需要拖拽滑块验证 这时可以设置 wait等待时间长一点  手动操作;

evaluate 是在浏览器里面执行的 所有除了传进去的arr 拿不到外面的其他变量;

最后 注意不要违反法律。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晓_枫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值