新闻爬虫及爬取结果的查询网站
一、网站爬虫设计
1 使用的Node.js模块介绍
Request模块
Request模块可以发送GET、POST请求,让http请求变的更加简单。
最简单的一个示例:
//GET请求
var request = require('request');
request('您的请求url', function (error, response, body) {
if (!error && response.statusCode == 200) {
console.log(body) // 请求成功的处理逻辑
}
});
//POST请求
var request = require('request');
var url="请求url";
var requestData="需要传输的数据";
request({
url: url,
method: "POST",
json: true,
headers: {
"content-type": "application/json",
},
body: JSON.stringify(requestData)
}, function(error, response, body) {
if (!error && response.statusCode == 200) {
console.log(body) // 请求成功的处理逻辑
}
});
Request-promise包
request-promise是带有promise支持的,依赖于request的简化版的HTTP请求client。
下面是示例:
//使用request-promise爬取网页
var cheerio = require('cheerio'); // Basically jQuery for node.js
var options = {
uri: 'http://www.google.com',
transform: function (body) {
return cheerio.load(body);
}
};
rp(options)
.then(function ($) {
// Process html like you would with jQuery...
})
.catch(function (err) {
// Crawling failed or Cheerio choked...
});
Cherrio模块
Cheerio是jquery核心功能的一个快速灵活而又简洁的实现,主要是为了用在服务器端需要对DOM进行操作的地方。
下面是简单的示例:
//示例的HTMl模板
<ul id="fruits">
<li class="apple">Apple</li>
<li class="orange">Orange</li>
<li class="pear">Pear</li>
</ul>
//功能一 解析HTML
var cheerio = require('cheerio'),
$ = cheerio.load('<ul id = "fruits">...</ul>');
//功能二 选择器 $(selector, [context], [root])
$('.apple', '#fruits').text()//Apple
$('ul .pear').attr('class')//pear
$('li[class=orange]').html()//<li class = "orange">Orange</li>
//功能三 属性操作 .attr(name, value)
$('ul').attr('id')// fruits
$('.apple').attr('id', 'favorite').html()
// <li class = "apple" id = "favorite">Apple</li>
爬虫过程中使用到的功能总结:
- $(selector, [context], [root]) 目标选择器
- .attr(name[, value]) 属性操作
- .find(selector) 查找满足selector目标选择器的元素。
- .children([selector]) 获得某元素的子元素,范围为所有子元素。
- .each(function(index, element){…}) 将每一个元素传入函数并执行。
- .map(function(index, element){…} 将每一个元素传入函数并执行,并返回值。
- .eq(i) 根据索引获得cheerio集合中的一个对象。
lconv-lite模块
Iconv-lite模块用于转换编码格式,防止爬取内容乱码
下面是示例:
var iconv = require('iconv-lite');
body = iconv.decode(body, 'gbk');//将body由GBK编码转码为utf-8编码
2 目标网站的分析
网站HTML结构分析(以东方财富网为例)
这一部分内容是使用cheerio模块,基于对网页HTML的分析,找到需要信息的具体位置,使用cherrio的目标筛选器属性操作等等来进行筛选,得到需要的信息。
一,通过检查网页源码,发现需要的新闻标题、链接都集中在class=nlist的div中,先尝试爬取一个标题和链接。
//关键代码如下
var news={
};
var item = $('div[class="nlist"]').find("li").children("a");
news.title = item.text();
news.url = item.attr("href");
console,log(news);
打印结果:
接下来加入map( ),对每一个元素分别进行处理,爬取到所有的标题和链接。
//关键代码如下
var item = $('div[class="nlist"]').find("li").children("a");
item.map(function (idx, element) {
var news = {
};
news.title = $(element).text();
news.url = $(element).attr("href");
console.log(news);
});
打印结果: