看了几天的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,这个才是正路。

Nodejs书写爬虫工具的更多相关文章

  1. 简单实现nodejs爬虫工具

    约30行代码实现一个简单nodejs爬虫工具,定时抓取网页数据. 使用npm模块 request---简单http请求客户端.(轻量级) fs---nodejs文件模块.   index.js var ...

  2. node.js 基于cheerio的爬虫工具,需要登录权限的爬虫工具

    公司有过一个需求,需要拿一个网页的的表格数据,数据量达到30w左右:为了提高工作效率. 结合自身经验和网上资料.写了一套符合自己需求的nodejs爬虫工具.也许也会适合你的. 先上代码.在做讲解 'u ...

  3. NodeJS制作爬虫全过程

    这篇文章主要介绍了NodeJS制作爬虫的全过程,包括项目建立,目标网站分析.使用superagent获取源数据.使用cheerio解析.使用eventproxy来并发抓取每个主题的内容等方面,有需要的 ...

  4. NodeJS热部署工具 — supervisor

    NodeJS热部署工具 — supervisor 大家都在开发nodejs应用时遇到过这样的情况,修改nodejs应用中的程序文件后必须重启nodejs才能重新加载应用代码.这是因为nodejs加载过 ...

  5. NodeJS网络爬虫

      原文地址:NodeJS网络爬虫   网上有很多其他语言平台版本的网络爬虫,比如Python,Java.那怎么能少得了我们无所不能的javascript呢

  6. MinerUtil.java 爬虫工具类

    MinerUtil.java 爬虫工具类 package com.iteye.injavawetrust.miner; import java.io.File; import java.io.File ...

  7. python爬虫工具集合

    python爬虫工具集合 大家一起来整理吧!强烈建议PR.这是初稿,总是有很多问题,而且考虑不全面,希望大家支持! 源文件 主要针对python3 常用库 urllib Urllib是python提供 ...

  8. python爬虫工具

    一直都听说python写爬虫工具非常方便,为了获取数据,我也要写点爬虫,但是python太灵活了,不知道python爬虫要哪些框架,要了解,比如beatiful soup,scrapy, 爬虫的额主要 ...

  9. NodeJS简单爬虫

    NodeJS简单爬虫 最近一直在追火星的一本书,然后每次都要去网站看,感觉很麻烦,于是,想起用爬虫爬取章节,务实派,说干就干! 爬取思路 1.该网站的页面呈现出一定的规律 2.使用NodeJS的req ...

随机推荐

  1. a标签伪类的LOVE HATE原则

    a标签伪类的LOVE HATE原则 a标签有四个伪类,分别是: a:link 未访问的链接 a:visited 已访问的链接 a:hover 鼠标移动到链接上 a:active 选定的链接 遇到的问题 ...

  2. js base64转二进制

    base64 编码规则 1.把3个字符变成4个字符.2.每76个字符加一个换行符.3.最后的结束符也要处理. 转换前 11111101, 11111111, 11111111 (二进制) 转换后 00 ...

  3. Spring依赖注入:注解注入

    注解注入顾名思义就是通过注解来实现注入, Spring和注入相关的常见注解有Autowired.Resource.Qualifier.Service.Controller.Repository.Com ...

  4. 找不到reportviewer控件在哪儿

    請自行加入ReportViewer(9.0)到工具箱之中. 如下圖,

  5. [leetcode]381. Insert Delete GetRandom O(1) - Duplicates allowed常数时间插入删除取随机值

    Design a data structure that supports all following operations in average O(1) time. Note: Duplicate ...

  6. 22-maven-安装与配置

    转载:https://blog.csdn.net/wy727764020/article/details/80595451 Maven的安装以及eclipse中配置maven 2018年06月06日 ...

  7. URL去重

    import socket dictlist ={}; def ReadHost(): hosts = []; obn = open('d:/sss.txt', 'rb'); for line in ...

  8. socket编程介绍

    Python 提供了两个基本的 socket 模块. 第一个是 Socket,它提供了标准的 BSD Sockets API. 第二个是 SocketServer, 它提供了服务器中心类,可以简化网络 ...

  9. 如何将硕大笨重的git仓库拆分成灵活轻巧的模块小仓库

    方法1.拆分一个子目录为独立仓库 参考链接:https://segmentfault.com/a/1190000002548731 以前是用 filter-branch 来实现,这个需求太常见了,有人 ...

  10. Codeforces 595B. Pasha and Phone 容斥

    B. Pasha and Phone time limit per test 1 second memory limit per test 256 megabytes input standard i ...