使用node.js抓取有路网图书信息(原创)
之前写过使用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抓取有路网图书信息(原创)的更多相关文章
- 使用python抓取有路网图书信息(原创)
以前挺喜欢去有路网买二手书的,但是有路网有个缺陷,就是放在图书列表中的书很多都没货了,尤其是一些热门的方向,比如android,在列表中的书大多都没有货了,你必须一个一个点进入查看详细信息才能得知图书 ...
- Node.js 抓取电影天堂新上电影节目单及ftp链接
代码地址如下:http://www.demodashi.com/demo/12368.html 1 概述 本实例主要使用Node.js去抓取电影的节目单,方便大家使用下载. 2 node packag ...
- Node.js抓取网页
前几天四六级成绩出来(然而我没考),用Node.js做了一个模拟表单提交并抓取数据的Web 总结一下用到的知识,简单的网页抓取大概就是这个流程了 发送Get或Post请求 表单提交,首先弄到原网页提交 ...
- node.js抓取数据(fake小爬虫)
在node.js中,有了 cheerio 模块.request 模块,抓取特定URL页面的数据已经非常方便. 一个简单的就如下 var request = require('request'); va ...
- node.js 抓取网页数据
var $ = require('jquery'); var request = require('request'); request({ url: 'http:\\www.baidu.com',/ ...
- Vue+node.js+express+mysql实例---对图书信息进行管理
一个简单的 CURD 实例 ---对图书信息进行管理 目录 1 开发环境 1.1 前端开发环境 1.2 后端开发环境 2 数据库设计和创建 2.1 数据库和表设计 2.2 book 表设计 2.3 s ...
- node.js 抓取
http://blog.csdn.net/youyudehexie/article/details/11910465 http://www.tuicool.com/articles/z2YbAr ht ...
- node.js抓取网上图片保存到本地
用到两个模块,http和fs var http = require("http");var fs = require("fs"); var server = h ...
- 爬虫:selenium + phantomjs 解决js抓取问题(一)
selenium模块主要用来做测试,模拟键盘.鼠标来操作浏览器. phantomjs 就像一个无界面的浏览器一样. 两个结合能很好的解决js抓取的问题. 测试代码: #coding=utf-8 fro ...
随机推荐
- Swiper Usage&&API
最近使用Swipe.js,发现中文的资料很少,试着翻译了一下.能力有限,翻译难免错漏,请指出,多谢!如果想获得国外较多而全的文档,还是用google. 一了解SwiperSwiper 是一款免费以及轻 ...
- 一天一个mysql函数(二) FIND_IN_SET()
in和FILD_IN_SET() 的区别: select id, list, name from table where FIND_IN_SET( 'daodao' , list) 所以如果list是 ...
- Java基础知识强化之网络编程笔记23:Android网络通信之 Volley(Google开源网络通信库)
联合网上资料学习:http://www.open-open.com/lib/view/open1451223702339.html 一.Volley的介绍 1. Volley简介 在这之前,我们在程序 ...
- javascript的变量、作用域和内存问题
基本类型和引用类型的值执行环境垃圾收集 ECMAScript 变量可能包含两种不同数据类型的值:基本类型值和引用类型值.基本类型值指的是简单的数据段引用类型值指那些可能由多个值构成的对象 基本数据类型 ...
- [置顶] 《MFC游戏开发》笔记一 系列简介
本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9299121 作者:七十一雾央 新浪微博:http:/ ...
- div容器内文本对齐--神奇的css
有时候使用一些css往往能达到意想不到的效果 最近需要在页面上显示读取的文本内容,中英文混杂着,我把它们统统抛到div中div设置了宽度,效果是相当糟糕,左对齐,右端长短不一,有的超出长度,有的不够长 ...
- vim 编辑器 打开GB2312、GBK文件乱码解决方法
安装好的操作系统一般都带有vim编辑器,但是默认不支持GB2312中文,打开文件出现乱码,解决办法如下. 1.打开以下文件 sudo vim /var/lib/locales/supported.d/ ...
- Ehcache(2.9.x) - Configuration Guide, Configuring Storage Tiers
About Storage Tiers Ehcache has three storage tiers, summarized here: Memory store – Heap memory tha ...
- EF4.1之Code first 的几种连接数据库的方式
通过代码 进行连接和创建数据库的方法主要分为两种: 1.使用用连接字符串(在配置文件里面): 连接字符串: <add name="DbEntities" connection ...
- Entity Framework 6.1-Code First
原文:Entity Framework 6.1-Code First Code First-代码优先,先创建好领域模型.新建MyDbContext继承DbContext.根据代码自动生成数据库 Cod ...