puppeteer 是一个Chrome官方出品的headless Chrome node库。它提供了一系列的API, 能够在无UI的状况下调用Chrome的功能, 适用于爬虫、自动化处理等各类场景javascript
puppeteer 是一个Chrome官方出品的headless Chrome node库(没有图形用户界面的的web浏览器)。它提供了一系列的API, 能够在无UI的状况下调用Chrome的功能, 适用于爬虫、自动化处理等各类场景html
能够用它来干什么?java
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto(targetUrl);
await page.screenshot({path: 'example.png'});
await browser.close();
})();
复制代码
1.引入puppeteernode
const puppeteer = require('puppeteer');
复制代码
2.生成实例ios
也就是经过Puppeteer启动一个浏览器环境git
const browser = await puppeteer.launch(options);
复制代码
options:github
3.打开一个新页面web
const page = await browser.newPage();
复制代码
4.前往目标页面ajax
await page.goto(targetUrl);
复制代码
注意: 这里可接受第二个参数,是个对象,用来进行一些简单的配置,带选项有chrome
waitUntil:
timeout: 跳转等待时间,单位是毫秒, 默认是30秒, 传 0 表示无限等待,能够经过page.setDefaultNavigationTimeout(timeout)方法修改默认值
referer(不经常使用): 引用页头的值。若是提供,它将优先于page.setExtraHTTPHeaders()设置的referer头值(Referer header value. If provided it will take preference over the referer header value set by page.setExtraHTTPHeaders().)
5.关闭浏览器
browser.close();
复制代码
其实轻松入门节已经将咱们经常使用的功能进行了相对完善的描述,总结一下,爬一个网页须要几步
找到一个本身喜欢的视频网站,(如下内容仅供教学!)
const demo = async () => {
const browser = await (puppeteer.launch({
executablePath: puppeteer.executablePath(),
headless: false
}))
var arr = []
for (let i = 1; i <= 40; i++) {
console.log('正在抓取全职高手第' + i + '集')
const targetUrl = `https://goudaitv1.com/play/78727-4-${i}.html`
console.log(targetUrl)
const page = await browser.newPage()
await page.goto(targetUrl, {
timeout: 0,
waitUntil: 'domcontentloaded'
})
const baseNode = '.row'
const movieList = await page.evaluate((sel) => {
var stream = Array.from($(sel).find('iframe#Player').attr('src'))
stream && (stream = stream.join(''))
return stream
}, baseNode)
arr.push(movieList)
page.close()
}
console.log(arr)
browser.close()
}
复制代码
若是pageFunction返回的是Promise,page.evaluate将等待promise完成,并返回其返回值。
若是pageFunction返回的是不能序列化的值,将返回undefined
给pageFunction传参数示例:
const result = await page.evaluate(x => {
return Promise.resolve(8 * x);
}, 7); // (注: 7 能够是你本身代码里任意方式获得的值)
console.log(result); // 输出 "56"
复制代码
也能够传入一个字符串
console.log(await page.evaluate('1 + 2')); // 输出 "3"
const x = 10;
console.log(await page.evaluate(`1 + ${x}`)); // 输出 "11"
复制代码
搞定!你能够用这些数据作本身想作的一切,好比
固然,'爬'只是它的冰山一角,上述demo比较偷懒的直接获取了a标签的地址进行跳转,咱们还可使用点击事件进行页面跳转,感兴趣的能够试试。
此方法找到一个匹配 selector 选择器的元素,若是须要会把此元素滚动到可视,而后经过 page.mouse 点击它。 若是选择器没有匹配任何元素,此方法将会报错。
要注意若是 click() 触发了一个跳转,会有一个独立的 page.waitForNavigation() Promise对象须要等待。 正确的等待点击后的跳转是这样的:
const [response] = await Promise.all([
page.waitForNavigation(waitOptions),
page.click(selector, clickOptions),
]);
复制代码
此方法在页面跳转到一个新地址或从新加载时解析,若是你的代码会间接引发页面跳转,这个方法比较有用。
更多参照page.waitForNavigation([options])