简单的Nodejs爬虫

427 阅读2分钟

使用puppeteer,cheerio

npm install puppeteer

puppeteer官方文档 puppeteer类似于一个自动化脚本,文档中提供了很多方法,他提供了一组用来操纵Chrome的API, 通俗来说就是一个 headless chrome浏览器(当然你也可以配置成有UI的,默认是没有的)。既然是浏览器,那么我们手工可以在浏 览器上做的事情 Puppeteer 都能胜任,另外,Puppeteer 翻译成中文是"木偶"意思,所以听名字就知 道,操纵起来很方便,你可以很方便的操纵它去实现:

  1. -) 生成网页截图或者 PDF
  2. -) 高级爬虫,可以爬取大量异步渲染内容的网页
  3. -) 模拟键盘输入、表单自动提交、登录网页等,实现 UI 自动化测试
  4. -) 捕获站点的时间线,以便追踪你的网站,帮助分析网站性能问题 如果你用过 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/'))
})()