node.js练手--抓百度贴吧妹子图

简介: 模拟的是 http://www.oschina.net/code/snippet_226106_23414 这个python程序只是用node.

模拟的是 http://www.oschina.net/code/snippet_226106_23414 这个python程序

只是用node.js翻写一遍,练习练习

var baidu_base_url = 'http://tieba.baidu.com';

var http = require('http');
var url = require('url').parse(baidu_base_url + '/f?ie=utf-8&kw=%E5%A7%90%E8%84%B1');
var iconv = require('iconv-lite');
var BufferHelper = require('bufferhelper');
var $ = require('jquery');
var _ = require('underscore');
var saveRoot = "O:\\baidu\\"; //保存文件的根目录
var fs = require('fs');

String.prototype.replaceAll = function(s1, s2) {
	var demo = this
	while (demo.indexOf(s1) != - 1)
	demo = demo.replace(s1, s2);
	return demo;
}

function htmlBufferget(Url, callback) {
	http.get(Url, function(res) {
		var bufferHelper = new BufferHelper();
		res.on('data', function(chunk) {
			bufferHelper.concat(chunk);
		});
		res.on('end', function() {
			callback(bufferHelper.toBuffer());
		});
	});
}

//获取页面
function htmlget(Url, callback) {
	http.get(Url, function(res) {
		var bufferHelper = new BufferHelper();
		res.on('data', function(chunk) {
			bufferHelper.concat(chunk);
		});
		res.on('end', function() {
			var html = iconv.decode(bufferHelper.toBuffer(), 'GBK');
			callback($(html));
		});
	});
}

// 获取帖子中的图片地址
function getTieZiImg(url, fold) {
	htmlget(url, function(html) {
		html.find('img.BDE_Image').each(function(i, el) {
			var $img = $(el);
			var imgUrl = $img.attr('src');
			htmlBufferget(imgUrl, function(buffer) {
				var fileName = fold + "/" + i + ".png";
				fs.writeFile(fileName, buffer, 'binary', function(err) {
					if (err) throw err ;
					console.log(fileName + '  File saved.');
				});
			});
		});
	});
}

//主方法
htmlget(url, function(html) {
	html.find('a.j_th_tit').each(function(i, el) {
		var $a = $(el);
		var tieziUrl = baidu_base_url + $a.attr("href");
		var foldID = $a.attr("href").toString().replaceAll("/p/", "");
		var title = $a.html();
		//目录中的特殊字符
		title = title.replaceAll("/", "");
		title = title.replaceAll("?", "");
		title = title.replaceAll(",", "");
		title = title.replaceAll(":", "");

		//使用闭包在for中模拟多个线程
		(function(tieziUrl, title, foldID) {
			_.delay(function() {
				var fold = saveRoot + title;
				var exists = fs.existsSync(fold);
				console.log(fold);
				if (!exists) {
					console.log("不存在目录" + fold);
					fs.mkdirSync(fold);
				}
				getTieZiImg(tieziUrl, fold);
			},
			10);
		})(tieziUrl, title, foldID);
	});
});

1) 用到了node-jquery需要VC++2010的支持。所以通过NPM下包的时候先确认有VC++2010(用到VCbuild.bat,别拿netframework4.0里的,没用)

2)修改保存目录



目录
相关文章
|
3月前
|
JavaScript 关系型数据库 MySQL
百度搜索:蓝易云【Node.js写接口连接MySQL数据库教程】
现在,你的Node.js应用已经启动,可以通过访问 `http://localhost:3000/users`来获取所有用户的信息。注意替换上述代码中的数据库连接信息为你自己的实际数据。
50 0
|
8月前
|
Web App开发 JavaScript 前端开发
百度搜索:蓝易云【CentOS7系统部署Node.js LTS V18.16.0]
Node.js是一款基于Chrome V8引擎的JavaScript运行环境,它可以在服务器端运行JavaScript脚本。在CentOS 7系统上部署Node.js可以为开发者提供更便捷的开发环境。本文将详细介绍CentOS 7系统部署Node.js LTS V18.16.0的步骤。
63 0
|
4月前
|
存储 JavaScript Linux
百度搜索:蓝易云【CentOS 8上使用NVM安装特定版本的Node.js教程】
现在,你已成功安装和切换到特定版本的Node.js。希望这个教程能够帮助你在CentOS 8上使用NVM安装特定版本的Node.js。
81 2
|
9月前
|
定位技术
echarts引入百度地图通过脚本bmap.min.js解决关闭底图可点功能的底层解决方案
echarts引入百度地图通过脚本bmap.min.js解决关闭底图可点功能的底层解决方案
68 0
|
5月前
|
JavaScript 定位技术 API
js调用百度地图api
js调用百度地图api
40 0
|
6月前
|
存储 JavaScript Linux
百度搜索:蓝易云【Alma Linux 9 上安装 Node.js 的 3 种不同安装教程!】
通过上述三种不同的安装教程,你可以在Alma Linux 9上安装Node.js。选择适合你的需求和喜好的方法进行安装,并确保在安装之后进行验证,以确保Node.js已成功安装。
287 0
|
7月前
|
JavaScript Linux
百度搜索:蓝易云【Centos7安装Node.js详细教程。】
另外,如果您需要全局安装Node.js模块,可能需要使用 `sudo`命令或以管理员身份运行相应命令。
187 0
|
7月前
|
JavaScript Linux
百度搜索:蓝易云【Linux之Cnetos7.6安装Vue.js教程。】
现在您已成功在CentOS 7.6上安装了Vue.js,并创建了一个新的Vue.js项目。您可以根据需要进行进一步的开发和配置。
47 0
|
9月前
|
数据可视化 搜索推荐 JavaScript
数据可视化大屏Echarts高级开发散点图实战案例分析(地图扩展插件bmap.min.js、散点图、百度地图控件、柱图、涟漪动图、条件判断颜色)
数据可视化大屏Echarts高级开发散点图实战案例分析(地图扩展插件bmap.min.js、散点图、百度地图控件、柱图、涟漪动图、条件判断颜色)
397 0
|
JavaScript 前端开发 API
百度收录自动推送js代码api制作版
百度收录自动推送js代码api制作版
545 0