{"id":6358,"date":"2018-09-18T19:02:24","date_gmt":"2018-09-18T11:02:24","guid":{"rendered":"http:\/\/4563.org\/?p=6358"},"modified":"2018-09-18T19:05:50","modified_gmt":"2018-09-18T11:05:50","slug":"%e4%bd%bf%e7%94%a8node%e6%89%b9%e9%87%8f%e6%8a%93%e5%8f%96%e5%b9%b6%e4%bf%9d%e5%ad%98%e5%86%99%e7%9c%9f%e5%9b%be%e7%89%87","status":"publish","type":"post","link":"http:\/\/4563.org\/?p=6358","title":{"rendered":"\u4f7f\u7528node\u6279\u91cf\u6293\u53d6\u5e76\u4fdd\u5b58\u56fe\u7247"},"content":{"rendered":"<p>&nbsp;<\/p>\n<p>\u6709\u7684\u65f6\u5019\u6211\u4eec\u6d4f\u89c8\u4e00\u4e9b\u7f51\u7ad9\uff0c\u4e3b\u8981\u662f\u4e3a\u4e86\u770b\u91cc\u9762\u7684\u56fe\u7247\uff0c\u4f46\u662f\u8fd9\u6837\u4f1a\u5b58\u5728\u51e0\u4e2a\u95ee\u9898<\/p>\n<ol>\n<li>\u7f51\u901f\u4e0d\u7ed9\u529b\u7684\u60c5\u51b5\u4e0b\u600e\u4e48\u529e\uff1f<\/li>\n<li>\u6765\u56de\u5207\u6362\u7f51\u9875\uff0c\u611f\u89c9\u597d\u8f9b\u82e6<\/li>\n<\/ol>\n<p>\u6709\u6ca1\u6709\u66f4\u597d\u7684\u529e\u6cd5\uff0c\u6bd4\u5982\u6279\u91cf\u4e0b\u8f7d\u5230\u672c\u5730\uff0c\u7136\u540e\u67e5\u770b\uff1f<\/p>\n<p>\u7b54\u6848\u662f\u80af\u5b9a\u7684\uff0c\u4eca\u5929\u6211\u4eec\u5c31\u4e00\u8d77\u6765\u5b66\u4e60\u5982\u4f55\u6279\u91cf\u4e0b\u8f7d\u56fe\u7247<\/p>\n<h3>\u4e3b\u8981node\u5de5\u5177<\/h3>\n<p>cheerio \u548c superagent \u548c request<\/p>\n<p>superagent \u7684\u4f5c\u7528\u4e3b\u8981\u662f\u7528node\u8bbf\u95eehttp\u9875\u9762<\/p>\n<p>cheerio \u4e3b\u8981\u662f\u4f5c\u7528\u7c7b\u4f3c\u6d4f\u89c8\u5668\u4e2d\u7684jquery<\/p>\n<p>request \u8bf7\u6c42\u56fe\u7247\uff0c \u6700\u540e\u7528fs.createWriteStream \u4fdd\u5b58\u5230\u672c\u5730<\/p>\n<h3>\u5f00\u59cb<\/h3>\n<p>\u9996\u5148\u88c5\u4e00\u4e2a node + express-generator<\/p>\n<p>\u7136\u540e\u7528 expres \u547d\u4ee4\u884c \u751f\u6210\u4e00\u4e2a \u7b80\u5355\u7684node \u7f51\u7ad9<\/p>\n<p>\u5927\u6982\u7684\u76ee\u5f55<br \/>\n<img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-6362\" src=\"http:\/\/4563.org\/wp-content\/uploads\/2018\/09\/1.jpg\" alt=\"\" width=\"330\" height=\"521\" \/><\/p>\n<p>\u7136\u540e\u6253\u5f00 routers \u4e0b\u7684index \u6587\u4ef6\uff0c\u6539\u5199\uff0c\u6700\u7ec8\u53d8\u6210\uff1a<\/p>\n<pre><code>var express = require('express');\r\nvar router = express.Router();\r\nconst cheerio = require('cheerio');\r\nconst superagent = require('superagent');\r\nconst Throttle    = require('superagent-throttle')\r\nconst fs = require('fs');\r\nconst Ut  = require('.\/saveImg');\r\nlet throttle = new Throttle({\r\n    active: true,     \/\/ set false to pause queue\r\n    rate: 6,          \/\/ how many requests can be sent every `ratePer`\r\n    ratePer: 10000,   \/\/ number of ms in which `rate` requests may be sent\r\n    concurrent: 2     \/\/ how many requests can be sent concurrently\r\n})\r\n    .on('sent', (request) =&gt; {\r\n        \"use strict\";\r\n\r\n    }) \/\/ sent a request\r\n    .on('received', (request) =&gt; {\r\n        \"use strict\";\r\n        console.log('\u5f00\u59cb\u8bf7\u6c42' + request.url)\r\n    })\r\n    .on('drained', () =&gt; {\r\n        \"use strict\";\r\n        console.log('\u8bf7\u6c42\u5b8c\u6210')\r\n    })\r\n\/* GET home page. *\/\r\n\/*\r\nrouter.get('\/', function (req, res, next) {\r\n\r\n    res.render('index', {title: 'Express'});\r\n});\r\n*\/\r\nlet getSonPage = (list)=&gt;{\r\n    \"use strict\";\r\n    list.forEach((item, index) =&gt;{\r\n        let url = item.href;\r\n        superagent.get(url).use(throttle.plugin()).end((err, res) =&gt;{\r\n            if(err){\r\n                throw Error(err);\r\n                return;\r\n            }\r\n            let $ = cheerio.load(res.text);\r\n            $('.content_left p').each(function(i, elem) {\r\n                let _this = $(elem),\r\n                    obj = {\r\n                        url: _this.find('img').attr('src')\r\n                    },\r\n                    path = __dirname + '\/image\/rosi_' + index +  i  + '.jpg';\r\n                obj.url &amp;&amp; Ut.downImg(obj, path);\r\n            });\r\n        });\r\n    });\r\n};\r\nrouter.get('\/', function (req,res,next) {\r\n    const reptileUrl = \"http:\/\/www.meisiguan.cc\/tag\/rosi\";\r\n    superagent.get(reptileUrl).end(function (err, res) {\r\n        \/\/ \u629b\u9519\u62e6\u622a\r\n        if(err){\r\n            throw Error(err);\r\n            return;\r\n        }\r\n\r\n        let $ = cheerio.load(res.text);\r\n        let data = [];\r\n        \/\/ \u4e0b\u9762\u5c31\u662f\u548cjQuery\u4e00\u6837\u83b7\u53d6\u5143\u7d20\uff0c\u904d\u5386\uff0c\u7ec4\u88c5\u6211\u4eec\u9700\u8981\u6570\u636e\uff0c\u6dfb\u52a0\u5230\u6570\u7ec4\u91cc\u9762\r\n        $('#index_ajax_list li').each(function(i, elem) {\r\n            let _this = $(elem);\r\n            data.push({\r\n                img: _this.find('img').attr('src'),\r\n                title: _this.find('img').attr('alt'),\r\n                href: _this.find('a').attr('href')\r\n            });\r\n        });\r\n        getSonPage(data);\r\n    });\r\n})\r\nmodule.exports = router;<\/code><\/pre>\n<p>\u7136\u540e\u628a\u4e0b\u8f7d\u56fe\u7247\u5c01\u88c5\u6210\u4e00\u4e2a\u6587\u4ef6 saveImg.js<\/p>\n<pre><code>let request = require(\"request\");\r\nlet fs = require(\"fs\");\r\n\r\nclass Ut {\r\n    \/**\r\n     * \u4e0b\u8f7d\u7f51\u7edc\u56fe\u7247\r\n     * @param {object} opts\r\n     *\/\r\n    static downImg(opts = {}, path = '') {\r\n        return new Promise((resolve, reject) =&gt; {\r\n            request\r\n                .get(opts)\r\n                .on('response', (response) =&gt; {\r\n                    console.log(\"img type:\", response.headers['content-type'])\r\n                })\r\n                .pipe(fs.createWriteStream(path))\r\n                .on(\"error\", (e) =&gt; {\r\n                    console.log(\"pipe error\", e);\r\n                    resolve('');\r\n                })\r\n                .on(\"finish\", () =&gt; {\r\n                    console.log(\"\u4e0b\u8f7d\u5b8c\u6210\");\r\n                    resolve(\"ok\");\r\n                })\r\n                .on(\"close\", () =&gt; {\r\n                    console.log(\"\u5173\u95ed\");\r\n                })\r\n\r\n        })\r\n    };\r\n}\r\n\r\nmodule.exports = Ut;<\/code><\/pre>\n<p>npm start \u540e \u6253\u5f00\u672c\u5730\u7684 localhost:3000 \u5c31\u9759\u9759\u7684\u7b49\u5f85 \u7ed3\u679c\u628a<\/p>\n<p>\u8fd0\u884c\u5b8c\u6210\u540e \u627e\u5230 routes\/image \u6587\u4ef6\u5939\uff0c \u7136\u540e\u5c31\u53ef\u4ee5\u6162\u6162\u770b\u5566\u3002<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-6363\" src=\"http:\/\/4563.org\/wp-content\/uploads\/2018\/09\/2-1.png\" alt=\"\" width=\"755\" height=\"434\" \/><\/p>\n","protected":false},"excerpt":{"rendered":"<p>&nbsp; \u6709\u7684\u65f6\u5019\u6211\u4eec\u6d4f\u89c8\u4e00\u4e9b&hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[],"tags":[],"_links":{"self":[{"href":"http:\/\/4563.org\/index.php?rest_route=\/wp\/v2\/posts\/6358"}],"collection":[{"href":"http:\/\/4563.org\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/4563.org\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/4563.org\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/4563.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=6358"}],"version-history":[{"count":3,"href":"http:\/\/4563.org\/index.php?rest_route=\/wp\/v2\/posts\/6358\/revisions"}],"predecessor-version":[{"id":6365,"href":"http:\/\/4563.org\/index.php?rest_route=\/wp\/v2\/posts\/6358\/revisions\/6365"}],"wp:attachment":[{"href":"http:\/\/4563.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=6358"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/4563.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=6358"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/4563.org\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=6358"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}