鼓捣phantomjs(二) node.js模块化集成
著作权所有:http://www.cnblogs.com/zeusro/
引用(爬虫)不给稿费的,切你jj
追忆似屎年华
在上一篇post(http://www.cnblogs.com/zeusro/p/4185196.html)里面,我留下了3个坑没有填平。
2模块化
加载到nodejs里面,用于批量采集。
方法:把变动的参数做成
3淘宝的反采集
4数据的持久化
其实呢,还有一个,就是中文编码的问题,
那么今天把其中2个解决了。持久化给个思路,反采集就算了,哥已经宣布弃坑了。
正文
模块化其实很简单。在采集模块(js)里面引入system就行了。
var system = require('system');
var url = system.args[1];
var filename = system.args[2];
第一个参数是我们运行的js,第二个参数开始才是我们真正用得到的。
phantomjs phantomcapture.js http://shop115235781.m.taobao.com/#list av
这样就简单完成了模块化。
那么在node那边,我们要做到的就是,要引用并运行这个模块。这里我用了node的child_process,每一个url开启一个子进程。
淘宝的反采集
这个才是我宣布弃坑的原因。我在每次调用waitfor超时之后都有去截屏处理的。而我开那么多个子进程捕获到的结果就是,要登录淘宝,还得输入验证码。。。要输入验证码,呵呵....
数据的持久化
楼主用SqlServer惯的。
node.js确实有连SqlServer的驱动(https://github.com/Azure/node-sqlserver),问题是那玩意我连接失败了。那个项目2年前最后一次提交代码。作者自己也说了,说是去放假了解决不了一些issue,其实看起来更像是弃坑的节奏。
那么我只能建议连芒果DB或者nosql了。
中文编码问题。
这个有人在私信里面问我。这个我其实一早就预料到了,因为之前在找资料的时候就有提到js的编码问题,这个是固有缺陷。解决这个问题,引入iconv-lite就行了。
这里,我使用了这玩意扩展了node的编码
// After this call all Node basic primitives will understand iconv-lite encodings.
iconv.extendNodeEncodings();
然后在进程通信那里
var buf = new Buffer(data, 'win1251');
buf.write(data, 'gbk');
console.log(buf.toString('gbk'));
这样就行了
代码
主进程node的代码如下
var colors = require('colors')
, jsdom = require('jsdom').jsdom
, async = require('async')
, http = require('http')
, fs = require('fs')
, jquery = fs.readFileSync("jquery-1.10.2.min.js", "utf-8")
, iconv = require('../node_modules/iconv-lite')
, phantom = require('phantomjs');
// After this call all Node basic primitives will understand iconv-lite encodings.
iconv.extendNodeEncodings();
var count = 0;
console.log('主进程开启');
var startTime = new Date().getTime();
var urls = new Array(
"http://shop100338207.m.taobao.com/#list",
"http://shop68291879.m.taobao.com/#list",
"http://shop115235781.m.taobao.com/#list",
"http://shop10199638.m.taobao.com/#list",
"http://shop67272667.m.taobao.com/#list",
"http://shop109683760.m.taobao.com/#list",
"http://shop33495993.m.taobao.com/#list",
"http://shop58501945.m.taobao.com/#list",
"http://shop62907168.m.taobao.com/#list",
"http://shop59495864.m.taobao.com/#list",
"http://shop60374631.m.taobao.com/#list"
);
for (var i = 0; i < urls.length; i++) {
console.log(("采集地址:" + urls[i]).red);
capture(urls[i]);
}
function capture(url) {
count++;
var spawn = require('child_process').spawn,
ls = spawn('phantomjs', ['phantomcapture.js', url, count]);
ls.stdout.on('data', function (data) {
var buf = new Buffer(data, 'win1251');
buf.write(data, 'gbk');
console.log(buf.toString('gbk'));
});
ls.stderr.on('data', function (data) {
//console.log('stderr: ' + data);
});
ls.on('close', function (code) {
if (code == 1) {
console.log('child process异常结束。目标:' + url);
}
});
}
坑
1在window平台上编译一些模块的时候要用到VS2010的MSbuild,我本来装2013的,但是不行。这货就是这么贱,要10版本的MSbuild,所以我只能老老实实去装个10版本了
最后啰嗦一下,如果出现啥不是内部或外部命令之类的,那肯定是你打开方式不对,没有弄系统环境变量。
著作权所有:http://www.cnblogs.com/zeusro/
引用(爬虫)不给稿费的,切你jj
参考链接
Node.js中的child_process及進程通信
iconv-lite
child_process.spawn 乱码?
从写 node.js 爬虫说起
Nodejs写一个简单爬虫
鼓捣phantomjs(二) node.js模块化集成的更多相关文章
- Node.js 模块化你所需要知道的事
一.前言 我们知道,Node.js是基于CommonJS规范进行模块化管理的,模块化是面对复杂的业务场景不可或缺的工具,或许你经常使用它,但却从没有系统的了解过,所以今天我们来聊一聊Node.js模块 ...
- Node.js模块化教程
Node.js模块化教程 下载安装node.js 创建项目结构 |-modules |-module1.js |-module2.js |-module3.js|-app.js|-package.js ...
- node.js 模块化
模块是编写稍大一点点的程序 一般就会将代码模块化 在node.js中每一个文件就是一个模块,而文件路径就是模块名 怎么使用模块? 在编写某个模块是都有三个预先定义(require,exports,mo ...
- node.js模块化写法入门
子模块的写法: function SVN(){ console.log('svn initialized'); return this; } function getInstance() { cons ...
- Node.js学习(第一章:Node.js安装和模块化理解)
Node.js安装和简单使用 安装方法 简单的安装方式是直接官网下载,然后本地安装即可.官网地址:nodejs.org Windows系统下,选择和系统版本匹配的.msi后缀的安装文件.Mac OS ...
- node.js的特点与模块化开发
node.js的代码都是构建在模块化开发的基础之上,模块化开始也是node.js的核心之一. node.js跳过了服务器,它自己不用建设在任何服务器软件之上,node.js的许多设计理念与经典架构(L ...
- JS模块化开发:使用SeaJs高效构建页面
一.扯淡部分 很久很久以前,也就是刚开始接触前端的那会儿,脑袋里压根没有什么架构.重构.性能这些概念,天真地以为前端===好看的页面,甚至把js都划分到除了用来写一些美美的特效别无它用的阴暗角落里,就 ...
- 01 node.js,npm,es6入门
Node.js安装 1.下载对应你系统的Node.js版本: https://nodejs.org/en/download/ 命令提示符下输入命令 node -v 会显示当前node的版本 快速入门 ...
- 《Node.js核心技术教程》学习笔记
<Node.js核心技术教程>TOC \o "1-3" \h \z \u 1.章模块化编程 2019.2.19 13:30' PAGEREF _101 \h 1 08D ...
随机推荐
- Algorithm 用各种语言写出n!的算法
写出n!的算法 C# 递归方式: class Program { static void Main(string[] args) { Console.WriteLine("请输入一个数!&q ...
- allowMultiQueries=true允许插入多条语句
在context.xml中,url写成url="jdbc:mysql://localhost:3306/fivecrowdsourcing?allowMultiQueries=true&qu ...
- docker 下载加速
执行这个命令: curl -SSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud. ...
- Mac OS 10.12 - 安装JAVA!
一,下载JDK: 下载地址:版本1.8.0 http://download.oracle.com/otn-pub/java/jdk/8u121-b13/e9e7ea248e2c4826b92b3f07 ...
- 1002. Find Common Characters
Given an array A of strings made only from lowercase letters, return a list of all characters that s ...
- MySQL中需要注意的几点
几个常用的命令: select database(); #查看当前所在的数据库. select user();#查看当前登录的用户 show global variables like " ...
- 压缩VBox虚拟机空间的方法
虚拟机使用久了就会发现虚拟文件越来越大,删除虚拟机中的文件之后物理主机的磁盘空间并不会相应减少,所以实际占用的空间并没有虚拟文件大小那么大,因此我们很有必要进行压缩.不过VirtualBox貌似没 ...
- Android Ble4.0开发
最近在做一个蓝牙的项目,是Blu4.0,Android系统支持是4.3版本以上(为此特地卖了个手机,). 当然也参考了不少大牛的的微博,说的都不错,再次特地感谢 http://blog.csdn.ne ...
- 【PaddlePaddle系列】手写数字识别
最近百度为了推广自家编写对深度学习框架PaddlePaddle不断推出各种比赛.百度声称PaddlePaddle是一个“易学.易用”的开源深度学习框架,然而网上的资料少之又少.虽然百度很用心地提供 ...
- JAVA 垃圾笔记一溜堆
精度只能从低精度 转到高精度.例如:float = 3.4;错误 默认小数在JAVA中是double. 即:从double高精度转到floag低精度错误!!将字符char加减乘除,默认对ASCII码运 ...