共计 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()中的回调拿到控制台中执行,拿到的数据和上文的一模一样
正文完