NodeJs爬虫02

介绍如何使用Node.js抓取网易新闻的正文及图片,通过解析HTML获取所需内容。

转载:http://blog.csdn.net/kissliux/article/details/20466889

最新做一个新闻项目,项目流程很简单,使用nodejs去网络上面抓取新闻,存到mongodb数据库,然后对客户端提供http服务。客户端的实现网上有很多源码,上一篇文字介绍了,怎么从rss地址抓取新闻的url地址和链接等等,未抓取新闻正文和新闻的概要图片。对于一个新闻客户端来说,没有图片是致命的打击,图文并茂才能吸引用户 。



本文来解决抓取正文和图片的问题。

上一篇文章 网络爬虫,使用NodeJs抓取RSS新闻 

项目源码托管在github,欢迎一起进行维护和开发:github源码


本文拿网易新闻RSS服务进行测试和开发的。

对于这样一则新闻 url为:http://news.163.com/14/0304/10/9MG1UUF400014JB6.html

查看源码可知 正文包含在 

[javascript] view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. <div id="endText">正文</div>  

这样一对标签中。图片也在这个标签中<img src="">,src中的值,即为图片的url地址

所以开发思路应该是这样的,

  1.  http请求新闻url,得到新闻页面的所有元素
  2.  在全文中查找新闻的正文
  3.  在正文中找到需要的图片
现在使用代码一步一步实现,
nodejs的http请求操作起来很简单,直接使用http库或者使用第三方的request库。开发的过程中,我遇到了一个棘手的问题,中文乱码。这个问题很坑爹,困扰了我n久
[javascript] view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. var request = require('request');  
  2. var iconv = require('iconv-lite');  
  3. var BufferHelper = require('bufferhelper')  
  4.     , FeedParser = require('feedparser')  
  5.     , Iconv = require('iconv').Iconv;  
  6. var Post = require('../model/Post');  
  7. var cheerio = require('cheerio');  
  8.   
  9.   
  10. /**抓取网页全文源代码、主要用来抓取新闻正文 
  11.  * @param url 需要抓取的url地址 
  12.  * @param calback 
  13.  */  
  14. function fetchContent(url,calback){  
  15.     var req = request(url, {timeout: 10000, pool: false});  
  16.     req.setMaxListeners(50);  
  17.     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')  
  18.         .setHeader('accept''text/html,application/xhtml+xml');  
  19.   
  20.     req.on('error'function(err) {  
  21.         console.log(err);  
  22.     });  
  23.     req.on('response'function(res) {  
  24.         var bufferHelper = new BufferHelper();  
  25.         res.on('data'function (chunk) {  
  26.             bufferHelper.concat(chunk);  
  27.         });  
  28.         res.on('end',function(){  
  29.             var result = iconv.decode(bufferHelper.toBuffer(),'GBK');  
  30.             calback(result);  
  31.         });  
  32.     });  
  33. }  

转换的技巧在于,使用buffer去转换,把收到的数据全部变成buffer字节数据。
正文已经得到了,即result。

正文截取的用到了一个html文件源码操作的神器 cheerio, 它能让我像使用jquery一样方便快捷地操作抓取到的源码

举一个例子

[javascript] view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. var cheerio = require('cheerio'),  
  2.     $ = cheerio.load('<h2 class="title">Hello world</h2>');  
  3.   
  4. $('h2.title').text('Hello there!');  
  5. $('h2').addClass('welcome');  
  6.   
  7. $.html();  
  8. //=> <h2 class="title welcome">Hello there!</h2>  
就这么简单,

所以我截取出正文和图片的代码如下:

[javascript] view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.  * 截取单个新闻的正文, 
  3.  * @param url 新闻的url地址 
  4.  * @param tag 新闻在web界面开始的标签 如:<div id='content'>新闻正文</div>。 content即为tag 
  5.  */  
  6. function getNewsContent(url,tag,callback){  
  7.     console.log(url);  
  8.     fetchContent(url,function(htmlData){  
  9.         var $ = cheerio.load(htmlData);  
  10.         var context = $(tag).html();  
  11.         var img = $(tag).find("img")[0];  
  12.         var imgPath ;  
  13.         if(img !== null){  
  14.             imgPath = $(img).attr("src");  //新闻的缩略图  
  15.         }  
  16.         console.log(url);  
  17.         console.log(imgPath);  
  18.         callback(context,imgPath);   //回调新闻正文和图片  
  19.     });  
  20. }  

好啦 正文有了,图片也有了,标题也有了,新闻抓取基本搞定了。


====

你可以在配置文件中添加自己想抓取的站点和抓取的时间,运行代码,新闻就到了你的数据库了,你就可以直接在web界面访问你抓取的新闻了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值