成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

【小工具】node.js下載json對象中包含的所有圖片鏈接

notebin / 1414人閱讀

摘要:我先是在瀏覽器上輸入豆瓣的地址,拉下來數(shù)據(jù)。根據(jù)豆瓣的圖片地址,建立了對應的文件夾以下邏輯代碼中該函數(shù)的功能是接收一個數(shù)組數(shù)據(jù)的文件路徑,就可以將該中包含的所有的圖片路徑全部下載到中下對應的文件夾中。

今天在看微信小程序,數(shù)據(jù)是從網(wǎng)上找的API請求下來的。就想能不能把數(shù)據(jù)保存到本地來,以后沒有網(wǎng)絡也可以自己搭服務器提供數(shù)據(jù)。 說干就干,我打算用node來做。 我先是在瀏覽器上輸入豆瓣的API地址,拉下來json數(shù)據(jù)。,我去掉了不需要的頭尾,留下了中間的一個數(shù)組。因為我想保存數(shù)組中的電影信息。其它的并不需要。電影信息如下:
 {
            "rating": {
                "max": 10,
                "average": 9.6,
                "stars": "50",
                "min": 0
            },
            "genres": [
                "犯罪",
                "劇情"
            ],
            "title": "肖申克的救贖",
            "casts": [
                {
                    "alt": "https://movie.douban.com/celebrity/1054521/",
                    "avatars": {
                        "small": "https://img3.doubanio.com/img/celebrity/small/17525.jpg",
                        "large": "https://img3.doubanio.com/img/celebrity/large/17525.jpg",
                        "medium": "https://img3.doubanio.com/img/celebrity/medium/17525.jpg"
                    },
                    "name": "蒂姆·羅賓斯",
                    "id": "1054521"
                },
                {
                    "alt": "https://movie.douban.com/celebrity/1054534/",
                    "avatars": {
                        "small": "https://img3.doubanio.com/img/celebrity/small/34642.jpg",
                        "large": "https://img3.doubanio.com/img/celebrity/large/34642.jpg",
                        "medium": "https://img3.doubanio.com/img/celebrity/medium/34642.jpg"
                    },
                    "name": "摩根·弗里曼",
                    "id": "1054534"
                },
                {
                    "alt": "https://movie.douban.com/celebrity/1041179/",
                    "avatars": {
                        "small": "https://img1.doubanio.com/img/celebrity/small/5837.jpg",
                        "large": "https://img1.doubanio.com/img/celebrity/large/5837.jpg",
                        "medium": "https://img1.doubanio.com/img/celebrity/medium/5837.jpg"
                    },
                    "name": "鮑勃·岡頓",
                    "id": "1041179"
                }
            ],
            "collect_count": 1072578,
            "original_title": "The Shawshank Redemption",
            "subtype": "movie",
            "directors": [
                {
                    "alt": "https://movie.douban.com/celebrity/1047973/",
                    "avatars": {
                        "small": "https://img3.doubanio.com/img/celebrity/small/230.jpg",
                        "large": "https://img3.doubanio.com/img/celebrity/large/230.jpg",
                        "medium": "https://img3.doubanio.com/img/celebrity/medium/230.jpg"
                    },
                    "name": "弗蘭克·德拉邦特",
                    "id": "1047973"
                }
            ],
            "year": "1994",
            "images": {
                "small": "https://img3.doubanio.com/view/movie_poster_cover/ipst/public/p480747492.webp",
                "large": "https://img3.doubanio.com/view/movie_poster_cover/lpst/public/p480747492.webp",
                "medium": "https://img3.doubanio.com/view/movie_poster_cover/spst/public/p480747492.webp"
            },
            "alt": "https://movie.douban.com/subject/1292052/",
            "id": "1292052"
        }
其中有很多圖片,我打算將他們?nèi)肯螺d到本地文件夾中。我的服務器結構如下:

app.js是服務器文件,處理不同路由的中間件都寫在route文件夾中。圖片就下載到public文件夾中的image下。根據(jù)豆瓣的圖片地址,建立了對應的文件夾:

以下js邏輯代碼中: loadImageFromJson 該函數(shù)的功能是接收一個數(shù)組json數(shù)據(jù)的文件路徑,就可以將該json中包含的所有的圖片路徑全部下載到public中images下對應的文件夾中。其中用到了一個異步下載第三方模塊:bagpipe
var fs = require("fs");
var http = require("http");
var url = require("url");
var path = require("path");
var Bagpipe = require("bagpipe");
var request = require("request");
var Files = [];
var Type = "";

//接收一個json文件,以及存放圖片的路徑
//解析出里面的所有圖片的連接,
//并下載所有圖片到當前目錄下的image文件夾中

function loadFilesFromJson(jsonURL, destDir, fileType) {
    //讀取文件中的所有的圖片鏈接
    fs.readFile(jsonURL, "utf-8", function(err, doc) {

        //將讀取到的普通字符串轉換為json對象,
        var jsonObj = JSON.parse(doc);
        Type = fileType;
        //迭代出對象中包含的url
        itrator(jsonObj);

        if (Files.length > 0) {

            loadFilesFromNet(Files, destDir);
        }
    });
}


//遍歷json對象的所有屬性,找出所有的圖片鏈接
function itrator(obj) {

    for (var item in obj) {

        if (obj[item] instanceof Object) {

            itrator(obj[item]);


        } else {

            if ((typeof obj[item]).toLowerCase() == "string" && obj[item].indexOf(Type) > -1) {


                Files.push(obj[item]);

            }

        }
    }


}


function loadFilesFromNet(Files, destDir) {

    //設置并發(fā)的任務個數(shù)
    var bagpipe = new Bagpipe(10);
    //真正下載圖片文件的地方
    var downloadFiles = function(src, dest, callback) {
        request.head(src, function(err, res, body) {

            if (src) {
                request(src).pipe(fs.createWriteStream(dest)).on("close", function() {
                    //回調(diào)函數(shù),打印出文件名
                    callback(null, dest);
                });
            }

        });

    };
    //用for循環(huán)開啟每一次下載
    for (var i = 0; i < Files.length; i++) {

        try {

            //根據(jù)url自動生成文件夾結構
            createDirAccordingToUrl(Files[i], destDir);

            //下載的文件的保存路徑
            var destFile = path.resolve(destDir, Files[i].substr(Files[i].indexOf(".com/") + 5));
            bagpipe.push(downloadFiles, Files[i], destFile, function(err, data) {
                //打印的是下載成功的文件路徑
                console.log(data);
            });


        } catch (e) {
            console.log(e);

        }
    }
}

function createDirAccordingToUrl(originurl, dest) {
    var urlobj = url.parse(originurl);
    //將path用"/"分割為數(shù)組
    var dirs = urlobj.path.split("/");
    var dir = dest;
    for (var i = 0; i < dirs.length - 1; i++) {

        dir += "/" + dirs[i];
        console.log(dir);
        //判斷是否存在,且是否為文件夾
        if (fs.existsSync(dir) && fs.statSync(dir).isDirectory()) {
            //如果該層文件夾存在,就繼續(xù)判斷下一層
        } else {

            console.log("文件夾不存在,創(chuàng)建:" + dir);
            fs.mkdirSync(dir);
        }

    }
}

exports.loadFilesFromJson = loadFilesFromJson;


//傳入源json文件,下載的文件存放的文件夾路徑,以及下載的文件類型
loadFilesFromJson("./zhihuhot.json", __dirname + "/public/zhihu", ".jpg");
用以上代碼就可以下載圖片到本地了。但是這些數(shù)據(jù)還應該導入到數(shù)據(jù)庫。我使用的是mongodb數(shù)據(jù)庫,直接在命令行中輸入:
mongoimport -d 數(shù)據(jù)庫名 -c 集合名 文件名
即可將json文件中的對象都導入數(shù)據(jù)庫。十分方便。 這里要注意一點:
導入的json文件中不能是剛才用過的數(shù)組json文件,需要做簡單修改:先將數(shù)組的 []符號 刪掉,然后對象之間的逗號也要刪掉。最后就像這樣:
{}  {}  {}  {}
導入數(shù)據(jù)之前,記得json文件中圖片的地址改成本地的地址。 因為我是打算在本地搭建服務器使用,所以我將豆瓣的圖片地址域名全部改成了這樣:
http://127.0.0.1:8080
我的服務器app.js文件如下:
var route = require("./route/route.js");
var express = require("express");
var app = express();

app.use(express.static("./public"));
//獲取電影詳情
app.get("/movie/detail/:movieid", route.detailRoute);
//獲取即將上映的電影
app.get("/movie/coming", route.comingRoute);

//獲取排行250電影
app.get("/movie/top250/:start/:count", route.top100);

app.listen(8080);
我的路由文件如下:
var MongoClient = require("mongodb").MongoClient;
//mongo服務器地址
var URL = "mongodb://localhost:27017/farsight";
var detailRoute = function(req, res) {
    console.log("detail");
    //連接數(shù)據(jù)庫farsight,如果不存在,就創(chuàng)建它,并將其對象返回
    MongoClient.connect(URL, function(err, db) {
        if (err) {
            console.error(err); //輸出錯誤信息
            return;
        } else {
            //獲取集合對象
            var collection = db.collection("moviedetail");

            //查詢數(shù)據(jù)
            collection.find({}).limit().skip().toArray(function(err, docs) {
                if (err) throw err;
                else {
                    console.log(docs);

                    if (docs.length == 0) {
                        res.send();
                    } else {

                        res.send(docs);
                    }
                    db.close();
                }
            });
        }
    });

}
var hotplaying = function(req, res) {

    console.log("hotplaying");

    //連接數(shù)據(jù)庫farsight,如果不存在,就創(chuàng)建它,并將其對象返回
    MongoClient.connect(URL, function(err, db) {
        if (err) {
            console.error(err); //輸出錯誤信息
            return;
        } else {
            //獲取集合對象
            var collection = db.collection("hotplaying");

            //查詢數(shù)據(jù)
            collection.find({}).toArray(function(err, docs) {
                if (err) throw err;
                else {
                    console.log(docs);
                    if (docs.length == 0) {
                        res.send();
                    } else {

                        res.send(docs);
                    }
                    db.close();
                }
            });
        }
    });

}

//即將上映
var comingRoute = function(req, res) {

        //連接數(shù)據(jù)庫farsight,如果不存在,就創(chuàng)建它,并將其對象返回
        MongoClient.connect(URL, function(err, db) {
            if (err) {
                console.error(err); //輸出錯誤信息
                return;
            } else {
                //獲取集合對象
                var collection = db.collection("coming");

                //查詢數(shù)據(jù)
                collection.find({}).toArray(function(err, docs) {
                    if (err) throw err;
                    else {

                        if (docs.length == 0) {
                            res.send();
                        } else {
                            console.log("查到了" + docs.length);
                            // var jsonObj = JSON.parse(docs);
                            res.send(docs);
                        }
                        db.close();
                    }
                });
            }
        });

    }
    //電影排行
var top100 = function(req, res) {
    var count = req.params.count;
    var start = req.params.start;

    //連接數(shù)據(jù)庫farsight,如果不存在,就創(chuàng)建它,并將其對象返回
    MongoClient.connect(URL, function(err, db) {
        if (err) {
            console.error(err); //輸出錯誤信息
            return;
        } else {
            //獲取集合對象
            var collection = db.collection("to100");

            //查詢數(shù)據(jù)
            collection.find({}).limit(count).skip(start).toArray(function(err, docs) {
                if (err) throw err;
                else {
                    console.log(docs);

                    if (docs.length == 0) {
                        res.send();
                    } else {

                        res.send(docs);
                    }
                    db.close();
                }
            });
        }
    });
}
        exports.detailRoute = detailRoute;
        exports.hotplaying = hotplaying;
        exports.comingRoute = comingRoute;
        exports.top100 = top100;
數(shù)據(jù)準備完成。就可以在瀏覽器中訪問本地數(shù)據(jù)庫保存的數(shù)據(jù)了。

文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://systransis.cn/yun/83428.html

相關文章

  • 一個時快速搭建微信程序

    摘要:第一步搭開發(fā)環(huán)境首先,我們需要在本地搭建好微信小程序的開發(fā)環(huán)境。在微信小程序中,所有的網(wǎng)絡請求受到嚴格限制,不滿足條件的域名和協(xié)議無法請求。第五步配置微信小程序云端示例鏡像中,已經(jīng)部署好了,但是還需要在下修改配置中的域名證書私鑰。 「小程序」這個劃時代的產(chǎn)品發(fā)布快一周了,互聯(lián)網(wǎng)技術人都在摩拳擦掌,躍躍欲試??墒切〕绦蚰壳斑€在內(nèi)測,首批只發(fā)放了 200 個內(nèi)測資格(淚流滿面)。本以為沒有...

    izhuhaodev 評論0 收藏0
  • 分分鐘教你用node.js寫個爬蟲

    摘要:爬蟲介紹二爬蟲的分類通用網(wǎng)絡爬蟲全網(wǎng)爬蟲爬行對象從一些種子擴充到整個,主要為門戶站點搜索引擎和大型服務提供商采集數(shù)據(jù)。 分分鐘教你用node.js寫個爬蟲 寫在前面 十分感謝大家的點贊和關注。其實,這是我第一次在segmentfault上寫文章。因為我也是前段時間偶然之間才開始了解和學習爬蟲,而且學習node的時間也不是很長。雖然用node做過一些后端的項目,但其實在node和爬蟲方面...

    fanux 評論0 收藏0
  • 前端每周清單第 44 期: 2017 JS 調(diào)查報告、REST 接口實時化、ESM 的過去與未來

    摘要:巔峰人生年老兵思路上的轉變,遠比單純提升技術更有價值本文節(jié)選自趙成教授在極客時間開設的趙成的運維體系管理課,是其對自己十年技術生涯的回顧與總結。趙成教授來自美麗聯(lián)合集團,集團旗下兩大主力產(chǎn)品是蘑菇街和美麗說,目前負責管理集團的技術服務團隊。 showImg(https://segmentfault.com/img/remote/1460000012476504?w=1240&h=826...

    MASAILA 評論0 收藏0
  • Node.js微信公眾號開發(fā)

    摘要:在微信開發(fā)者工具中調(diào)試和一定要正確域名一定是備案的綁定域名需要的放在服務器上的位置一定要正確參考微信公眾號開發(fā)文檔 node微信公眾號開發(fā) 概覽 key value 項目名稱 node微信公眾號開發(fā) 項目描述 使用node編寫接口,前后端分離獲取簽名數(shù)據(jù) 開發(fā)者 leinov 發(fā)布日期 2018-11-07 倉庫 github地址 安裝&使用 下載 gi...

    OnlyLing 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<