著作权所有: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. 浅谈.NET,C#三层架构(自己总结)

     三层架构 常见架构: 三层(经典) MVC MVVM MVP   开发中常见的23种设计模式: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种: ...

  2. 网易云社区有奖问答活动第二期——技术领导力、深入分布式、PHP圣经、Linux运维、Unity……三月热点图书等你拿!

    网易云社区第二期有奖问答活动开始了!(第一期活动已结束:人工智能图书大抽奖!) 欢迎积极参与网易云社区,讨论问题,交流心得.我们本期准备了一批技术领域热点图书,送给参与社区的朋友们,将以抽奖的形式送出 ...

  3. Django 定时任务实现(django-crontab+command)

    一.编写自定义django-admin命令 注:利用django-admin自定义命令我们可以ORM框架对model进行操作,如:定时更新数据库,检测数据库状态..... Django为项目中每一个应 ...

  4. jzoj5925

    tj:這道題題解有錯 水法ac代碼如下: #include<bits/stdc++.h> using namespace std; typedef long long ll; ll t,n ...

  5. FastAdmin 前端页面传参

    如果我们需要自己在控制器中透传数据到JS中去,则可以使用控制器的assignconfig方法来透传,使用如下 $this->assignconfig('demo', ['name'=>'名 ...

  6. python 爬图 helloworld

    最近发现 吾志 上用户的头像都很个性,另外,对于没有把日记设为私密的用户,最后一天的日记是公开的,谁都可以查看. 所以,如果每天把所有可查看的日记爬一遍,那么-- 哈哈 以前对爬虫只是了解一点点,没有 ...

  7. Flask从入门到精通之Flask-Bootstrap的使用

    Bootstrap(http://getbootstrap.com/)是Twitter 开发的一个开源框架,它提供的用户界面组件可用于创建整洁且具有吸引力的网页,而且这些网页还能兼容所有现代Web 浏 ...

  8. [兼容]——IE 8 常见兼容性问题

    接触了一个PC端网页开发的项目,要求兼容到IE 8,遇到不少坑,在这里记录下: 1.IE8 的兼容性视图 bug描述:IE8有许多新更新,但微软为了兼容以前的IE浏览器,提出了"兼容性视图& ...

  9. 修正eth0,解决虚拟机桥接问题

    centos 中没有 ifcfg-eth0 配置文件的解决办法 1.也就是说是centos6改用NetworkManager方式管理网络了,可以运行如下命令进行确认: chkconfig --list ...

  10. JS滑动到页面底部

    window.scrollTo(0, document.documentElement.clientHeight); 该 window 对象在DOM有一个 scrollTo 滚动到打开窗口 的任意位置 ...