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 拿不到外面的其他变量;
最后 注意不要违反法律。