您的位置:首页 > Web前端 > Node.js

node js简单爬虫实现

2016-11-07 19:29 85 查看
所谓爬虫,就是抓取网页上的信息,node js的简单爬虫是通过request模块和cheerio来实现的

首先要下载这两个包 npm install -g request --save-dev npm install -g cheerio --save-dev

这两个包就下好了

每一个网站都有一个robots协议 它规定了你可以爬取什么 不可以爬取什么 

比如极客学院的robot协议



一般我们如果爬取了不应当爬取的数据 有时候也没关系 额

我是参考这个文章来编写的
http://chenxi.name/60.html
导入模块

/**
* Created by hcnucai on 2016/11/7.
*/
var request = require("request");
var cheerio = require("cheerio");
var path = require("path");
var express = require("express");

var fs = require("fs");规定url
var requrl = "http://jandan.net/ooxx/page-1319";随后加载进这个url 提取body 当res.statusBody为200的时候 表示加载成功 accquireData是个函数
//解析img标签
function accquireData(data) {
//cheerio解析data
var $ = cheerio.load(data);

//将所有的img放到一个数组中
var meizi = $('.text img').toArray();
// var table = $('.tag-cloud tbody tr').toArray();
// table.forEach(function (e) {
// var tempTf = cheerio.load(e);
// var href1 = tempTf('td a').toArray();
// href1.forEach(function (tempHref) {
// console.log(tempHref.attribs.href);
// })
// })
for(var i = 0; i < meizi.length;i++){
//用循环读出数组中每个src
var imgSrc = meizi[i].attribs.src;
//通过path.baseUrlForFileName 来读取文件名
var fileName = path.basename(imgSrc);
//随后进行下载图片的操作
downLoadImg(imgSrc,fileName,function () {
console.log(fileName + 'done');
})
}
}通过cheerio来加载html 返回一个DOM树 操作这个$符号 就是相当于jquery来操纵DOM树
.text 表示class 为text的 img表示其下的子元素img 随后遍历这个数组 attribs表示他的属性 属性中的src 来提取他的url 

随后downLoadImg也是一个函数 来下载img

var downLoadImg = function (url,fileName,callBack) {
request.head(url,function (err,res,body) {
//返回图片的类型
console.log(("content-type:",res.headers["content-type"]));
//返回图片的大小
console.log(("content-length:",res.headers["content-length"]));
if(err){
console.log("err" + err);
return false;
}
console.log("res:" + res);
//下载文件的操作
request(url).pipe(fs.createWriteStream("/Users/hcnucai/Desktop/NodeDemo/images/" + fileName)).on('close',callBack);
})
}是一个函数 通过request(url).pipe() 文件产生输出流,监听结束的时候 传回一个闭包函数 表示这个文件下载完毕 这样就可以实现了 主要实现爬虫的就是cheerio函数 来解析DOM树 request来加载html代码
整体代码

/**
* Created by hcnucai on 2016/11/7.
*/
var request = require("request");
var cheerio = require("cheerio");
var path = require("path");
var express = require("express");

var fs = require("fs");
var requrl = "http://jandan.net/ooxx/page-1319";
//使用request模块类请求url
//使用cherrio来解析html
request(requrl,function (err,res,body) {
if(!err && res.statusCode == 200){
//返回请求页面的html
// console.log(body);
accquireData(body);
}

})
//解析img标签
function accquireData(data) {
//cheerio解析data
var $ = cheerio.load(data);

//将所有的img放到一个数组中
var meizi = $('.text img').toArray();
// var table = $('.tag-cloud tbody tr').toArray();
// table.forEach(function (e) {
// var tempTf = cheerio.load(e);
// var href1 = tempTf('td a').toArray();
// href1.forEach(function (tempHref) {
// console.log(tempHref.attribs.href);
// })
// })
for(var i = 0; i < meizi.length;i++){
//用循环读出数组中每个src
var imgSrc = meizi[i].attribs.src;
//通过path.baseUrlForFileName 来读取文件名
var fileName = path.basename(imgSrc);
//随后进行下载图片的操作
downLoadImg(imgSrc,fileName,function () {
console.log(fileName + 'done');
})
}
}
var downLoadImg = function (url,fileName,callBack) {
request.head(url,function (err,res,body) {
//返回图片的类型
console.log(("content-type:",res.headers["content-type"]));
//返回图片的大小
console.log(("content-length:",res.headers["content-length"]));
if(err){
console.log("err" + err);
return false;
}
console.log("res:" + res);
//下载文件的操作
request(url).pipe(fs.createWriteStream("/Users/hcnucai/Desktop/NodeDemo/images/" + fileName)).on('close',callBack);
})
}资源
http://chenxi.name/60.html https://cnodejs.org/topic/5203a71844e76d216a727d2e http://www.cnblogs.com/tianheila/p/5183733.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: