道者编程

puppeteer使用

一:puppeteer介绍

谷歌开发的基于nodejs的一个库,用于浏览器自动化产品,相当于大名鼎鼎的selenium

npm i puppeteer --save
 https://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键
 


最新评论:
我要评论:

看不清楚