最新做一个新闻项目,项目流程很简单,使用nodejs去网络上面抓取新闻,存到mongodb数据库,然后对客户端提供http服务。客户端的实现网上有很多源码,上一篇文字介绍了,怎么从rss地址抓取新闻的url地址和链接等等,未抓取新闻正文和新闻的概要图片。对于一个新闻客户端来说,没有图片是致命的打击,图文并茂才能吸引用户 。
本文来解决抓取正文和图片的问题。
上一篇文章 网络爬虫,使用NodeJs抓取RSS新闻
项目源码托管在github,欢迎一起进行维护和开发:github源码
本文拿网易新闻RSS服务进行测试和开发的。
对于这样一则新闻 url为:http://news.163.com/14/0304/10/9MG1UUF400014JB6.html
查看源码可知 正文包含在
<div id="endText">正文</div>
所以开发思路应该是这样的,
var request = require(‘request‘);
var iconv = require(‘iconv-lite‘);
var BufferHelper = require(‘bufferhelper‘)
, FeedParser = require(‘feedparser‘)
, Iconv = require(‘iconv‘).Iconv;
var Post = require(‘../model/Post‘);
var cheerio = require(‘cheerio‘);
/**抓取网页全文源代码、主要用来抓取新闻正文
* @param url 需要抓取的url地址
* @param calback
*/
function fetchContent(url,calback){
var req = request(url, {timeout: 10000, pool: false});
req.setMaxListeners(50);
req.setHeader(‘user-agent‘, ‘Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36‘)
.setHeader(‘accept‘, ‘text/html,application/xhtml+xml‘);
req.on(‘error‘, function(err) {
console.log(err);
});
req.on(‘response‘, function(res) {
var bufferHelper = new BufferHelper();
res.on(‘data‘, function (chunk) {
bufferHelper.concat(chunk);
});
res.on(‘end‘,function(){
var result = iconv.decode(bufferHelper.toBuffer(),‘GBK‘);
calback(result);
});
});
}举一个例子
var cheerio = require(‘cheerio‘),
$ = cheerio.load(‘<h2 class="title">Hello world</h2>‘);
$(‘h2.title‘).text(‘Hello there!‘);
$(‘h2‘).addClass(‘welcome‘);
$.html();
//=> <h2 class="title welcome">Hello there!</h2>就这么简单,
所以我截取出正文和图片的代码如下:
/**
* 截取单个新闻的正文,
* @param url 新闻的url地址
* @param tag 新闻在web界面开始的标签 如:<div id=‘content‘>新闻正文</div>。 content即为tag
*/
function getNewsContent(url,tag,callback){
console.log(url);
fetchContent(url,function(htmlData){
var $ = cheerio.load(htmlData);
var context = $(tag).html();
var img = $(tag).find("img")[0];
var imgPath ;
if(img !== null){
imgPath = $(img).attr("src"); //新闻的缩略图
}
console.log(url);
console.log(imgPath);
callback(context,imgPath); //回调新闻正文和图片
});
}
好啦 正文有了,图片也有了,标题也有了,新闻抓取基本搞定了。
====
你可以在配置文件中添加自己想抓取的站点和抓取的时间,运行代码,新闻就到了你的数据库了,你就可以直接在web界面访问你抓取的新闻了。
NodeJs抓取新闻正文和正文中的图片,布布扣,bubuko.com
原文:http://blog.csdn.net/kissliux/article/details/20466889