刚开始使用http中间件做爬虫其实蛮多坑的,最主要的坑就是编码问题,有很多中文网站的采用的gb2313的编码方式,这个在爬到的报文解析就很蛋碎,

因为http中间件对utf-8支持的比较好,所以针对这一点我们需要对于gb2312的网站做编码转换处理

这里我使用了mongoose,所以node执行js会先链接test数据库

这里爬了百度阅读的数据,但是爬下来的图片链接在本地网页是不能使用的,百度图片服务器做了请求筛选

代码如下:

/**
* Created by Myco on 2016/3/15.
*/
/*
* iconv-lite 模块能配合 http 模块以及 request 模块使用,却不能直接和 superAgent 模块使用。
* 因为 superAgent 是以 utf8 去取数据,然后再用 iconv 转也是不行的。
* 页面是 gbk 编码的,sres.text 已经是 decode 过了的结果,
* 也就是说它已经被转换成 utf8 了,再转换成 buffer 出来的结果必须是不正确的。
*/ var http = require('http');
//提供jquery的功能进行dom节点操作
var cheerio = require('cheerio');
var mongoose = require('mongoose');
//纯Javascript转换编码的模块 iconv-lite
var iconv = require('iconv-lite');
//bufferhelper是一个操作buffer的加强类
var Bufferhelper =require('bufferhelper');
//当前为mongon的表结构实例对象
var BookModel = require('../models/model/bookModel');
//创建一个数据库连接
mongoose.connect('mongodb://localhost/test');
//设置访问地址,百度是gb2312编码的数据,所以必须使用iconv.decode
var url = 'http://yuedu.baidu.com/' http.get(url,function(res){
var bufferhelper =new Bufferhelper();
res.on('data',function(data){
//返回的都是Buffer数据
console.log('------------下载中'+Buffer.isBuffer(data)+'-------------');
bufferhelper.concat(data);
});
res.on('end',function(){
console.log('------------结束-------------');
var html = iconv.decode(bufferhelper.toBuffer(),'GBK');
filtehtml(html);
});
}).on('error',function(){
console.log('获取数据失败!');
}) //html文档过滤出有效信息
function filtehtml(html){
//cheerio本身默认是转实体的,所以保证转换成功必须加参数{decodeEntities: false},和编码无关
var $ = cheerio.load(html,{decodeEntities: false});
var collist= $('.yd-reco-wrap');
console.log('------------数据收集-------------');
console.log('------------collist数据长度:'+collist.length+'-------------');
var data = [];
for(var i= 0,l=collist.length;i<l;i++){
var docObj= $(collist[i]);
var item = {};
item.bookColName = docObj.find('.mod-title').text();
item.categoryId = 999999;
var listObj = docObj.find('.book');
var booklist = [];
for(var q= 0,ql=listObj.length;q<ql;q++){
var bookObj = $(listObj[q]);
var bookData = {};
bookData.title = bookObj.find('.book-title').text();
bookData.currentPrice = bookObj.find('.book-price').text().replace('¥','');
bookData.src = bookObj.find('.book-cover .book-img')[0].attribs['data-src'];
bookData.author = bookObj.find('.book-card-author').text();
var url = bookObj.find('.book-card-wrap')[0].attribs.href;
if(url){
bookData.id = url.replace(/\/ebook\/|\?fr=index/g,'');
bookData.url = url;
}
add(bookData);
booklist.push(bookData);
}
item.booklist = booklist;
data.push(item);
}
} function add(bookData){
if(bookData.url){
http.get('http://yuedu.baidu.com/'+bookData.url,function(res){
var bufferhelper =new Bufferhelper();
res.on('data',function(data){
bufferhelper.concat(data);
});
res.on('end',function(){var html = iconv.decode(bufferhelper.toBuffer(),'GBK');
console.log(html);
var $ = cheerio.load(html,{decodeEntities: false});
var content = $('#bd .main .scaling-content p').text(); console.log(content);
});
}).on('error',function(){
console.log('获取数据失败!');
})
}
}
bookModel.js文件如下,实例化了mongondb表结构,并为表取名book(代码中引入了bookSchema.js文件,若使用如下代码,请注意js文件路径)
var mongoose = require('mongoose');
var bookSchema = require('../schema/bookSchema.js');
//指定数据库表名称为book
var BookModel = mongoose.model('book',bookSchema,'book'); module.exports = BookModel;
bookSchema.js 文件如下,主要是Schema定义mongondb的数据表结构和默认值
var mongoose = require('mongoose');

var bookSchema = new mongoose.Schema({
id:String,
src:String,//图片地址
title:{type:String,required:true},//书名,添加姓名非空约束
content:String,//内容
author:String,//作者
rq:{type:Number,default:0},//阅读量
price:{type:Number,min:0,max:1000},//价格,添加价格约束
isShow:{type:Boolean,default:true},//约束是否显示
classify:{type:String,enum:['青春','文学','历史','科幻','小说','言情','军事'],default:'青春'},//类型,枚举限定类型
currentPrice:{type:Number,default:0},//当前售价
comments_count:{type:Number,default:0},//评论数
meta:{//object类型时间对象
createDate:{
type:Date,
default:Date.now()
},
updateDate:{
type:Date,
default:Date.now()
}
}
},{versionKey:false});
module.exports = bookSchema;

使用node的http模块实现爬虫功能,并把爬到的数据存入mongondb的更多相关文章

  1. python爬虫Scrapy(一)-我爬了boss数据

    一.概述 学习python有一段时间了,最近了解了下Python的入门爬虫框架Scrapy,参考了文章Python爬虫框架Scrapy入门.本篇文章属于初学经验记录,比较简单,适合刚学习爬虫的小伙伴. ...

  2. 【网络爬虫】【java】微博爬虫(一):小试牛刀——网易微博爬虫(自定义关键字爬取微博数据)(附软件源码)

    一.写在前面 (本专栏分为"java版微博爬虫"和"python版网络爬虫"两个项目,系列里所有文章将基于这两个项目讲解,项目完整源码已经整理到我的Github ...

  3. 【python网络编程】新浪爬虫:关键词搜索爬取微博数据

    上学期参加了一个大数据比赛,需要抓取大量数据,于是我从新浪微博下手,本来准备使用新浪的API的,无奈新浪并没有开放关键字搜索的API,所以只能用爬虫来获取了.幸运的是,新浪提供了一个高级搜索功能,为我 ...

  4. python网络爬虫抓取动态网页并将数据存入数据库MySQL

    简述以下的代码是使用python实现的网络爬虫,抓取动态网页 http://hb.qq.com/baoliao/ .此网页中的最新.精华下面的内容是由JavaScript动态生成的.审查网页元素与网页 ...

  5. Scrapy爬虫入门系列3 将抓取到的数据存入数据库与验证数据有效性

    抓取到的item 会被发送到Item Pipeline进行处理 Item Pipeline常用于 cleansing HTML data validating scraped data (checki ...

  6. python网络爬虫(7)爬取静态数据详解

    目的 爬取http://seputu.com/数据并存储csv文件 导入库 lxml用于解析解析网页HTML等源码,提取数据.一些参考:https://www.cnblogs.com/zhangxin ...

  7. Python使用Scrapy框架爬取数据存入CSV文件(Python爬虫实战4)

    1. Scrapy框架 Scrapy是python下实现爬虫功能的框架,能够将数据解析.数据处理.数据存储合为一体功能的爬虫框架. 2. Scrapy安装 1. 安装依赖包 yum install g ...

  8. 爬虫从网页中去取的数据中包含&nbsp;空格

    爬虫从网页中爬取的数据中带了一个 这样的空格,使用trim()函数和replace(" ", "")去掉不了,找了一下资料发现,空格有两种一种是从键盘输入的对应 ...

  9. 今天用node的cheerio模块做了个某乎的爬虫

        一时兴起,想做个爬虫,经过各种深思熟虑,最后选择了某乎,毕竟现在某乎的数据质量还是挺高的.说干就干 打开某乎首页,随便搜索了一串关键字,相关的问题和答案就展现在眼前,我就思考怎么把这些搜索结果 ...

随机推荐

  1. Directadmin清空所有Tickets命令

    利用一条命令就快速实现了清空所有Tickets的方法,希望此例子对大家有帮助.     即可清空所有工单,包括系统提示 :> /usr/local/directadmin/data/admin/ ...

  2. Sql日期时间格式转换;取年 月 日,函数:DateName()、DATEPART()

    一.sql server2000中使用convert来取得datetime数据类型样式(全) 日期数据格式的处理,两个示例: CONVERT(varchar(16), 时间一, 20) 结果:2007 ...

  3. Spring IoC容器的设计—3—次线

    这里涉及的是主要接口关系,而具体的IoC容器都是在这个接口体系下实现的,比如DefaultListableBeanFactory,这个基本IoC容器的实现就是实现了ConfigurableBeanFa ...

  4. 6款基于SVG的HTML5CSS3应用和动画

    1.CSS3/SVG质感背景小图标 镂空效果图标按钮 今天我们来分享一款用CSS3和SVG实现的质感背景小图标,鼠标滑过图标时出现镂空的效果,并且有质感背景的描边,效果非常不错. 在线演示 源码下载 ...

  5. 9 款赏心悦目的 HTML5/CSS3 特效

    1.HTML5 WebGL实验,超酷的HTML5 Canvas波浪墙 这是一款HTML5 Canvas实验项目,也是波浪特效,只是这不是真正的水波,而是利用柱体高度的变化实现的波浪墙效果. 在线演示 ...

  6. 7款HTML5的精美应用教程让你立即爱上HTML5

    1,HTML5/jQuery雷达动画图表图表配置十分简单 分享一款很特别的HTML5图表,它是利用HTML5和jQuery的雷达动画图表,图表数据在初始化的时候带有一定动画. 在线演示 源码下载 2, ...

  7. How to Get Rid of /wordpress/ From your WordPress Site URL

    I brought up a website using wordpress, but I had to visit my website in a way I don't like -- www.e ...

  8. VS默认环境设置

    VS2010的工具菜单-->导入导出设置-->重置所有设置

  9. 解决Eclipse中Java工程间循环引用而报错的问题

    如果myeclipse  报如下错误 A cycle was detected in the build path of project 如果我们的项目包含多个工程(project),而它们之间又是循 ...

  10. JS input文本框禁用右键和复制粘贴功能的代码

    代码如下: function click(e) { if (document.all) { ||||) { oncontextmenu='return false'; } } if (document ...