puppeteer 就很少介绍了,就是一个无界面化的谷歌浏览器。 做者本人是前端,后端方面的知识不太擅长,感受漏洞仍是蛮多的。 本教程是做者见猎心喜而后把玩了一下写的,有不合理的地方还请包涵。前端
本例子是使用顺序爬取,没有用并行爬取,并设置了延时器,主要是担忧访问频次过高会被屏蔽访问。后端
puppeteer
写爬虫感受思路比别的更简单,按视觉化的流程去走就能够。浏览器
要抓取的页面:http://wufazhuce.com/one/35bash
对于要抓取的资源,没有弄复杂的逻辑,根据 URL 推断是按ID排列的。 那么只要对页面 ID 依次累加就好了成功就抓取,错误就跳过。markdown
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() 复制代码