使用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 ...
随机推荐
- 项目源码--Android本地音乐播放器
下载源码 技术要点: 1.本地音乐播放与管理 2.支持在线下载 3.非库音频流的解码 4. UI控件的综合使用 5. HTTP通信模块 6. Mysql数据库的综合使用 7. 后台服务技术 8. 源码 ...
- 实例源码--Android简单音乐播放器源码
下载源码 技术要点: 1.本地音乐管理 2.在线音乐听歌.下载 3.音频流的解码 4. HTTP通信模块 5. Sqlite数据库 6. 源码带详细的中文注释 ...... 详细介绍: 1.本 ...
- CentOS 6.4 安装 thrift-0.9.3
前言 为了能给.NET的程序提供HBase访问接口需要在Hadoop/Spark集群上安装Thrift Thrift介绍 Thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发.它结合了功能强 ...
- 琐碎-关于hadoop2.2.0
HDFS模块功能 namenode:主节点,存储文件的元数据如文件名.文件目录结构.文件属性(生成时间.副本数.文件权限).以及每个文件的块列表和块所在的datanode等: datanode:在本地 ...
- Tick and Tick
The three hands of the clock are rotating every second and meeting each other many times everyday. F ...
- uva 10152 ShellSort 龟壳排序(希尔排序?)
今天状态总是很糟,这种题目卡了一天... 是不是休息时间太少了,头脑迟钝了... 名字叫希尔排序,我还以为跟它有关,还搜索了下资料. 只要找到trick就会发现是很水的题目.只要对比下就能找到哪些是移 ...
- oracle--number
1. oracle的number类型是oracle的内置类型之一,是oracle的最基础数值数据类型.在9iR2及其以前的版本中只支持一种适合存储数值数据的固有数据类型,在10g以后,才出现了两种新的 ...
- [未完成]关于Maven的使用总结
什么是maven 翻译为“专家”,“内行” Maven是跨平台的项目管理工具.主要服务于基于Java平台的项目构建,依赖管理和项目信息管理. 什么是理想的项目构建? 高度自动化,跨平台,可重用的组件, ...
- poj 2728 最优比率生成树
思路:设sum(cost[i])/sum(dis[i])=r;那么要使r最小,也就是minsum(cost[i]-r*dis[i]);那么就以cost[i]-r*dis[i]为边权重新建边.当求和使得 ...
- 如何通过wifi在android手机上安装调试应用
如何通过wifi在android手机上安装调试应用 1. 首先还是要打开手机的usb调试选项,并通过usb线连接手机.2. 然后执行“adb tcpip 5555”,把adb从usb模式切换到tcpi ...