国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

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

notebin / 1412人閱讀

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

今天在看微信小程序,數(shù)據(jù)是從網(wǎng)上找的API請求下來的。就想能不能把數(shù)據(jù)保存到本地來,以后沒有網(wǎng)絡(luò)也可以自己搭服務(wù)器提供數(shù)據(jù)。 說干就干,我打算用node來做。 我先是在瀏覽器上輸入豆瓣的API地址,拉下來json數(shù)據(jù)。,我去掉了不需要的頭尾,留下了中間的一個數(shù)組。因?yàn)槲蚁氡4鏀?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到本地文件夾中。我的服務(wù)器結(jié)構(gòu)如下:

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

以下js邏輯代碼中: loadImageFromJson 該函數(shù)的功能是接收一個數(shù)組json數(shù)據(jù)的文件路徑,就可以將該json中包含的所有的圖片路徑全部下載到public中images下對應(yīng)的文件夾中。其中用到了一個異步下載第三方模塊: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文件,以及存放圖片的路徑
//解析出里面的所有圖片的連接,
//并下載所有圖片到當(dāng)前目錄下的image文件夾中

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

        //將讀取到的普通字符串轉(zhuǎn)換為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) {

    //設(shè)置并發(fā)的任務(wù)個數(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自動生成文件夾結(jié)構(gòu)
            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ù)還應(yīng)該導(dǎo)入到數(shù)據(jù)庫。我使用的是mongodb數(shù)據(jù)庫,直接在命令行中輸入:
mongoimport -d 數(shù)據(jù)庫名 -c 集合名 文件名
即可將json文件中的對象都導(dǎo)入數(shù)據(jù)庫。十分方便。 這里要注意一點(diǎn):
導(dǎo)入的json文件中不能是剛才用過的數(shù)組json文件,需要做簡單修改:先將數(shù)組的 []符號 刪掉,然后對象之間的逗號也要刪掉。最后就像這樣:
{}  {}  {}  {}
導(dǎo)入數(shù)據(jù)之前,記得json文件中圖片的地址改成本地的地址。 因?yàn)槲沂谴蛩阍诒镜卮罱ǚ?wù)器使用,所以我將豆瓣的圖片地址域名全部改成了這樣:
http://127.0.0.1:8080
我的服務(wù)器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服務(wù)器地址
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ù)準(zhǔn)備完成。就可以在瀏覽器中訪問本地數(shù)據(jù)庫保存的數(shù)據(jù)了。

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

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/83428.html

相關(guān)文章

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

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

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

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

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

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

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

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

    OnlyLing 評論0 收藏0

發(fā)表評論

0條評論

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