摘要:我先是在瀏覽器上輸入豆瓣的地址,拉下來數據。根據豆瓣的圖片地址,建立了對應的文件夾以下邏輯代碼中該函數的功能是接收一個數組數據的文件路徑,就可以將該中包含的所有的圖片路徑全部下載到中下對應的文件夾中。
今天在看微信小程序,數據是從網上找的API請求下來的。就想能不能把數據保存到本地來,以后沒有網絡也可以自己搭服務器提供數據。 說干就干,我打算用node來做。 我先是在瀏覽器上輸入豆瓣的API地址,拉下來json數據。,我去掉了不需要的頭尾,留下了中間的一個數組。因為我想保存數組中的電影信息。其它的并不需要。電影信息如下:
{ "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" }其中有很多圖片,我打算將他們全部下載到本地文件夾中。我的服務器結構如下: app.js是服務器文件,處理不同路由的中間件都寫在route文件夾中。圖片就下載到public文件夾中的image下。根據豆瓣的圖片地址,建立了對應的文件夾: 以下js邏輯代碼中: loadImageFromJson 該函數的功能是接收一個數組json數據的文件路徑,就可以將該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) { //設置并發的任務個數 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() { //回調函數,打印出文件名 callback(null, dest); }); } }); }; //用for循環開啟每一次下載 for (var i = 0; i < Files.length; i++) { try { //根據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用"/"分割為數組 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()) { //如果該層文件夾存在,就繼續判斷下一層 } else { console.log("文件夾不存在,創建:" + dir); fs.mkdirSync(dir); } } } exports.loadFilesFromJson = loadFilesFromJson; //傳入源json文件,下載的文件存放的文件夾路徑,以及下載的文件類型 loadFilesFromJson("./zhihuhot.json", __dirname + "/public/zhihu", ".jpg");用以上代碼就可以下載圖片到本地了。但是這些數據還應該導入到數據庫。我使用的是mongodb數據庫,直接在命令行中輸入:
mongoimport -d 數據庫名 -c 集合名 文件名即可將json文件中的對象都導入數據庫。十分方便。 這里要注意一點:
導入的json文件中不能是剛才用過的數組json文件,需要做簡單修改:先將數組的 []符號 刪掉,然后對象之間的逗號也要刪掉。最后就像這樣: {} {} {} {}導入數據之前,記得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"); //連接數據庫farsight,如果不存在,就創建它,并將其對象返回 MongoClient.connect(URL, function(err, db) { if (err) { console.error(err); //輸出錯誤信息 return; } else { //獲取集合對象 var collection = db.collection("moviedetail"); //查詢數據 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"); //連接數據庫farsight,如果不存在,就創建它,并將其對象返回 MongoClient.connect(URL, function(err, db) { if (err) { console.error(err); //輸出錯誤信息 return; } else { //獲取集合對象 var collection = db.collection("hotplaying"); //查詢數據 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) { //連接數據庫farsight,如果不存在,就創建它,并將其對象返回 MongoClient.connect(URL, function(err, db) { if (err) { console.error(err); //輸出錯誤信息 return; } else { //獲取集合對象 var collection = db.collection("coming"); //查詢數據 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; //連接數據庫farsight,如果不存在,就創建它,并將其對象返回 MongoClient.connect(URL, function(err, db) { if (err) { console.error(err); //輸出錯誤信息 return; } else { //獲取集合對象 var collection = db.collection("to100"); //查詢數據 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;數據準備完成。就可以在瀏覽器中訪問本地數據庫保存的數據了。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/83428.html
摘要:第一步搭開發環境首先,我們需要在本地搭建好微信小程序的開發環境。在微信小程序中,所有的網絡請求受到嚴格限制,不滿足條件的域名和協議無法請求。第五步配置微信小程序云端示例鏡像中,已經部署好了,但是還需要在下修改配置中的域名證書私鑰。 「小程序」這個劃時代的產品發布快一周了,互聯網技術人都在摩拳擦掌,躍躍欲試。可是小程序目前還在內測,首批只發放了 200 個內測資格(淚流滿面)。本以為沒有...
摘要:爬蟲介紹二爬蟲的分類通用網絡爬蟲全網爬蟲爬行對象從一些種子擴充到整個,主要為門戶站點搜索引擎和大型服務提供商采集數據。 分分鐘教你用node.js寫個爬蟲 寫在前面 十分感謝大家的點贊和關注。其實,這是我第一次在segmentfault上寫文章。因為我也是前段時間偶然之間才開始了解和學習爬蟲,而且學習node的時間也不是很長。雖然用node做過一些后端的項目,但其實在node和爬蟲方面...
摘要:巔峰人生年老兵思路上的轉變,遠比單純提升技術更有價值本文節選自趙成教授在極客時間開設的趙成的運維體系管理課,是其對自己十年技術生涯的回顧與總結。趙成教授來自美麗聯合集團,集團旗下兩大主力產品是蘑菇街和美麗說,目前負責管理集團的技術服務團隊。 showImg(https://segmentfault.com/img/remote/1460000012476504?w=1240&h=826...
摘要:在微信開發者工具中調試和一定要正確域名一定是備案的綁定域名需要的放在服務器上的位置一定要正確參考微信公眾號開發文檔 node微信公眾號開發 概覽 key value 項目名稱 node微信公眾號開發 項目描述 使用node編寫接口,前后端分離獲取簽名數據 開發者 leinov 發布日期 2018-11-07 倉庫 github地址 安裝&使用 下載 gi...
閱讀 3686·2021-09-07 10:19
閱讀 3627·2021-09-03 10:42
閱讀 3584·2021-09-03 10:28
閱讀 2548·2019-08-29 14:11
閱讀 809·2019-08-29 13:54
閱讀 1594·2019-08-29 12:14
閱讀 417·2019-08-26 12:12
閱讀 3614·2019-08-26 10:45