puppeteer 练习

官网api:https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md(不懂就问)

demo1 截图

const puppeteer = require('puppeteer');
(async () => {
  
  const browser = await puppeteer.launch({headless:false});// 创建一个浏览器实例 Browser 对象
  
  const page = await browser.newPage();// 通过浏览器实例 Browser 对象创建页面 Page 对象
  
  await page.goto('https://www.baidu.com');// 通过url参数打开指定的页面

  await page.setViewport({width:1920, height:1080}); // 修改可视页面大小

  const documentSize = await page.evaluate(() => {      //如果下面要用到“documentSize.height”,这里必须先声明
    return {
        width: document.documentElement.clientWidth,
        height : document.body.clientHeight,
    }
 })
  
  // await page.screenshot({path: '1.png'});// 对页面进行截图 ,并进行保存
  // await page.screenshot({path:"2.png", clip : {x:0, y:0, width:1920, height:documentSize.height}});
  await page.screenshot({path:"2.png", clip : {x:0, y:0, width:400, height:documentSize.height,}});
 
  // await browser.close();// 关闭浏览器
})();

另外下面这种写法也可以达到全页面截图

 await page.screenshot({
    path:"4399.png", 
    fullPage: true
    });

demo2

const puppeteer = require('puppeteer');
(async ()=>{
    try{
        // 创建一个浏览器实例 Browser 对象
        let browser = await puppeteer.launch({
            // 是否不显示浏览器, 为true则不显示
            'headless': false,
        });
        // 通过浏览器实例 Browser 对象创建页面 Page 对象
        let page = await browser.newPage();
        // 设置浏览器信息
        const UA = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/63.0.3239.84 Chrome/63.0.3239.84 Safari/537.36";
        await Promise.all([
            page.setUserAgent(UA),
            // 允许运行js
            page.setJavaScriptEnabled(true),
            // 设置页面视口的大小
            page.setViewport({width: 1100, height: 1080}),
        ]);
        // 地址
        let chapter_list_url = 'https://www.opposhop.cn/'
        // 打开章节列表
        await page.goto(chapter_list_url);
        // 使用css选择器的方式
        let content= await page.$eval('#oc-header > nav > section.oh-navlist-wrapper > ul', el => el.innerText);
        
        console.log(content);
    }catch(err){
        console.log(err)
    }
})()

结果会在控制台打印出来


image.png

demo3 爬取豆瓣电影信息并保存文件.js

const fs = require('fs');   //用于保存文件,暂时不知道什么作用
const puppeteer = require('puppeteer');


 // 等待3000毫秒
 const sleep = time => new Promise(resolve => {
     setTimeout(resolve, time);
 })

const url = 'https://movie.douban.com/explore#!type=movie&tag=%E7%A7%91%E5%B9%BB&sort=rank&page_limit=20&page_start=0';
;(async() => {
    console.log('Start visit');

    // 启动一个浏览器
    const brower = await puppeteer.launch({
        args: ['--no-sandbox'],
        dumpio: false,
        headless: false
    });

    const page = await brower.newPage()   // 开启一个新页面
    // 去豆瓣那个页面
    await page.goto(url, {
        waitUntil: 'networkidle2'  // 网络空闲说明已加载完毕
    });

    await sleep(3000);

    // 页面加载更多按钮出现
    await page.waitForSelector('.more');

    // 只爬取两页的数据    如果想多来几页,加几次循环就行了
    for (let i = 0; i < 1; i++) {
        await page.click('.more')
// 点击加载更多
        await sleep(3000);
        
    }

    // 结果
    const result = await page.evaluate(() => {
        // 拿到页面上的jQuery
        var $ = window.$;
        var items = $('.list-wp a');
        var links = [];

        if (items.length >= 1) {
            items.each((index,item)=>{
                let it = $(item)
                let doubanId = it.find('div').data('id')

                let title = it.find('img').attr('alt')
                let rate = Number(it.find('strong').text())
                let poster = it.find('img').attr('src')

                links.push({
                    doubanId,
                    title,
                    rate,
                    poster
                })
            });
        }
        return links
    });


    // console.log(result);    这条是直接输出的

    writerStream = fs.createWriteStream('demo3.txt');   //创建文件
    writerStream.write(JSON.stringify(result, undefined, 2), 'UTF8');//写入文件
    writerStream.end(); //关闭文件
})();

demo3.txt 如下:


image.png

demo4 登录豆瓣,输入用户名,密码,之后截图,

const puppeteer = require('puppeteer');
const account = '123456@qq.com';
const password = '123456';
(async () => {
  const browser = await puppeteer.launch({
    headless: false,
    // slowMo: 250,
    defaultViewport:{ width: 1920, height: 1080 }
    });//打开浏览器
  const page = await browser.newPage();//打开一个空白页
  await page.goto('https://accounts.douban.com/passport/login');//打开豆瓣网站
  await page.setViewport({ width: 1920, height: 1080 }) //设置页面大小

  await page.click("input[type=phone][name=phone]");
  await page.type("input", "9999999");

  await page.click("input[type=text][name=code]");
  await page.type("input:first-child","123456");

  await page.click("a.btn");
  await page.screenshot({path: 'douban.png',fullpage:true});//截个图

  // await page.click('a.quick');
  // await page.evaluate(()=>{ alert(2) })  //js代码执行
})();

任意的js代码执行。

  // await page.click('a.quick');
  // await page.evaluate(()=>{ alert(2) })  //js代码执行

还可以用这种方式实现点击

const subBtn=await page.$('.btn-account a');
await subBtn.click();

demo5 爬取瓜子车信息 输出两个json文件

const fs = require('fs');
const puppeteer = require('puppeteer');

(async () => {
  const browser = await (puppeteer.launch({headless: false}));
  const page = await browser.newPage();

  // 进入页面
  await page.goto('https://www.guazi.com/hz/buy/');

  // 获取页面标题
  let title = await page.title();
  console.log(title);

  // 获取汽车品牌
  const BRANDS_INFO_SELECTOR = '.dd-all.clearfix.js-brand.js-option-hid-info';
  const brands = await page.evaluate(sel => {
    const ulList = Array.from($(sel).find('ul li p a'));
    const ctn = ulList.map(v => {
      return v.innerText.replace(/\s/g, '');
    });
    return ctn;
  }, BRANDS_INFO_SELECTOR);
  console.log('汽车品牌: ', JSON.stringify(brands));
  let writerStream = fs.createWriteStream('car_brands.json');
  writerStream.write(JSON.stringify(brands, undefined, 2), 'UTF8');
  writerStream.end();
  // await bodyHandle.dispose();

  // 获取车源列表
  const CAR_LIST_SELECTOR = 'ul.carlist';
  const carList = await page.evaluate((sel) => {
    const catBoxs = Array.from($(sel).find('li a'));
    const ctn = catBoxs.map(v => {
      const title = $(v).find('h2.t').text();
      const subTitle = $(v).find('div.t-i').text().split('|');
      return {
        title: title,
        year: subTitle[0],
        milemeter: subTitle[1]
      };
    });
    return ctn;
  }, CAR_LIST_SELECTOR);

  console.log(`总共${carList.length}辆汽车数据: `, JSON.stringify(carList, undefined, 2));

  // 将车辆信息写入文件
  writerStream = fs.createWriteStream('car_info_list.json');
  writerStream.write(JSON.stringify(carList, undefined, 2), 'UTF8');
  writerStream.end();

  browser.close();
})();

demo6

demo7

demo8

demo9

demo10

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,492评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,048评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,927评论 0 358
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,293评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,309评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,024评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,638评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,546评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,073评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,188评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,321评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,998评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,678评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,186评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,303评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,663评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,330评论 2 358

推荐阅读更多精彩内容