nodejs爬蟲獲取漫威超級英雄電影海報

木子昭發表於2018-05-12

昨天去看了《復聯3》的首映,當我提前15分鐘進入影院的時候, 看到了粉絲們取票的長隊, 頓時有一種跨年夜的感覺…
最近看了node爬蟲的一些知識, 這裡用node爬取一下漫威官網的電影海報!

marvel
// https://marvel.com/movies/all
const request = require(`superagent`)
const cheerio = require(`cheerio`)
const fs = require(`fs-extra`)
const path = require(`path`)

let url = `https://marvel.com/movies/all`

// 獲取圖片url和圖片名字
async function getUrlAndName(){
    // 用於儲存返回值
    let imgAddrArray = []
    // 請求資源
    const res = await request.get(url)
    // 將獲取的html, 轉換為資源符$, 相當於python中的xpath語法的etree過程
    const $ = cheerio.load(res.text)
    // 定位資源位置, 將圖片資源,和圖片名字, 以陣列方式, 返回給呼叫函式
    $(`.row-item-image a`).each(function(i, elem){
        let movieName = $(this).attr(`href`).split(`/`).pop()
        let imgAddr = $(this).find(`img`).attr(`src`)
        imgAddrArray.push([imgAddr, movieName])
    })
    return imgAddrArray
}
// 下載圖片
async function download(imgAndName){
    // 拼接出, 當前資源的檔名
    let filename = imgAndName[1] + `.jpg`
    console.log("爬取海報:", filename);
    // 獲取圖片二進位制資料
    const req = request.get(imgAndName[0]);
    // 儲存圖片
    await req.pipe(fs.createWriteStream(path.join(__dirname, `images`, filename))); 
}

// 建立資料夾, 控制整體流程
async function init(){
    let imgAddrArray = await getUrlAndName()
    // 建立資料夾
    try{
        await fs.mkdir(path.join(__dirname, `images`));
    }
    catch(err){
        console.log("==>", err);
    }
    // 獲取資源
    for (let imgAddr of imgAddrArray){
        await download(imgAddr);
    }
}

init()
執行結果

小結:

直觀感受, node爬蟲並沒有python好用, 而且由於瀏覽器的同源限制, 在瀏覽器端跑node爬蟲也會有些麻煩;node爬蟲的優勢:理論上講,node預設的非同步玩法, 能達到python的多執行緒爬蟲的效果.
寫爬蟲, 還是老老實實用python吧!


相關文章