使用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 ...
随机推荐
- 一条直线上N个线段所覆盖的总长度
原文:http://blog.csdn.net/bxyill/article/details/8962832 问题描述: 现有一直线,从原点到无穷大. 这条直线上有N个线段.线段可能相交. 问,N个线 ...
- Naive Bayes Algorithm
朴素贝叶斯的核心基础理论就是贝叶斯理论和条件独立性假设,在文本数据分析中应用比较成功.朴素贝叶斯分类器实现起来非常简单,虽然其性能经常会被支持向量机等技术超越,但有时也能发挥出惊人的效果.所以,在将朴 ...
- 深入分析 Linux 内核链表
转载:http://www.ibm.com/developerworks/cn/linux/kernel/l-chain/ 一. 链表数据结构简介 链表是一种常用的组织有序数据的数据结构,它通过指 ...
- Modified LCS
Input Output Sample Input 3 5 3 4 15 3 1 10 2 2 7 3 3 100 1 1 100 1 2 Sample Output 4 3 50超时代码,因为K很大 ...
- myEclipse6.5与数据库(SQL Server2008)连接遇到的问题(自己总结的干货)<用SSH框架的时候,用servlet+javabean+jsp的时候>
昨天因为学习SSH框架的搭建,时隔一年又重新遇到了myEclipse连接数据库的问题.废话不多说,上干货 (以下全部按照我遇到的问题的顺序,也就是没有顺序,就是任性) 请注意:这是在myEclipse ...
- const ;static;extern的使用与作用
const /** const :常量 const ...
- hadoop学习记录(三)HBase基本概念
这一次开始学习HBase数据库. 我用的是VMWare + ubuntu16.04 +Hbase1.1.5 +hadoop2.6.0的组合. 经过亲自安装验证,版本间没有发生冲突,可以进行学习和开发. ...
- 关于js判断鼠标移入元素的方向——上下左右
一开始我是这么想的,将待移入的元素分割四块,用mousemove获取第一次鼠标落入的区域来判断鼠标是从哪个方向进去的. 所以只要写个算法来判断鼠标的值落入该元素的区域就可以得出鼠标移入的方向,如下图: ...
- 转载js实现打印功能
<div id="print">打印的内容</div><a href="javascript:void(0)" onclick=& ...
- MyBatis(3.2.3) - Cache
Caching data that is loaded from the database is a common requirement for many applications to impro ...