摘要:我先是在瀏覽器上輸入豆瓣的地址,拉下來數(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
摘要:第一步搭開發(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)測資格(淚流滿面)。本以為沒有...
摘要:爬蟲介紹二爬蟲的分類通用網(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和爬蟲方面...
摘要:巔峰人生年老兵思路上的轉(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...
摘要:在微信開發(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...
閱讀 3700·2021-09-07 10:19
閱讀 3641·2021-09-03 10:42
閱讀 3593·2021-09-03 10:28
閱讀 2560·2019-08-29 14:11
閱讀 820·2019-08-29 13:54
閱讀 1606·2019-08-29 12:14
閱讀 428·2019-08-26 12:12
閱讀 3626·2019-08-26 10:45