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 ...
随机推荐
- 元素的定位id和name
1.元素定位: 元素的定位是自动化测试的核心,要想操作一个元素,首先应该识别这个元素 webdriver提供了一系列的元素定位方法,常用的有以下几种 id name class name partia ...
- 第五章 二叉树(a)树
- 36. Valid Sudoku (Array; HashTable)
Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku board could be ...
- 可重入函数reentrant function
可重入函数主要用于多任务环境中,一个可重入的函数简单来说就是可以被中断的函数:而不可重入的函数由于使用了一些系统资源,比如全局变量区,中断向量表等,所以它如果被中断的话,可能会出现问题,这类函数是不能 ...
- python之信号量【Semaphore】
# 互斥锁同时只允许一个线程更改数据,而Semaphore是同时允许一定数量的线程更改数据,比如 # 一个厕所有3个坑,那么最多只允许3个人上厕所,后面的人只能等里面有人出来了才能再进去 import ...
- 小X归来 模拟赛1 解析
Problem1 单峰 小X 归来后,首先对数列很感兴趣.他想起有1类特殊的数列叫单峰数列. 我们说一个数列 {ai} 是单峰的,当且仅当存在一个位置 k 使得 ai < ai+1(i < ...
- 品味性能之道<三>:方法论
自顶向下的性能优化方法论 系统优化是包括系统设计.开发.产品上线.平台优化的全过程,不同阶段的优化工作对全系统所带来的效益是不同的.理想的性能优化论应该采用自顶向下的优化方法,即在项目设计.开发和上线 ...
- 2014.1.4 cxf spring webservice
先创建 webservice 服务端 . 首先下载 cxf jar 包 , cxf-2.7.8 . 新建 web 项目 aa . 将下载的cxf 压缩文件解压,将lib 下的jar 全部build p ...
- mysql 1045 access denied for user********
另一个方法Windows: 1. 管理员登陆系统,停止mysql服务或者结束mysqld-nt进程2. 进入命令行,来到mysql的安装目录.假设安装目录为 d:/mysql/ , CMD进入命令行3 ...
- Python 的stat 模块
#!/usr/bin/env python#-*- encoding:UTF-8 -*- import os,time,stat fileStats = os.stat ( 'test.txt' ) ...