当前位置:主页 > 脚本语言 > NodeJS >

Node爬虫工具Puppeteer入门教程实践

时间:2022-09-30 09:28:51 | 栏目:NodeJS | 点击:

【Puppeteer概要】

【Puppeteer 错误处理】

Error handling

TimeoutError 一个处理超时错误的例子:

const {
    TimeoutError
} = require('puppeteer/Errors'); // ...
try {
    await page.waitForSelector('.foo');
} catch(e) {
    if (e instanceof TimeoutError) {  
    // 如果超时,做一些处理。 
    }
}

Puppeteer Working with Chrome Extensions

注意 Chrome / Chromium 扩展当前只能在非无头模式下使用。

下面的代码用来处理扩展的 background page,该扩展的代码在 ./my-extension:

const puppeteer = require('puppeteer'); (async() = > {
const pathToExtension = require('path').join(__dirname, 'my-extension');
const browser = puppeteer.launch({
    headless: false,
    args: [`--disable - extensions - except = $ {
        pathToExtension
    }`, `--load - extension = $ {
        pathToExtension
    }`]
});
const targets = await browser.targets();
const backgroundPageTarget = targets.find(target = >target.type() === 'background_page');
const backgroundPage = await backgroundPageTarget.page(); // 像处理任何其他页面一样测试背景页面。  await browser.close();})();

【Puppeteer class:puppeteer】

const puppeteer = require('puppeteer');
puppeteer.launch().then(async browser = >{
const page = await browser.newPage();
await page.goto('https://www.google.com'); // 其他操作...  await browser.close();});

Methods

Methods

puppeteer.connect(options)v0.9.0

puppeteer.createBrowserFetcher([options])v0.9.0

puppeteer.defaultArgs([options])v0.9.0

puppeteer.executablePath()v0.9.0

puppeteer.launch([options])v0.9.0

这个方法结合了下面3个步骤:

使用 puppeteer.defaultArgs() 作为一组默认值来启动 Chromium。

启动浏览器并根据 executablePathhandleSIGINTdumpio 和其他选项开始管理它的进程。 创建一个 Browser 类的实例,并根据 defaultViewportslowMoignoreHTTPSErrors 初始化它。 ignoreDefaultArgs 选项可用于自定义(1)步骤的行为。 例如,要从参数中过滤掉 --mute-audio

const browser = await puppeteer.launch({
    ignoreDefaultArgs: ['--mute-audio']
});
复制代码

Puppeteer 浏览器

const puppeteer = require('puppeteer');
puppeteer.launch().then(async browser = >{
const page = await browser.newPage();
await page.goto('https://example.com');
await browser.close();
});
const puppeteer = require('puppeteer');
puppeteer.launch().then(async browser = >{ // 存储节点以便能重新连接到 Chromium  
const browserWSEndpoint = browser.wsEndpoint();  // 从 Chromium 断开和 puppeteer 的连接  browser.disconnect();  // 使用节点来重新建立连接  
const browser2 = await puppeteer.connect({browserWSEndpoint});  // 关闭 Chromium  
await browser2.close();});

Puppeteer 页面

const puppeteer = require('puppeteer');
puppeteer.launch().then(async browser = >{
    const page = await browser.newPage();
    await page.goto('https://example.com');
    await page.screenshot({
        path: 'screenshot.png'
    });
    await browser.close();
});
page.once('load', () => console.log('Page loaded!'));
function logRequest(interceptedRequest) {
    console.log('A request was made:', interceptedRequest.url());
}
page.on('request', logRequest); // 一段时间后...page.removeListener('request', logRequest);

Methods

page.$(selector)v0.9.0

page.$$(selector)v0.9.0

page.waitForSelector(".index-content .click-zoom a")

await page.waitForSelector(".index-content .click-zoom a")

page.waitFor(1000)

await page.waitFor(1000)

page.click('.btn')

await page.click('.btn')

page.evaluate

await page.evaluate(() => {
      document.getElementById("HD_CheckIn").value = "2020-07-11";
})

示例

/**
* 爬取游戏站数据 https://game.pipajam.com/
*/
const fs = require('fs')
const puppeteer = require('puppeteer');
(async () => {
    const browser = await puppeteer.launch({
        headless: false,
        args: ['--start-maximized', '--disable-infobars'],
        width: 1600,
        height: 900
    });
    // 1、 创建两个页面
    const page = await browser.newPage();
    const page2 = await browser.newPage();
    // 2、进入首页
    await page.goto(
        'https://game.pipajam.com/'
    );
    // 3、等待页面游戏数据元素加载完成
    await page.waitForSelector(".index-content .click-zoom a")
    // 4、获取所以游戏链接 游戏名称 
    const list = await page.$$eval(".index-content .click-zoom a", (el => el.map(el => ([el.href, el.getElementsByTagName('h6')[0].innerText]))));
    console.log(list);
    let len = list.length, index = 0, data = []
    // 5、调用函数 组装数据
    mainFun()
    async function mainFun () {
        try {
            // 6、开启page2 页面 获取游戏详情数据
            await page2.goto(
                list[index][0],{
                    timeout: 0
                }
            );
            // 7、等待详情卡片加载完成
            await page2.waitForSelector(".play-game-card .play-game-card-center")
            // 8、获取游戏链接地址 图片地址
            const item = await page2.$eval(".play-game-card .play-game-card-center", (el => [el.getElementsByTagName('p')[0].innerHTML, el.getElementsByTagName('img')[0].src]));
            await page2.click('.play-game-card .play-game-card-center a')
            const url = await page2.evaluate(param => window.location.href, "参数");
            // 9、组装数据
            data.push({
                description: item[0],
                img: item[1],
                instructton: "",
                keyfeatures: "",
                name: list[index][1],
                published: "Mon Oct 08 2018",
                tags: [],
                url,
                type: 'Children\'s intelligence',
            })
            console.log('以写入第' + (index+1) + '数据。');
            // 10、获取所以游戏数据 并写入指定json 文件
            ++index < len ? mainFun() : fs.writeFile('../../json/Game/pipajam.json', JSON.stringify(data), () => {})
        } catch (error) {
            console.log(error, 'err')
        }
    }
})();

您可能感兴趣的文章:

相关文章