node爬蟲爬取網站圖片

// 爬蟲
const https = require('https')
const fs = require('fs')
const cheerio = require('cheerio')
const url = require('url')

const site = 'https://www.xxx.com/'
const saveFoldersPath = './images'

https.get(site, res => {
  let err = ''
  if (res.statusCode != 200) {
    err = new Error('請求失敗')
  }
  // 判斷請求格式是否是網頁
  if (!/^text\/html/.test(res.headers['content-type'])) { // 格式不是網頁
    err = new Error('請求格式不是網頁')
  }

  if (err) {
    res.resume() // 重置緩存
    return
  }

  // 判斷images文件夾是否存在
  fs.exists(saveFoldersPath, (cb) => {
    !cb && fs.mkdir(saveFoldersPath, () => {})
  })

  let str = ''
  // 數據是分段的
  res.on('data', chunk => {
    str += chunk
  })
  // 數據獲取完成
  res.on('end', () => {
    // fs.writeFileSync('./bili.html', str)
    let $ = cheerio.load(str)
    $('img').each((index, el) => {
      let imgSrc = $(el).attr('src')
      // 此時需要做處理
      if (!imgSrc.startsWith('http://') && !imgSrc.startsWith('https://')) {
        imgSrc = url.parse(site).protocol + imgSrc
      }
      downLoad(imgSrc)
    })
  })
}).on('error', (e) => {
  console.error(e);
});

function downLoad(imgUrl) {
  https.get(imgUrl, (res) => {
    // 必須要設置,如果不設置,下載的圖片可能打不開
    res.setEncoding('binary')
    let imgData = ''
    res.on('data', (chunk) => {
      imgData += chunk
    })
    res.on('end', () => {
      // 獲取文件信息
      let files = parseFile(imgUrl)
      // 過濾掉不是.jpg|.png|.gif結尾的imgSrc
      if (files[1] == 'jpg' || files[1] == 'JPG' || files[1] == 'png' || files[1] == 'PNG' || files[1] == 'GIF' || files[1] == 'gif') {
        // 下載圖片
        fs.writeFile(`${saveFoldersPath}/${files.join('.')}`, imgData, 'binary', (err) => {
          if (err) {
            console.log('dowload fail', err)
          } else {
            console.log('download success')
          }
        })
      }
    })
  })
}

function parseFile(imgUrl) {
  let urls = imgUrl.split('/')
  let fileName = urls[urls.length - 1]
  return fileName.split('.')
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章