puppeteer 就很少介紹了,就是一個無界面化的谷歌瀏覽器。 做者本人是前端,後端方面的知識不太擅長,感受漏洞仍是蠻多的。 本教程是做者見獵心喜而後把玩了一下寫的,有不合理的地方還請包涵。前端
本例子是使用順序爬取,沒有用並行爬取,並設置了延時器,主要是擔憂訪問頻次過高會被屏蔽訪問。後端
puppeteer
寫爬蟲感受思路比別的更簡單,按視覺化的流程去走就能夠。瀏覽器
要抓取的頁面:http://wufazhuce.com/one/35bash
對於要抓取的資源,沒有弄複雜的邏輯,根據 URL 推斷是按ID排列的。 那麼只要對頁面 ID 依次累加就好了成功就抓取,錯誤就跳過。async
const puppeteer = require('puppeteer');
const fs = require('fs');
const request = require('request');
// 延時器
let timeout = function (delay) {
console.log('延遲函數:', `延遲 ${delay} 毫秒`)
return new Promise((resolve, reject) => {
setTimeout(() => {
try {
resolve(1)
} catch (error) {
reject(error)
}
}, delay);
})
}
/**
* One 爬蟲類
*/
class OnePaChong {
constructor () {
// 最大索引
this.maxIndex = 40
// 初始化
this.init()
}
// 初始化函數
async init () {
console.log('正在啓動瀏覽器...')
this.browser = await puppeteer.launch();
console.log('正在打開新頁面...')
this.page = await this.browser.newPage();
// 順序爬取頁面
for (let i = 30; i < this.maxIndex; i++) {
await this.getPageInfo(i)
}
this.closeBrowser()
}
// 抓取頁面內容
async getPageInfo (actPage) {
// 延時 1000 毫秒
await timeout(1000);
let page = this.page
await page.goto(`http://wufazhuce.com/one/${actPage}`);
// 獲取信息
try {
// 獲取文本
let sText = await page.$eval('.one-cita', el => el.innerText);
// 獲取圖片描述,清除空格和特殊字符 & 和 /
let sImgName = await page.$eval('.one-imagen-leyenda', el => {
let str = el.innerText
str = str.replace(/^\s+|\s+$/g, '')
str = str.replace(/\&+|\/+/g, '-')
return str;
});
// 獲取圖片URL
let sImgURL = await page.$eval('.one-imagen img', el => el.src);
console.log('-------------------------------------------- start')
console.log('頁面頁碼:', actPage);
console.log('採集狀態:', '成功');
console.log('標題句子:', sText);
console.log('圖片描述:', sImgName);
console.log('圖片地址:', sImgURL);
console.log('-------------------------------------------- end')
// 保存圖片
await request(sImgURL).pipe(fs.createWriteStream(`data/${sImgName}.png`));
} catch (error) {
console.log('-------------------------------------------- start')
console.log('頁面頁碼:', actPage);
console.log('採集狀態:', '失敗');
console.log('錯誤信息:', error)
console.log('-------------------------------------------- end')
}
}
// 關閉瀏覽器
async closeBrowser () {
console.log('正在關閉瀏覽器...')
await this.browser.close()
}
}
// 啓用爬蟲
new OnePaChong()
複製代碼