设为首页 收藏本站
查看: 1146|回复: 0

[经验分享] [js高手之路]Node.js+jade+mongodb+mongoose实现爬虫分离入库与生成静态文件

[复制链接]

尚未签到

发表于 2017-12-16 17:45:19 | 显示全部楼层 |阅读模式
1 var http = require('http');  

  2 var cheerio = require('cheerio');  

  3 var mongoose = require('mongoose');  

  4 mongoose.Promise = global.Promise;  

  5 var DB_URL = 'mongodb://localhost:27017/crawler';  

  6  
  7 var aList = []; //博客文章列表信息
  
  8 var aUrl = []; //博客所有的文章url
  
  9
  
10 var db = mongoose.createConnection(DB_URL);
  
11 db.on('connected', function (err) {
  
12     if (err) {
  
13         console.log(err);
  
14     } else {
  
15         console.log('db connected success');
  
16     }
  
17 });
  
18 var Schema = mongoose.Schema;
  
19 var arcSchema = new Schema({

  
20    >
  
21    >  
22     url: String, //文章链接
  
23     body: String, //文章内容
  
24     entry: String, //摘要
  
25     listTime: Date //发布时间
  
26 });
  
27 var Article = db.model('Article', arcSchema);
  
28
  
29 function saveArticle(arcInfo) {
  
30     var arcModel = new Article(arcInfo);
  
31     arcModel.save(function (err, result) {
  
32         if (err) {
  
33             console.log(err);
  
34         } else {
  
35             console.log(`${arcInfo['title']}   插入成功`);
  
36         }
  
37     });
  
38 }
  
39
  
40 function filterArticle(html) {
  
41     var $ = cheerio.load(html);
  
42     var arcDetail = {};

  
43     var>  
44     var href = $("#cb_post_title_url").attr("href");
  
45     var re = /\/(\d+)\.html/;

  
46     var>  
47     var body = $("#cnblogs_post_body").html();
  
48     return {

  
49        >
  
50        >  
51         url: href,
  
52         body: body
  
53     };
  
54 }
  
55
  
56 function crawlerArc(url) {
  
57     var html = '';
  
58     var str = '';
  
59     var arcDetail = {};
  
60     http.get(url, function (res) {
  
61         res.on('data', function (chunk) {
  
62             html += chunk;
  
63         });
  
64         res.on('end', function () {
  
65             arcDetail = filterArticle(html);
  
66             saveArticle(arcDetail);
  
67             if ( aUrl.length ) {
  
68                 setTimeout(function () {
  
69                     if (aUrl.length) {
  
70                         crawlerArc(aUrl.shift());
  
71                     }
  
72                 }, 100);
  
73             }else {
  
74                 console.log( '采集任务完成' );
  
75                 return;
  
76             }
  
77         });
  
78     });
  
79 }
  
80
  
81 function filterHtml(html) {
  
82     var $ = cheerio.load(html);
  
83     var arcList = [];
  
84     var aPost = $("#content").find(".post-list-item");
  
85     aPost.each(function () {
  
86         var ele = $(this);

  
87         var>  
88         var url = ele.find("h2 a").attr("href");
  
89         ele.find(".c_b_p_desc a").remove();
  
90         var entry = ele.find(".c_b_p_desc").text();
  
91         ele.find("small a").remove();
  
92         var listTime = ele.find("small").text();
  
93         var re = /\d{4}-\d{2}-\d{2}\s*\d{2}[:]\d{2}/;
  
94         listTime = listTime.match(re)[0];
  
95
  
96         arcList.push({

  
97            >  
98             url: url,
  
99             entry: entry,
  
100             listTime: listTime
  
101         });
  
102     });
  
103     return arcList;
  
104 }
  
105
  
106 function nextPage(html) {
  
107     var $ = cheerio.load(html);
  
108     var nextUrl = $("#pager a:last-child").attr('href');
  
109     if (!nextUrl) return getArcUrl(aList);
  
110     var curPage = $("#pager .current").text();
  
111     if (!curPage) curPage = 1;
  
112     var nextPage = nextUrl.substring(nextUrl.indexOf('=') + 1);
  
113     if (curPage < nextPage) crawler(nextUrl);
  
114 }
  
115
  
116 function crawler(url) {
  
117     http.get(url, function (res) {
  
118         var html = '';
  
119         res.on('data', function (chunk) {
  
120             html += chunk;
  
121         });
  
122         res.on('end', function () {
  
123             aList.push(filterHtml(html));
  
124             nextPage(html);
  
125         });
  
126     });
  
127 }
  
128
  
129 function getArcUrl(arcList) {
  
130     for (var key in arcList) {
  
131         for (var k in arcList[key]) {
  
132             aUrl.push(arcList[key][k]['url']);
  
133         }
  
134     }
  
135     crawlerArc(aUrl.shift());
  
136 }
  
137
  
138 var url = 'http://www.cnblogs.com/ghostwu/';
  
139 crawler(url);

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-424767-1-1.html 上篇帖子: mongoDB内置文档定义 下篇帖子: 本地数据库导入线上服务器的mongodb中
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表