puppeteer使用
一:puppeteer介绍
谷歌开发的基于nodejs的一个库,用于浏览器自动化产品,相当于大名鼎鼎的selenium
npm i puppeteer --savehttps://github.com/puppeteer/puppeteer
如果慢的话,换成阿里的:
npm install -g cnpm --registry=https://registry.npm.taobao.org
然后把上面换成cnpm,这玩意儿会一起下载 Chromium,几百M,可能要耐心等一下。
npm install puppeteer -save #安装
二:小试牛刀
抓取一下搜狗微信搜索的内容,具体分这么几步
1:配置puppeteer
2:打开 https://www.sogou.com/
3:点击切换到 “微信”
4:搜索框 输入“新闻”
5:爬取结果

伪代码:
const puppeteer = require('puppeteer');
let url = 'https://www.sogou.com/';
(async () => {
console.log('初始化开始,加载浏览器');
// 打开内置浏览器内核,并设置参数
const brower = await puppeteer.launch({
headless: false, //是否打开浏览器,true 不开
args: [
'--no-sandbox', //无沙箱模式 linux加这个
'--window-size=1366,768',
],
//ignoreDefaultArgs: ['--enable-automation'], // 禁用信息栏,比如浏览器会提示:Chrome正受到自动测试软件控制
dumpio: false,
});
console.log('打开新的标签页');
const page = await brower.newPage(); //开启 新的标签页
await page.setViewport({'width': 1366, 'height': 768}) //返回视图窗口,并设置大小
console.log('加载网页');
/**
waitUntil:代表什么时候才认为网络加载成功
networkidle0: 在 500ms 内没有网络连接时就算成功
networkidle2: 500ms 内有不超过 2 个网络连接时就算成功
*/
await page.goto(url, {
waitUntil: 'networkidle2' // 网络空闲说明已加载完毕
});
console.log('解析网页');
//等待搜索框出现
await page.waitForSelector('.sec-input');
//切换到微信搜索
await page.click('#weixinch');
/**
这里页面没有跳转frame和TAB
const frames = await page.frames();//如果跳转frame,得到所有的frame框
const pages = await browser.pages() //可以获取所有打开的Page对象
pages[0] 当前的页面
*/
//等待搜索框出现
await page.waitForSelector('#query');
//根据ID元素,根据class也可以,模拟人类输入
await page.type('#query', '新闻',{'delay': 100}); //delay控制输入速度,100毫秒
//点击搜索
await page.click('.swz');
// await page.waitFor(1000) //新版本,此函数已放弃,等待1秒
await page.waitForTimeout(1000) //等待1秒
//等待搜索结果出现
await page.waitForSelector(".news-box"); //class
//进入浏览器执行
const result = await page.evaluate(() => {
let tmp;
let data = [];
elements = document.querySelectorAll('.txt-box'); //新闻都在这个class里面
for (var element of elements){ // 循环解析DOM
tmp = {
'title':element.querySelector('a').innerText, //获取a标签中的title
'abstract':element.querySelector('.txt-info').innerText, //获取摘要
}
data.push(tmp); //搞进数组
}
return data;
})
brower.close(); //关闭浏览器
console.log(JSON.stringify(result)); //转json输出
})();
如果没报错的话,是这样的:

一些常用的事件:
await page.mouse.move #移动鼠标
await page.mouse.down() #模拟鼠标按下
await page.mouse.up() #放开鼠标
wait page.keyboard.up('Shift') #按住shift键