puppeteer爬虫-爬取豆瓣电影

具体使用请参看 Puppeteer官网

puppeteer爬虫和一般爬虫的区别

爬虫是一个模拟人类请求网站行为的程序。很多爬虫程序是通过请求http获取数据,用puppeteer做爬虫是通过DevTool协议控制Chrome或Chromium来抓取页面信息

puppeteer下载

两种模式

1.完整模式(自动下载最新版的Chrome)

npm i puppeteer
...
const puppeteer = require('puppeteer');

2.简洁模式(手动指定Chrome路径)

npm i puppeteer-core
...
const puppeteer = require('puppeteer-core');
puppeteer.launch({
    executablePath:Chrome.exe // 指定Chrome或Chromium路径
})

爬取豆瓣电影

直接上代码

const puppeteer = require('puppeteer-core');

const launchConfig = {
    headless: false,
    executablePath: 'C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe',
    slowMo: 1000,
    defaultViewport: {
        width: 1600,
        height: 900,
    }
}

puppeteer.launch(launchConfig).then(async browser => {
    const page = await browser.newPage();
    await page.goto('https://movie.douban.com/cinema/nowplaying/beijing/');
    const result = await page.evaluate(() => {
        const items = document.querySelectorAll('#nowplaying > div.mod-bd > ul >li');
        const links = [];
        if (items.length >= 1) {
            items.forEach((item) => {
                const data = Array.from(item.attributes);
                const link = {};
                data.forEach((v) => {
                    link[v.nodeName] = v.value;
                });
                const a = item.querySelector('.poster > a');
                const img = a.querySelector('img');
                link.href = a.getAttribute('href');
                link.src = img.getAttribute('src');
                links.push({
                    ...link,
                });
            });
        }
        return links;
    });
    console.log('result', result)
    await browser.close();
});

效果图

关于page.evaluate()API

为什么在page.evaluate()函数中就可以使用原生DOM操作呢?

Puppeteer 是一个 Node 库,它提供了一个高级 API 来通过 DevTools 协议控制 Chromium 或 Chrome。

page.evaluate()相当于通过DevTools协议调用了浏览器的控制台,将它的回调全部拿到了控制台中执行,在浏览器的控制台中我们是可以用原生操作来控制页面的。
我们把上文page.evaluate()中的回调拿到控制台中执行,拿到的数据和上文的一模一样
puppeteer爬虫-爬取豆瓣电影_第1张图片

你可能感兴趣的:(puppeteer,nodejs爬虫,node.js)