Nodejs书写爬虫工具
看了几天的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 "描述" 提交你当前开发到暂存区,可以理解为你本...<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书写爬虫工具的更多相关文章
- 简单实现nodejs爬虫工具
约30行代码实现一个简单nodejs爬虫工具,定时抓取网页数据. 使用npm模块 request---简单http请求客户端.(轻量级) fs---nodejs文件模块. index.js var ...
- node.js 基于cheerio的爬虫工具,需要登录权限的爬虫工具
公司有过一个需求,需要拿一个网页的的表格数据,数据量达到30w左右:为了提高工作效率. 结合自身经验和网上资料.写了一套符合自己需求的nodejs爬虫工具.也许也会适合你的. 先上代码.在做讲解 'u ...
- NodeJS制作爬虫全过程
这篇文章主要介绍了NodeJS制作爬虫的全过程,包括项目建立,目标网站分析.使用superagent获取源数据.使用cheerio解析.使用eventproxy来并发抓取每个主题的内容等方面,有需要的 ...
- NodeJS热部署工具 — supervisor
NodeJS热部署工具 — supervisor 大家都在开发nodejs应用时遇到过这样的情况,修改nodejs应用中的程序文件后必须重启nodejs才能重新加载应用代码.这是因为nodejs加载过 ...
- NodeJS网络爬虫
原文地址:NodeJS网络爬虫 网上有很多其他语言平台版本的网络爬虫,比如Python,Java.那怎么能少得了我们无所不能的javascript呢
- MinerUtil.java 爬虫工具类
MinerUtil.java 爬虫工具类 package com.iteye.injavawetrust.miner; import java.io.File; import java.io.File ...
- python爬虫工具集合
python爬虫工具集合 大家一起来整理吧!强烈建议PR.这是初稿,总是有很多问题,而且考虑不全面,希望大家支持! 源文件 主要针对python3 常用库 urllib Urllib是python提供 ...
- python爬虫工具
一直都听说python写爬虫工具非常方便,为了获取数据,我也要写点爬虫,但是python太灵活了,不知道python爬虫要哪些框架,要了解,比如beatiful soup,scrapy, 爬虫的额主要 ...
- NodeJS简单爬虫
NodeJS简单爬虫 最近一直在追火星的一本书,然后每次都要去网站看,感觉很麻烦,于是,想起用爬虫爬取章节,务实派,说干就干! 爬取思路 1.该网站的页面呈现出一定的规律 2.使用NodeJS的req ...
随机推荐
- a标签伪类的LOVE HATE原则
a标签伪类的LOVE HATE原则 a标签有四个伪类,分别是: a:link 未访问的链接 a:visited 已访问的链接 a:hover 鼠标移动到链接上 a:active 选定的链接 遇到的问题 ...
- js base64转二进制
base64 编码规则 1.把3个字符变成4个字符.2.每76个字符加一个换行符.3.最后的结束符也要处理. 转换前 11111101, 11111111, 11111111 (二进制) 转换后 00 ...
- Spring依赖注入:注解注入
注解注入顾名思义就是通过注解来实现注入, Spring和注入相关的常见注解有Autowired.Resource.Qualifier.Service.Controller.Repository.Com ...
- 找不到reportviewer控件在哪儿
請自行加入ReportViewer(9.0)到工具箱之中. 如下圖,
- [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 ...
- 22-maven-安装与配置
转载:https://blog.csdn.net/wy727764020/article/details/80595451 Maven的安装以及eclipse中配置maven 2018年06月06日 ...
- URL去重
import socket dictlist ={}; def ReadHost(): hosts = []; obn = open('d:/sss.txt', 'rb'); for line in ...
- socket编程介绍
Python 提供了两个基本的 socket 模块. 第一个是 Socket,它提供了标准的 BSD Sockets API. 第二个是 SocketServer, 它提供了服务器中心类,可以简化网络 ...
- 如何将硕大笨重的git仓库拆分成灵活轻巧的模块小仓库
方法1.拆分一个子目录为独立仓库 参考链接:https://segmentfault.com/a/1190000002548731 以前是用 filter-branch 来实现,这个需求太常见了,有人 ...
- Codeforces 595B. Pasha and Phone 容斥
B. Pasha and Phone time limit per test 1 second memory limit per test 256 megabytes input standard i ...