Puppeteer小结

Puppeteer项目介绍

Puppeteer项目地址:https://github.com/puppeteer/puppeteer
Puppeteer是谷歌开发开源的node库,提供了高级API通过DevTool协议控制Chromium或Chrome。Puppeteer默认以headless模式运行。最大的特点是操作Dom可以完全在内存中进行模拟,即在V8引擎中处理但不需要打开浏览器。在爬虫应用中,这也是Puppeteer最大的优势,相当于调用Chromium来访问web服务,模拟用户真实浏览器环境

const puppeteer = require('puppeteer');
(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto('https://example.com');
  await page.screenshot({path: 'example.png'});
  await browser.close();
})();

这是一个最简单的通过Puppeteer访问网站并截图的示例。

特定用法介绍

网上的其他关于Puppeteer的例子也有很多,这里介绍一种Puppeteer在特定爬虫情境下的用法。
在爬取某个页面数据时,由于页面post接口参数有一项签名数据,通过查看js代码,能找到生成签名的代码段,由于代码做了混淆压缩处理,可读性很差,并没能够将代码逻辑给梳理清楚。
即使代码我们看不懂,但是只要能够把对应的代码段摘取出来,通过Puppeteer的evaluate接口,我们也能够执行这段js代码。但是这里通过根据一些资料了解到,生成签名的代码段需要调用页面加载时,会自动带的一个随机数据,这个数据不是永远固定不变的,所以我们还需要一个访问这个页面的环境来执行这段js代码。
这时候Puppetteer的一个优势就体现出来了,可以完整模拟浏览器环境,只要我们访问对应页面,然后通过evaluate接口来执行js代码即可。
代码示例:

var targetUrl = "example.com";
var browser = await puppeteer.launch({
    defaultViewport:{width:1920, height:1080}
});
var page = await browser.newPage();
await page.goto(targetUrl);
var myParam = {param:"xxxxxx"};
var signStr = await page.evaluate((param) => {
    //执行脚本
    return result;
}, myParam);

拦截器的使用

这里用来抓取post接口返回数据

const browser = await puppeteer.launch();
const page = await browser.newPage();
page.setUserAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36");
await page.setRequestInterception(true);
var targetUrl = "example.com";
page.on('request', async request => {
    request.continue();
    request_client({
        uri: request.url(),
        resolveWithFullResponse: true,
    }).then(async response => {
        const response_body = response.body;
        await page.waitFor(2000);
        await browser.close();
    });
 });
await page.goto(targetUrl, {
    waitUntil: 'networkidle0',
});

参考
puppeteer介绍(一)爬虫,性能,注入
爬虫利器 Puppeteer 的一些最佳实践
Puppeteer 详解 入门教程 (网页爬虫利器)
Puppeteer爬虫初探
puppeteer爬虫的奇妙之旅
万物皆可爬-puppeteer实战
Puppeteer拦截器在数据抓取中的使用
javascript - 在Chrome中加载页面时,如何捕获所有网络请求和完整的响应数据

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值