看了几天的nodejs,的确是好用,全当是练手了,就写了一个爬虫工具。

爬虫思路都是一致的,先抓取页面数据,然后分析页面,获取到所需要的数据,最后获得这些数据,是写入到硬盘,还是显示到网页,自己看着办。

其中最难的是分析页面,如果不用其他工具,那就只能用正则表达式来分析了。这里采用cheerio这个模块,这个很好用,不要有抵触心理(因为刚开始我比较抵触这个,想不用任何别的东西,结果自己搞崩了,还是用了它)。cheerio网上介绍很多,它可以根据div,根据class ,href等html标签,获取里面的数据。

这次是抓的本人博客首页( http://www.cnblogs.com/juepei/ )的文章标题,希望站长别生气,实地演练么。

先说下如何得到这个页面下的数据。

代码如下,简单的一比(不过nodejs写出来的东西本来就很简洁):

  request(url,function(error,res,body){
if(!error && res.statusCode == 200){
console.log(body);
}
});

body就是数据了,

然后开始分析下数据。

查看首页文章部分代码,如下:

<div class="day">
<div class="dayTitle">
<a id="homepage1_HomePageDays_DaysList_ctl00_ImageLink" href="http://www.cnblogs.com/juepei/archive/2015/01/09.html">2015年1月9日</a>
</div> <div class="postTitle">
<a id="homepage1_HomePageDays_DaysList_ctl00_DayList_TitleUrl_0" class="postTitle2" href="http://www.cnblogs.com/juepei/p/4212595.html">git常用命令</a>
</div>
<div class="postCon"><div class="c_b_p_desc">摘要: (1)git branch 查看本地分支(2)git branch -a 查看远程分支(3)git checkout branchname 切换分支 (4)git add yourfile (5)git commit -a -m &quot;描述&quot; 提交你当前开发到暂存区,可以理解为你本...<a href="http://www.cnblogs.com/juepei/p/4212595.html" class="c_b_p_desc_readmore">阅读全文</a></div></div>
<div class="clear"></div>
<div class="postDesc">posted @ 2015-01-09 10:06 薛定谔的猫_ 阅读(4) 评论(0) <a href ="http://i.cnblogs.com/EditPosts.aspx?postid=4212595" rel="nofollow">编辑</a></div>
<div class="clear"></div> </div>

.....

很多文章么,都是上面那些东西的循环。

我想要的东西在这里:

<div class="postTitle">
<a id="..." class="postTitle2" href="http://www.cnblogs.com/juepei/p/4212595.html">git常用命令</a>
</div>

它在<div class='postTitle'>里面包着。要取出它,这时候cheerio就大显身手了,此处建议看下cheerio的api。

代码如下:

 var $=cheerio.load(body);
$('div').filter(function(i,e){
if($(this).attr('class')==='postTitle'){
console.log($(this).text().trim());
}
});

这里用div来定位,这样就可以获取到数据了。代码就这么简单。

之后可以随意处置拿到的数据了,我这里是存到了本地的文本文档中。中间用数组转存了一下数据

全部代码如下:

var fs=require('fs');
var buffer=require('buffer'); var url='http://www.cnblogs.com/juepei/';
var result=new Array();
function getDatas(){
request(url,function(error,res,body){
if(!error && res.statusCode == 200){
var $=cheerio.load(body);
var j=0;
$('div').filter(function(i,e){
if($(this).attr('class')==='postTitle'){
j++;
//console.log($(this).text().trim());
result.push($(this).text().trim());
}
});
console.log(result.toString());
fs.appendFile('/home/wang/data.txt',result.toString(),function(err){
if(err){
console.log('file:'+err);
}else{
console.log('write ok');
}
});
}
else{
console.log(error);
}
});
} getDatas();

运行一下这段代码,/home/wang目录下就有data.txt生成了,网页编码是utf8的,系统环境也是utf8,所以没有乱码的产生,如果是其他系统,编码不一样,处理下编码。

至此,大功告成。ps:本人也学习了几天nodejs,刚开始比较纠结,找不到好资料,感觉举步为艰。希望大家多看api,这个才是正路。

最新文章

  1. @RequestBody接收ajax的json字符串
  2. l5如何通过路由走api版本回退查找设置
  3. IOS-JSON &amp; XML解析
  4. QlikView ETL - 分隔字符串的方法 SubField
  5. FZU1894 志愿者选拔 --单调队列
  6. wampserver下修改mysql root用户的登录密码
  7. asp.net实现md5加密方法详解
  8. 3、Object对象的两大方法(hashCode-equals)总结
  9. 关于ISAPI和CGI限制,这个要设为允许
  10. &lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot;的作用
  11. Python 2.7 学习笔记 基本语法和函数定义
  12. Django- &#39;WSGIRequest&#39; object has no attribute &#39;user&#39;
  13. 自动化运维工具——puppet详解(二)
  14. C++ 传参时传内置类型时用传值(pass by value)方式效率较高
  15. c++ switch和case的用法
  16. mongo 高级操作
  17. ACL技术总结
  18. 使用 OpenSSL 创建私有 CA:3 用户证书
  19. Classification Truth Table
  20. python—— 写入错误UnicodeEncodeError的解决办法

热门文章

  1. MySql的基本架构演变
  2. java并发:CAS算法和ABA问题
  3. 一些常用的c++系统函数
  4. 树莓派项目——基于树莓派的WIFI网络互传系统设计
  5. .net调用web邮箱发送邮件(转载)
  6. 12-matlab简单读excel
  7. xtrabackup拷贝redolog前做的细节操作
  8. 07 Maven 使用Nexus创建私服
  9. js函数在frame中的相互调用详解
  10. HTML &lt;img&gt; 标签的 alt 属性