著作权所有: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

NodeJS + PhantomJS 抓取页面信息以及截图

child_process.spawn 乱码?
从写 node.js 爬虫说起
Nodejs写一个简单爬虫

 

 

鼓捣phantomjs(二) node.js模块化集成的更多相关文章

  1. Node.js 模块化你所需要知道的事

    一.前言 我们知道,Node.js是基于CommonJS规范进行模块化管理的,模块化是面对复杂的业务场景不可或缺的工具,或许你经常使用它,但却从没有系统的了解过,所以今天我们来聊一聊Node.js模块 ...

  2. Node.js模块化教程

    Node.js模块化教程 下载安装node.js 创建项目结构 |-modules |-module1.js |-module2.js |-module3.js|-app.js|-package.js ...

  3. node.js 模块化

    模块是编写稍大一点点的程序 一般就会将代码模块化 在node.js中每一个文件就是一个模块,而文件路径就是模块名 怎么使用模块? 在编写某个模块是都有三个预先定义(require,exports,mo ...

  4. node.js模块化写法入门

    子模块的写法: function SVN(){ console.log('svn initialized'); return this; } function getInstance() { cons ...

  5. Node.js学习(第一章:Node.js安装和模块化理解)

    Node.js安装和简单使用 安装方法 简单的安装方式是直接官网下载,然后本地安装即可.官网地址:nodejs.org Windows系统下,选择和系统版本匹配的.msi后缀的安装文件.Mac OS ...

  6. node.js的特点与模块化开发

    node.js的代码都是构建在模块化开发的基础之上,模块化开始也是node.js的核心之一. node.js跳过了服务器,它自己不用建设在任何服务器软件之上,node.js的许多设计理念与经典架构(L ...

  7. JS模块化开发:使用SeaJs高效构建页面

    一.扯淡部分 很久很久以前,也就是刚开始接触前端的那会儿,脑袋里压根没有什么架构.重构.性能这些概念,天真地以为前端===好看的页面,甚至把js都划分到除了用来写一些美美的特效别无它用的阴暗角落里,就 ...

  8. 01 node.js,npm,es6入门

    Node.js安装 1.下载对应你系统的Node.js版本: https://nodejs.org/en/download/ 命令提示符下输入命令 node -v 会显示当前node的版本 快速入门 ...

  9. 《Node.js核心技术教程》学习笔记

    <Node.js核心技术教程>TOC \o "1-3" \h \z \u 1.章模块化编程 2019.2.19 13:30' PAGEREF _101 \h 1 08D ...

随机推荐

  1. TOJ2470

    #include <stdio.h> struct node{ int x; int y; int step; }first; int zx[4]={-1,0,1,0}; int zy[4 ...

  2. Servlet实现session读写

    前言     一个女人让他的程序员丈夫去商店买东西:你去附近的商店买些面包,如果有鸡蛋的话,买6个回来,这个丈夫买了6个面包回来,他的妻子大吃一惊:你为什么买了6个面包?! 程序员丈夫回答:因为他们有 ...

  3. falcon nodata 小坑一枚

    按照官方文档配置完一切正常,唯独 nodata, 明明有正常的数据,但是为什么 nodata 会认为是没收到呢 困扰许久,直到看了数据库中的数据才恍然大悟 falcon_portal库中的 hosts ...

  4. Github只下载某一目录的文件

    比如要下载: https://github.com/xubo245/SparkLearning/tree/master/docs 将“tree/master”改成“trunk https://gith ...

  5. RPC理解

    RPC,英文名称Remote Procedure Call Protocol,即远程过程通讯协议. 可以设想一种情况,有一个人,叫A,A想要翻开一本书,非常简单,让大脑控制自己两只手,轻易就可以看到书 ...

  6. javascript中创建对象的几种不同方法

    javascript中创建对象的几种不同方法 方法一:最直白的方式:字面量模式创建 <script> var person={ name:"小明", age:20, s ...

  7. 为Linux集群创建新账户,并配置hadoop集群

    转自:http://blog.csdn.net/bluesky8640/article/details/6945776 之前装python.jdk.hadoop都是用的root账户,这是一个绝对的失策 ...

  8. Vue的实时时间转换Demo

    Vue的实时时间转换Demo time.html: <!DOCTYPE html> <html lang="en"> <head> <me ...

  9. [转发] win8安装mindget mindmanger

    win8安装mindget mindmanger   1安装MindManager时,显示安装Visual C++ 2005 Redistributable时报错  解决方法:1.把安装程序移动到没有 ...

  10. Javac语法糖之Enum类

    枚举类在Javac中是被当作类来看待的. An enum type is implicitly final unless it contains at least one enum constant ...