使用node的http模块实现爬虫功能,并把爬到的数据存入mongondb
刚开始使用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的更多相关文章
- python爬虫Scrapy(一)-我爬了boss数据
一.概述 学习python有一段时间了,最近了解了下Python的入门爬虫框架Scrapy,参考了文章Python爬虫框架Scrapy入门.本篇文章属于初学经验记录,比较简单,适合刚学习爬虫的小伙伴. ...
- 【网络爬虫】【java】微博爬虫(一):小试牛刀——网易微博爬虫(自定义关键字爬取微博数据)(附软件源码)
一.写在前面 (本专栏分为"java版微博爬虫"和"python版网络爬虫"两个项目,系列里所有文章将基于这两个项目讲解,项目完整源码已经整理到我的Github ...
- 【python网络编程】新浪爬虫:关键词搜索爬取微博数据
上学期参加了一个大数据比赛,需要抓取大量数据,于是我从新浪微博下手,本来准备使用新浪的API的,无奈新浪并没有开放关键字搜索的API,所以只能用爬虫来获取了.幸运的是,新浪提供了一个高级搜索功能,为我 ...
- python网络爬虫抓取动态网页并将数据存入数据库MySQL
简述以下的代码是使用python实现的网络爬虫,抓取动态网页 http://hb.qq.com/baoliao/ .此网页中的最新.精华下面的内容是由JavaScript动态生成的.审查网页元素与网页 ...
- Scrapy爬虫入门系列3 将抓取到的数据存入数据库与验证数据有效性
抓取到的item 会被发送到Item Pipeline进行处理 Item Pipeline常用于 cleansing HTML data validating scraped data (checki ...
- python网络爬虫(7)爬取静态数据详解
目的 爬取http://seputu.com/数据并存储csv文件 导入库 lxml用于解析解析网页HTML等源码,提取数据.一些参考:https://www.cnblogs.com/zhangxin ...
- Python使用Scrapy框架爬取数据存入CSV文件(Python爬虫实战4)
1. Scrapy框架 Scrapy是python下实现爬虫功能的框架,能够将数据解析.数据处理.数据存储合为一体功能的爬虫框架. 2. Scrapy安装 1. 安装依赖包 yum install g ...
- 爬虫从网页中去取的数据中包含 空格
爬虫从网页中爬取的数据中带了一个 这样的空格,使用trim()函数和replace(" ", "")去掉不了,找了一下资料发现,空格有两种一种是从键盘输入的对应 ...
- 今天用node的cheerio模块做了个某乎的爬虫
一时兴起,想做个爬虫,经过各种深思熟虑,最后选择了某乎,毕竟现在某乎的数据质量还是挺高的.说干就干 打开某乎首页,随便搜索了一串关键字,相关的问题和答案就展现在眼前,我就思考怎么把这些搜索结果 ...
随机推荐
- linux安装配置sendmail实现邮件发送
sendmail配置 yum -y update sendmail sendmail-cf SendMail相关目录1. 设定档目录:/etc/mail2. 记录档:/var/log/maillog3 ...
- MVC 增加手机站
首先在全局路由(RouteConfig)中加入以下图片中的代码.
- 理解C#系列 / 核心C# / 数据类型
数据类型 数据类型 C#把数据类型分为两种:值类型和引用类型. 值类型和引用类型 值类型的变量直接指向存储的值,引用类型的变量指向值的引用.[理解:引用就像一个柜子的号码牌,可以顺藤摸瓜找到柜子.假如 ...
- (转)从集中到分布,解读网络视频IT架构变迁
2006年以视频网站为代表的网络视频行业迅速崛起,IPTV.视频分享网站.视频搜索网站.提供视频服务的互动社区.交友.播客等等新兴媒体发展迅猛.网络视频行业现已成为众多资本机构关注与投资的焦点.但是在 ...
- STL学习笔记序言
笔者作为计算机科学与技术专业的学生,学习并使用C++已经有3年了.在接触STL之前的编程习惯是,所有程序的功能包括数据结构.算法等都是亲自实现,效率极其缓慢.后来从使用STL的vector开始慢慢的感 ...
- gprof
函数级耗时剖析.gprof不会说谎,仔细考虑下函数的实现细节. 准备工作 对单文件simulator.cpp编译 编译:g++ -g -pg simulator.cpp -o simulator.o ...
- ADO.NET笔记——调用存储过程
相关知识: 在ADO.NET访问SQL Server时,鼓励使用存储过程取代常规的SQL语句. 存储过程有下列优点: 存储过程中的SQL语句将会经过预先的解析和编译,然后存放在数据库服务器上行.调用的 ...
- shell编程基础练习
shell作为一个人机交互的接口,在Linux中发挥着很大的作用,而shell编程则是减轻系统工程师工作的利器,这里总结一下shell编程的主要内容(趁着程序运行的空档). 本文的基本结构是shell ...
- [WinForm]TextBox只能输入数字或者正浮点型数字
关键代码: /// <summary> /// 只能输入数字[KeyPress事件] /// </summary> /// <param name="textB ...
- 使用mysql关键字做类字段名报的错,花了我一个钟,坑啊
com.modelsystem.po.ProjectPlan@701faaedHibernate: insert into ld.project_plan (addTime, describe, ex ...