鼓捣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 ...
随机推荐
- Docker容器的原理与实践 (下)
欢迎访问网易云社区,了解更多网易技术产品运营经验. Docker原理分析 Docker架构 镜像原理 镜像是一个只读的容器模板,含有启动docker容器所需的文件系统结构及内容Docker以镜像和在镜 ...
- JavaScript基础函数和词法分析以及常用的内置对象和使用方法(4)
day52 参考:https://www.cnblogs.com/liwenzhou/p/8004649.html 函数 函数定义 JavaScript中的函数和Python中的非常类似,只是定义方式 ...
- Elasticsearch系列(五)----JAVA客户端之TransportClient操作详解
Elasticsearch JAVA操作有三种客户端: 1.TransportClient 2.JestClient 3.RestClient 还有种是2.3中有的NodeClient,在5.5.1中 ...
- 初中级web前端工程师的面试题分享
1.html三栏布局有几种(就是左右固定,中间自适应) 浮动布局float.定位布局.flex布局.表格布局.css3栅栏布局 <style media="screen"&g ...
- 消息中间件(一)MQ详解及四大MQ比较
一.消息中间件相关知识 1.概述 消息队列已经逐渐成为企业IT系统内部通信的核心手段.它具有低耦合.可靠投递.广播.流量控制.最终一致性等一系列功能,成为异步RPC的主要手段之一.当今市面上有很多主流 ...
- 数据库中"DDL","DML","DCL"
sql组成:DDL:数据库模式定义语言,关键字:createDML:数据操纵语言,关键字:Insert.delete.updateDCL:数据库控制语言 ,关键字:grant.removeDQL:数据 ...
- 简单HOG+SVM mnist手写数字分类
使用工具 :VS2013 + OpenCV 3.1 数据集:minst 训练数据:60000张 测试数据:10000张 输出模型:HOG_SVM_DATA.xml 数据准备 train-images- ...
- apache2.4配置weblogic12c集群(linux环境)
首先确定环境已装apache2.4,没装的话可以看下这篇文章apache2.4一键脚本安装(linux环境) 1.下载apache分发模块mod_wl_24.so 下载apache2.4的weblog ...
- VSTO学习(四)——自定义Excel UI 转载
本专题概要 引言 自定义任务窗体(Task Pane) 自定义选项卡,即Ribbon 自定义上下文菜单 小结 引言 在上一个专题中为大家介绍如何创建Excel的解决方案,相信大家通过从上面一个专题之后 ...
- 剑指offer四十七之求1+2+3+...+n
一.题目 求1+2+3+...+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B:C). 二.思路 1.需利用逻辑与的短路特性实现递归终 ...