之前写过使用python抓取有路网图书信息,见http://www.cnblogs.com/dyf6372/p/3529703.html。

最近想学习一下Node.js,所以想试试手,比较一下http抓取上的性能,采用事件驱动的Node.js比python好一些,以下上代码(刚学还未优化):

var http = require('http');
var iconv = require('iconv-lite');
var url = require('./gb2312_url_encode.js'); function getHtmlOptions(path){
return {
hostname : 'www.youlu.net',
port : 80,
path : path,
method : 'GET',
headers : {
'User-Agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36'
}
}
} function getAllNumber(str){
var re = /共有图书数量\r\n\s*[0-9]*/;
var n_str = str.match(re)[0];
re = /[0-9]{1,}/;
return n_str.match(re)[0];
} function getDetailList(str){
var re = /\"\/\d+.*"/g;
var n_array = str.match(re);
//console.log(n_array);
var result_array = [];
if(n_array == null){
return [];
}
for(var i=0;i<n_array.length;i++){
var tmp = n_array[i];
re = /\d+/;
var tmp_item = tmp.match(re);
//console.log(tmp_item[0]);
if(result_array.indexOf(tmp_item[0])<0){
re = /alt=\".*\"/;
var n_tmp_item = tmp.match(re);
if(n_tmp_item == null) continue;
var book_name = n_tmp_item[0].substring(5);
book_name = book_name.substring(0,book_name.length-1);
result_array.push(tmp_item[0]);
searchDetail(tmp_item[0],book_name);
}
}
return result_array;
} function getRealBookNumber(str,book_name,url){
re = /startRequestBookBuyLink(.*)/;
n_array = str.match(re);
var num = n_array[0].split(',')[3];
num = num.substring(2,num.length-1);
if(num > 0){
console.log("------------------------------------");
console.log(book_name);
console.log("数目:"+num+" url:"+url);
}
} function firstSearch(query_book_name){
var options = getHtmlOptions('/search/result/default.aspx?isbn=&publisherName=&author=&bookName='+query_book_name);
var req = http.request(options,function(res){
if(res.statusCode != 200){
console.log("请求/search/result/default.aspx?isbn=&publisherName=&author=&bookName="+query_book_name+"发生错误了:请求返回非200,返回码:"+res.statusCode+"\n");
return;
} var chunks = [];
var size = 0; res.on('data',function(chunk){
chunks.push(chunk);
size += chunk.length;
}); res.on('end',function(){
var returnMsg = Buffer.concat(chunks,size);
var nreturnMsg = iconv.decode(returnMsg,'gb2312');
var allNumber = getAllNumber(nreturnMsg);
if(allNumber>0){
var allPage = (allNumber/20+0.5).toFixed(0);
console.log("该图书数目为:"+allNumber);
console.log("共有页数:"+allPage);
for(var i = 1; i<=allPage; i++){
searchEachPage(query_book_name,i,allNumber);
}
}else{
console.log("该图书数目为0."+"\n");
}
});
}); req.on('error', function(e) {
console.log('problem with request: ' + e.message);
}); req.end();
} function searchEachPage(query_book_name,pageIndex,rowCount){
var options = getHtmlOptions("/search/result/?isbn=&publisherName=&author=&bookName="+query_book_name+"&pageIndex="+pageIndex+"&rowCount="+rowCount+"&searchIn=");
var req = http.request(options,function(res){
if(res.statusCode != 200){
console.log("请求"+"/search/result/?isbn=&publisherName=&author=&bookName="+query_book_name+"&pageIndex="+pageIndex+"&rowCount="+rowCount+"&searchIn="+"发生错误了:请求返回非200,返回码:"+res.statusCode+"\n");
return;
} var chunks = [];
var size = 0; res.on('data',function(chunk){
chunks.push(chunk);
size += chunk.length;
}); res.on('end',function(){
var returnMsg = Buffer.concat(chunks,size);
var nreturnMsg = iconv.decode(returnMsg,'gb2312');
getDetailList(nreturnMsg);
});
}); req.on('error', function(e) {
console.log('problem with request: ' + e.message);
}); req.end();
} function searchDetail(detail_number,book_name){
var options = getHtmlOptions("/"+detail_number);
var req = http.request(options,function(res){
if(res.statusCode != 200){
console.log("请求"+"/"+detail_number+"发生错误了:请求返回非200,返回码:"+res.statusCode+"\n");
return;
} var chunks = [];
var size = 0; res.on('data',function(chunk){
chunks.push(chunk);
size += chunk.length;
}); res.on('end',function(){
var returnMsg = Buffer.concat(chunks,size);
var nreturnMsg = iconv.decode(returnMsg,'gb2312');
getRealBookNumber(nreturnMsg,book_name,"http://www.youlu.net/"+detail_number);
});
}); req.on('error', function(e) {
console.log('problem with request: ' + e.message);
}); req.end();
} var query_book_name= url.URLEncode('java');
firstSearch(query_book_name);

使用node.js抓取有路网图书信息(原创)的更多相关文章

  1. 使用python抓取有路网图书信息(原创)

    以前挺喜欢去有路网买二手书的,但是有路网有个缺陷,就是放在图书列表中的书很多都没货了,尤其是一些热门的方向,比如android,在列表中的书大多都没有货了,你必须一个一个点进入查看详细信息才能得知图书 ...

  2. Node.js 抓取电影天堂新上电影节目单及ftp链接

    代码地址如下:http://www.demodashi.com/demo/12368.html 1 概述 本实例主要使用Node.js去抓取电影的节目单,方便大家使用下载. 2 node packag ...

  3. Node.js抓取网页

    前几天四六级成绩出来(然而我没考),用Node.js做了一个模拟表单提交并抓取数据的Web 总结一下用到的知识,简单的网页抓取大概就是这个流程了 发送Get或Post请求 表单提交,首先弄到原网页提交 ...

  4. node.js抓取数据(fake小爬虫)

    在node.js中,有了 cheerio 模块.request 模块,抓取特定URL页面的数据已经非常方便. 一个简单的就如下 var request = require('request'); va ...

  5. node.js 抓取网页数据

    var $ = require('jquery'); var request = require('request'); request({ url: 'http:\\www.baidu.com',/ ...

  6. Vue+node.js+express+mysql实例---对图书信息进行管理

    一个简单的 CURD 实例 ---对图书信息进行管理 目录 1 开发环境 1.1 前端开发环境 1.2 后端开发环境 2 数据库设计和创建 2.1 数据库和表设计 2.2 book 表设计 2.3 s ...

  7. node.js 抓取

    http://blog.csdn.net/youyudehexie/article/details/11910465 http://www.tuicool.com/articles/z2YbAr ht ...

  8. node.js抓取网上图片保存到本地

    用到两个模块,http和fs var http = require("http");var fs = require("fs"); var server = h ...

  9. 爬虫:selenium + phantomjs 解决js抓取问题(一)

    selenium模块主要用来做测试,模拟键盘.鼠标来操作浏览器. phantomjs 就像一个无界面的浏览器一样. 两个结合能很好的解决js抓取的问题. 测试代码: #coding=utf-8 fro ...

随机推荐

  1. 如何手动添加Android Dependencies包

    在ADT16 之前可以在工程里面做关联,eclipse会在工程上自动添加ReferenceLibrary.新版本的ADT修改了第三方jar的导入方式,只需要在工程目录下新建libs文件夹,注意是lib ...

  2. Android基本控件之RadioGroup

    我们在手机上经常看到一堆选项,但是我们只能选择一个,那么在Android中,这个控件就叫做RadioButton,也就是单选按钮的意思,他们之所以能够达到只能选择一个的效果,是因为有一个RadioGr ...

  3. Frame Stacking 框架堆叠

    /* [题目来源]http://poj.org/problem?id=1128 [题目分析] 几张图片叠在一起,给出堆叠后的情况,要求出所有可能的从下到上的堆叠顺序. [思路分析] 1.题目已经很明确 ...

  4. ng中用$http接后台接口的异步坑

    最近笔者在一个项目中用ng去接后台的接口.因为前后端都是新手,前端的不懂后台,且没有经验:后端的不懂前端,也没有经验,然后接口bug百出,文档写得乱.一个接口,后台改了三次,我也是寸步难行. 首先来看 ...

  5. 无限滚动 --demo

    <!DOCTYPE HTML><html><head><meta http-equiv="Content-Type" content=&q ...

  6. linux配置LAMP

    VPS注意:最近在VPS安装过程中,MYSQL老是报错 dpkg: error processing package mysql-server-5.6 (--configure): subproces ...

  7. Oracle创建表空间、新建用户和授权

    通过pl/sql以sys用户登录到Oracle数据库上,然后执行菜单:文件/新建/命令窗口 ,打开一个命令窗口然后在该命令窗口中执行脚本创建和删除表空间 . 1.创建表空间 格式:  create t ...

  8. Redis 命令 - Keys

    DEL key [key ...] Delete a key 127.0.0.1:6379> SET foo hello OK 127.0.0.1:6379> DEL foo hello ...

  9. Git - Download for Linux and Unix

    It is easiest to install Git on Linux using the preferred package manager of your Linux distribution ...

  10. memcached缓存机制+微软缓存机制使用详解

    1. why Memcached 1.1   一台web服务器上,iis接收的请求数是有限的,当访问量超大的时候,网站访问就会遇到瓶颈了,处理方式就是运用多了服务器把请求数分流(集群),对外公布的就一 ...