使用puppeteer,cheerio
npm install puppeteer
puppeteer官方文档 puppeteer类似于一个自动化脚本,文档中提供了很多方法,他提供了一组用来操纵Chrome的API, 通俗来说就是一个 headless chrome浏览器(当然你也可以配置成有UI的,默认是没有的)。既然是浏览器,那么我们手工可以在浏 览器上做的事情 Puppeteer 都能胜任,另外,Puppeteer 翻译成中文是"木偶"意思,所以听名字就知 道,操纵起来很方便,你可以很方便的操纵它去实现:
- -) 生成网页截图或者 PDF
- -) 高级爬虫,可以爬取大量异步渲染内容的网页
- -) 模拟键盘输入、表单自动提交、登录网页等,实现 UI 自动化测试
- -) 捕获站点的时间线,以便追踪你的网站,帮助分析网站性能问题 如果你用过 PhantomJS 的话,你会发现她们有点类似,但Puppeteer是Chrome官方团队进行维 护的,用俗话说就是”有娘家的人“,前景更好。
npm install cheerio
cheerio官方文档cheerio可以对页面进行抓取
如果服务器中要使用puppeteer需要引入一个chromium,这个会在以后讲。
puppeteer.launch({
//重点
executablePath: '.././node_modules/puppeteer/.local-chromium/linux-1045629/chrome-linux/chrome',
})
安装好puppeteer,cheerio
//创建一个浏览器实例 Browser 对象
const browser = await puppeteer.launch({
args: ['--no-sandbox'],
//headless:false
})
//通过 Browser 对象创建页面 Page 对象
const page = await browser.newPage()
await page.goto(url)
// await page
const html = await page.content()
//使用cheerio获取想要的内容并返回
const results = parse(html)
// await browser.close()
return results
function parse(html) {
const $ = cheerio.load(html)
let results = []
//选择要获取的信息,此处的例子是获取了youtube上面博主页面的视频href
//$('#items > ytd-grid-video-renderer')获取到位置再用each循环寻找内部的某个dom的href
$('#items > ytd-grid-video-renderer').each((i, link) => {
results.push('https://www.youtube.com' + $(link).find('#thumbnail').attr('href'))
})
//返回获取到的href链接
return results
}
获取到想要的视频/图片链接就可以对图片进行下载,如果图片像pixiv这样具有防盗链的我们可以使用nginx进行反向代理获取到图片。
//videos[0]是我们上面返回results接收到的数组
videos[0].forEach(element => {
if(element){
//因为pixiv.cat的网站已经对pixiv进行的反向代理,所以我们可以换成他们的域名,pixiv.cat上具有相关referer的nginx代理规则,如果想使用自己的服务器使用这个方法需要注册域名,并且申请域名证书,再进行443端口的监听与转发。
element = element.replace(/master/g,'original')
element = element.replace(/i.pximg.net\/c\/250x250\_80_a2/g,'i.pixiv.cat')
element = element.replace(/_square1200/g,'')
newvideos.push(element)
}
});
下面是一个普通的百度页面logo的图片href获取,不适用于服务器(服务器需要上面的executablePath)
const puppeteer = require('puppeteer')
const cheerio = require('cheerio')
async function crawler (url) {
const browser = await puppeteer.launch({
args: ['--no-sandbox'],
headless:false
})
const page = await browser.newPage()
await page.goto(url)
const html = await page.content()
const results = parse(html)
await browser.close()
return results
}
function parse(html) {
const $ = cheerio.load(html)
let results = []
results = $('#s_lg_img').attr('src')
return results
}
(async()=>{
console.log( await crawler('https://www.baidu.com/'))
})()