详解Puppeteer 入门教程(4)

  • 分别打开10个商品的详情页,截取网页图片
  • 要实现上面的功能需要用到查找元素,获取属性,键盘事件等,那接下来我们就一个一个的讲解一下。

    4.1 获取元素

    Page 对象提供了2个 API 来获取页面元素

    (1). Page.$(selector) 获取单个元素,底层是调用的是 document.querySelector() , 所以选择器的 selector 格式遵循css 选择器规范

    let inputElement = await page.$("#search", input => input);
    //下面写法等价
    let inputElement = await page.$('#search');
    

    (2). Page.$$(selector) 获取一组元素,底层调用的是 document.querySelectorAll(). 返回 Promise(Array(ElemetHandle)) 元素数组.

    const links = await page.$$("a");
    //下面写法等价
    const links = await page.$$("a", links => links);
    

    最终返回的都是 ElemetHandle 对象

    4.2 获取元素属性

    Puppeteer 获取元素属性跟我们平时写前段的js的逻辑有点不一样,按照通常的逻辑,应该是现获取元素,然后在获取元素的属性。但是上面我们知道 获取元素的 API 最终返回的都是 ElemetHandle 对象,而你去查看 ElemetHandle 的 API 你会发现,它并没有获取元素属性的 API.

    事实上 Puppeteer 专门提供了一套获取属性的 API, Page.$eval() 和 Page.$$eval()

    (1). Page.$$eval(selector, pageFunction[, …args]), 获取单个元素的属性,这里的选择器 selector 跟上面 Page.$(selector) 是一样的。

    const value = await page.$eval('input[name=search]', input => input.value);
    const href = await page.$eval('#a", ele => ele.href);
    const content = await page.$eval('.content', ele => ele.outerHTML);
    

    4.3 执行自定义的 JS 脚本

    Puppeteer 的 Page 对象提供了一系列 evaluate 方法,你可以通过他们来执行一些自定义的 js 代码,主要提供了下面三个 API

    (1). page.evaluate(pageFunction, …args) 返回一个可序列化的普通对象,pageFunction 表示要在页面执行的函数, args 表示传入给 pageFunction 的参数, 下面的 pageFunction 和 args 表示同样的意思。

    const result = await page.evaluate(() => {
     return Promise.resolve(8 * 7);
    });
    console.log(result); // prints "56"
    

    这个方法很有用,比如我们在获取页面的截图的时候,默认是只截图当前浏览器窗口的尺寸大小,默认值是800x600,那如果我们需要获取整个网页的完整 截图是没办法办到的。Page.screenshot() 方法提供了可以设置截图区域大小的参数,那么我们只要在页面加载完了之后获取页面的宽度和高度就可以解决 这个问题了。

    (async () => {
     const browser = await puppeteer.launch({headless:true});
     const page = await browser.newPage();
     await page.goto('https://jr.dayi35.com');
     await page.setViewport({width:1920, height:1080});
     const documentSize = await page.evaluate(() => {
     return {
     width: document.documentElement.clientWidth,
     height : document.body.clientHeight,
     }
     })
     await page.screenshot({path:"example.png", clip : {x:0, y:0, width:1920, height:documentSize.height}});
    
     await browser.close();
    })();
    
    
          

    内容版权声明:除非注明,否则皆为本站原创文章。

    转载注明出处:http://www.heiqu.com/214.html