刚开始使用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. C#中如何查找Dictionary中的重复值

    简介 在这篇帮助文档中,我将向你展示如何实现c#里字典中重复值的查找.你知道的对于一个老鸟来说,这是非常简单的代码.但是尽管如此,这也是一篇对c#初学者非常有用的帮助文档. 背景 多数程序员对小型数据 ...

  2. C语言清除输入缓存方法记录[转]

    原文:http://www.tomytime.com/archives/218/ fflush()函数是标准的作法. setbuf(stdin,NULL)是GCC下可用的一种方法. scanf(&qu ...

  3. 关于js unshift() 与pop() 功能

    最近在研究如何精简贪吃蛇代码,网上许多大神已经将其精简到30行之内就可以搞定. 我尝试着学习并且研究是否能进一步精简的方式. 偶然间又重新温习了一遍pop()和unshift() 的功能.(之前有学过 ...

  4. Hibernate中Entity实体类的写法

    记录下一个Entity类的写法,方便以后查阅: package com.bupt.auth.entity; import java.util.Date; import javax.persistenc ...

  5. 【风马一族_Java】使用java,画出任意大小的菱形

    public class rhombic { public static void main(String[] args){ /** * scriber()画菱形的方法,参数 9 是指菱形的对角线的长 ...

  6. JPA SQL 的复杂查询createNamedQuery

    @NamedNativeQueries({ @NamedNativeQuery( name = "getNativeNutShellInfo", //需要调用的name query ...

  7. Linux C 程序 进程控制(17)

    进程控制 1.进程概述现代操作系统的特点在于程序的并行执行.Linux是一个多用户多任务的操作系统.ps .pstree 查看进程进程除了进程id外还有一些其他标识信息,可以通过相应的函数获得.// ...

  8. 【Qt】Qt之设置QWidget背景色【转】

    简述 QWidget是所有用户界面对象的基类,这意味着可以用同样的方法为其它子类控件改变背景颜色. Qt中窗口背景的设置,下面介绍三种方法. 使用QPalette 使用Style Sheet 绘图事件 ...

  9. C# 测试代码运行时间

    一.新建一个控制台程序项目Test.exe using System; using System.Collections.Generic; using System.Linq; using Syste ...

  10. HBase多条件筛选查询方案

    最近的项目需要使用Hbase做实时查询,由于Hbase只支持一级索引,也就是使用rowkey作为索引查询,所以对于多条件筛选查询的支持不够,在不建立二级索引的情况下,只能使用Hbase API中提供的 ...