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])