-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathserver.js
98 lines (90 loc) · 2.99 KB
/
server.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
var http = require('http'),
url = require('url'),
superagent = require('superagent'),
cheerio = require('cheerio'),
async = require('async'),
eventproxy = require('eventproxy')
var ep = new eventproxy(),
urlsArray = [], //存放爬取网址
pageUrls = [], //存放收集文章页面网站
pageNum = 200 //要爬取文章的页数
for (var i = 1; i <= pageNum; i++) {
pageUrls.push(
'http://www.cnblogs.com/?CategoryId=808&CategoryType="SiteHome"&ItemListActionName="PostList"&PageIndex=' +
i +
'&ParentCategoryId=0'
)
}
// 主start程序
function start() {
function onRequest(req, res) {
// 轮询 所有文章列表页
pageUrls.forEach(function(pageUrl) {
superagent.get(pageUrl).end(function(err, pres) {
// console.log(pres.text)
// pres.text 里面存储着请求返回的 html 内容,将它传给 cheerio.load 之后
// 就可以得到一个实现了 jquery 接口的变量,我们习惯性地将它命名为 `$`
// 剩下就都是利用$ 使用 jquery 的语法了
var $ = cheerio.load(pres.text)
var curPageUrls = $('.titlelnk')
// console.log(curPageUrls)
for (var i = 0; i < curPageUrls.length; i++) {
var articleUrl = curPageUrls.eq(i).attr('href')
urlsArray.push(articleUrl)
// 相当于一个计数器
ep.emit('BlogArticleHtml', articleUrl)
}
})
})
ep.after('BlogArticleHtml', pageUrls.length * 20, function(articleUrls) {
// 当所有 'BlogArticleHtml' 事件完成后的回调触发下面事件
// 控制并发数
var curCount = 0
var reptileMove = function(url, callback) {
//延迟毫秒数
var delay = parseInt((Math.random() * 30000000) % 1000, 10)
curCount++
console.log(
'现在的并发数是',
curCount,
',正在抓取的是',
url,
',耗时' + delay + '毫秒'
)
superagent.get(url).end(function(err, sres) {
// sres.text 里面存储着请求返回的 html 内容
var $ = cheerio.load(sres.text)
// 收集数据
// 拼接URL
var currentBlogApp = url.split('/p/')[0].split('/')[3],
appUrl =
'http://www.cnblogs.com/mvc/blog/news.aspx?blogApp=' +
currentBlogApp
// 具体收集函数
personInfo(appUrl)
})
setTimeout(function() {
curCount--
callback(null, url + 'Call back content')
}, delay)
}
// 使用async控制异步抓取
// mapLimit(arr, limit, iterator, [callback])
// 异步回调
async.mapLimit(
articleUrls,
5,
function(url, callback) {
reptileMove(url, callback)
},
function(err, result) {
// 4000 个 URL 访问完成的回调函数
// ...
}
)
})
}
http.createServer(onRequest).listen(3000)
console.log('连接成功!')
}
start()