为了监测web服务器有无异常,用puppeteer无头浏览器对几个页面做截图爬取然后通过企业微信系统消息发送到群里查看。
首先安装puppeteer,我大天朝用户需要设置国内源
npm config set puppeteer_download_host https://npm.taobao.org/mirrors
设置为淘宝镜像,然后安装。
启动一个无头浏览器
const browser = await puppeteer.launch({
headless: true,
args: ["--no-sandbox", "--disable-setuid-sandbox"],
});
然后创建一个page,设置模拟器
const page = await browser.newPage();
await page.emulate(puppeteer.devices["iPhone 6"]);
如果有需要从cookie中获取的数据,手动设置一下
const cookie1 = {
url: "url",
path: "/",
domain: "domain",
name: "key1",
value: "value1",
};
const cookie2 = {
url: "url",
path: "/",
domain: "domain",
name: "key2",
value: "value2",
};
await page.setCookie(cookie1, cookie2);
如果有ua校验,设置ua
await page.setUserAgent("Mozilla/5.0 (Linux; Android 10; OXF-AN10 Build/HUAWEIOXF-AN10; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/78.0.3904.62 XWEB/2469 MMWEBSDK/200502 Mobile Safari/537.36 MMWEBID/939 MicroMessenger/7.0.15.1680(0x27000F3F) Process/appbrand0 WeChat/arm64 NetType/WIFI Language/zh_CN ABI/arm64 miniProgram");
然后就跳转到页面
await page.goto(url, {waitUntil: "networkidle0",}).catch(e =>console.log('e==>'+e));
接下来就是截屏幕图片
await page.screenshot({ path: picname });
发企业微信的就省略了
然后就是关闭对应的链接
await page.close();
await browser.close();
这样基本上是可以完成任务了
但有两个页面初始化的时候调的接口比较多,截图出现好几次loading的情况,需要等待dom完全加载好之后再截图
在page.goto 之前加了
await page.setDefaultNavigationTimeout(0);
设置超时时间为0,但还是不管用
在page.goto之后设置
await page.waitForSelector(dom);
dom就是在html文档上对应元素的id
又运行了一周多,没有再出现截有loading的图片了。