puppeteer爬虫爬取豆瓣电影

44次阅读

共计 1475 个字符,预计需要花费 4 分钟才能阅读完成。

具体使用请参看 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()中的回调拿到控制台中执行,拿到的数据和上文的一模一样

正文完
 0