-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathnews.js
108 lines (96 loc) · 3.56 KB
/
news.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
99
100
101
102
103
104
105
106
107
108
var http = require("http");
var fs = require("fs");
var cheerio = require("cheerio");
var request = require("request");
var i = 0;
var url = "http://www.ss.pku.edu.cn/index.php/newscenter/news/2391";
//初始url
function fetchPage(x) {
//封装了一层函数
startRequest(x);
}
function startRequest(x) {
//采用http模块向服务器发起一次get请求
http
.get(x, function (res) {
var html = ""; //用来存储请求网页的整个html内容
var titles = [];
res.setEncoding("utf-8"); //防止中文乱码
//监听data事件,每次取一块数据
res.on("data", function (chunk) {
html += chunk;
});
//监听end事件,如果整个网页内容的html都获取完毕,就执行回调函数
res.on("end", function () {
var $ = cheerio.load(html); //采用cheerio模块解析html
var time = $(".article-info a:first-child").next().text().trim();
var news_item = {
//获取文章的标题
title: $("div.article-title a").text().trim(),
//获取文章发布的时间
Time: time,
//获取当前文章的url
link:
"http://www.ss.pku.edu.cn" + $("div.article-title a").attr("href"),
//获取供稿单位
author: $("[title=供稿]").text().trim(),
//i是用来判断获取了多少篇文章
i: (i = i + 1),
};
console.log(news_item); //打印新闻信息
var news_title = $("div.article-title a").text().trim();
savedContent($, news_title); //存储每篇文章的内容及文章标题
savedImg($, news_title); //存储每篇文章的图片及图片标题
//下一篇文章的url
var nextLink = "http://www.ss.pku.edu.cn" + $("li.next a").attr("href");
str1 = nextLink.split("-"); //去除掉url后面的中文
str = encodeURI(str1[0]);
//这是亮点之一,通过控制I,可以控制爬取多少篇文章.
if (i <= 500) {
fetchPage(str);
}
});
})
.on("error", function (err) {
console.log(err);
});
}
//该函数的作用:在本地存储所爬取的新闻内容资源
function savedContent($, news_title) {
$(".article-content p").each(function (index, item) {
var x = $(this).text();
var y = x.substring(0, 2).trim();
if (y == "") {
x = x + "\n";
//将新闻文本内容一段一段添加到/data文件夹下,并用新闻的标题来命名文件
fs.appendFile("./data/" + news_title + ".txt", x, "utf-8", function (
err
) {
if (err) {
console.log(err);
}
});
}
});
}
//该函数的作用:在本地存储所爬取到的图片资源
function savedImg($, news_title) {
$(".article-content img").each(function (index, item) {
var img_title = $(this).parent().next().text().trim(); //获取图片的标题
if (img_title.length > 35 || img_title == "") {
img_title = "Null";
}
var img_filename = img_title + ".jpg";
var img_src = "http://www.ss.pku.edu.cn" + $(this).attr("src"); //获取图片的url
//采用request模块,向服务器发起一次请求,获取图片资源
request.head(img_src, function (err, res, body) {
if (err) {
console.log(err);
}
});
request(img_src).pipe(
fs.createWriteStream("./image/" + news_title + "---" + img_filename)
); //通过流的方式,把图片写到本地/image目录下,并用新闻的标题和图片的标题作为图片的名称。
});
}
fetchPage(url); //主程序开始运行