因为一些业务需求需要采集淘宝店铺商品的销售价格,但是淘宝详情页面的价格显示是通过js动态调用显示的.所以就没法通过普通的获取页面html然后通过正则或者xpath的方式获取到想到的信息了.

所幸我们现在有了casperjs.这个是一个基于Phantomjs的库,而Phantomjs则是一个服务器端的js api的webkit浏览器.是不是很神奇?真的是.net的以外的世界很神奇,我们要多走去看看.

好了,现在废话不多说,开始切入正题.

首先就是就是几个相关库的安装.安装过程很简单,相关内容大家百度即可.在文章的底部我也会列出参考链接.

我们先进行下简要的分析:

具体的操作流程就是利用casperjs模拟鼠标点击商品的图片,然后网页显示对应的价格.

默认情况是这样的,如果不点击颜色分类下的图片,则对应的促销价格也只是会显示一个区间.

而只要我们点击了颜色分类对应的图片之后,则会是下面的效果

那么我们具体的操作步骤应该是:

1)打开具体的商品详情页

2)获取到颜色分类下图片个数,然后依次模拟鼠标点击

3)每点击一次图片,然后获取对应的促销价格

4)保存每次操作后的结果到数据库或者本地文件中待下一步处理

下面我们就来具体的一步步实现上面分析后所需要的步骤:

1.初始化casperjs

var casper = require('casper').create({
clientScripts: ["jquery.js"],
verbose: false,
logLevel: 'debug',
pageSettings: {
loadImages: false, // The WebPage instance used by Casper will
loadPlugins: false // use these settings
}
}); phantom.outputEncoding = "gbk";//解决乱码问题

2.打开具体的url

/*
获取需要采集的url列表
*/
casper.start(url, function() {
casper.GetDetailUrl(url);
}); /*
打开具体url
*/
casper.GetDetailUrl = function(detailUrl) {
  casper.thenOpen(detailUrl, function() {
  console.log(this.getCurrentUrl());
}); };

  

3.处理当前页面的所有sku价格与信息

/*
处理当前页面的所有sku价格与信息
*/
casper.then(function getPic() { // console.log(this.getHTML()); // fs.write('123', this.getHTML(), 'w'); product = casper.evaluate(function getProductFromPage() {
return $('ul[class*="tb-img"]').children().size();
}); console.log(product); var str = ''
for (var i = 1; i <= product; i++) {
str += casper.getPrice(i) + "|";
} var item = new Object();
item.price = str;
item.numiid = this.getCurrentUrl(); casper.PostData(item); // fs.write('myfile.html', str, 'w'); //this.capture("4.png");
});

  

/*
获取商品的价格
*/
casper.getPrice = function(index) {
var dd = casper.clickByImg(index);
if (dd == -1) {
return '';
} productPrice = casper.evaluate(function getPriceFromPage() {
return $('.tm-price').first().text().trim();
}); return (dd + "_" + productPrice); }; /*
点击小图及获取此商品的data-value
*/
casper.clickByImg = function(index) { var x = require('casper').selectXPath;
// 如果此商品缺货则跳出
var path = '//*[@id="J_DetailMeta"]/div[1]/div[1]/div/div[4]/div/div/dl[1]/dd/ul/li[' + index + ']';
var outOfStock = this.getElementAttribute(x(path), 'class');
if (outOfStock == 'tb-out-of-stock')
return '-1'; this.click(x('//*[@id="J_DetailMeta"]/div[1]/div[1]/div/div[4]/div/div/dl[1]/dd/ul/li[' + index + ']/a')); return this.getElementAttribute(x(path), 'data-value'); // "data-value"
};

  

4.将最后处理后得到的结果提交到服务器上

/*
提交商品价格信息到服务器
*/
casper.PostData = function(item) { casper.open('http://XXX/UpdateItemsPrice').then(function() { this.fill("form", {
'numiid': item.numiid,
'value': item.price
}, false); this.capture('post.png');
this.click("#btnSave"); this.echo('GOT it1.' + item.numiid);
}); this.echo('GOT it2.' + item.numiid); this.wait(2000, function() {
this.echo("I've waited for a second.");
}); }

最后run即可.

casper.run();

通过以上4个步骤我们就能获取到单个链接下,所有sku的促销价格了.

现在还有个问题,就是我们的nodejs还没出场呢,不会把它忘记的,呵呵.

为什么这里casperjs都搞定了,还需要nodejs呢?那就是因为casperjs只能处理单个链接,如果有多条链接处理的话,就需要启动多个casperjs的实例来完成.

上面的所有代码都是casperjs的一个操作步骤,最后的一个run就是让这个实例按我们定义好的步骤来进行的一个完整的流程.

那么既然如果,我们就请nodejs出场吧~

var count = 0;
console.log('主进程开启');
var startTime = new Date().getTime(); var https = require('http'); /*
获取需要采集的url列表
*/
https.get('http://XXX/GetItemsList', function(res) {
// console.log("statusCode: ", res.statusCode);
// console.log("headers: ", res.headers); res.on('data', function(d) {
// process.stdout.write(d); var obj = JSON.parse(d) for (var i = 0; i < obj.items.length; i++) {
capture(obj.items[i].detail_url);
}
; }); }).on('error', function(e) {
console.error(e);
}); /*
启动casperjs读取单个url
*/
function capture(url) {
count++;
var spawn = require('child_process').spawn,
ls = spawn('casperjs', ['casperjs.js', url]); ls.on('close', function(code) {
if (code == 1) {
console.log('child process异常结束。目标:' + url);
} }); }

  当然,这里我们的casperjs需要进行模块化处理的,其实就是让casperjs可以获取调用的参数啦

var system = require('system');
var url = system.args[4];

  以上,就是所有采集需要使用到的代码了!怎么样,是不是非常的彪悍啊,整个处理流程只用了区区100来行的代码,就搞定了所有的采集流程.

参考链接:

http://www.open-open.com/lib/view/open1338375857589.html

http://www.cnmiss.cn/?p=413

http://blog.csdn.net/sagomilk/article/details/20800543

http://www.cnblogs.com/zeusro/p/4188229.html

http://casperjs.readthedocs.org/en/latest/modules/casper.html

利用nodejs+phantomjs+casperjs采集淘宝商品的价格的更多相关文章

  1. PHP采集淘宝商品

    项目需求: 1.通过PHP程序更新所采集淘宝商品的价格以及是否停售 数据表: CREATE TABLE `goods` ( `id` ) NOT NULL AUTO_INCREMENT , `type ...

  2. Linux C程序操作Mysql 调用PHP采集淘宝商品 (转)

    还是继续这个项目. 在上一篇Linux下利用Shell使PHP并发采集淘宝产品中,采用shell将对PHP的调用推到后台执行,模拟多线程. 此方法有一致命缺点,只能人工预判每个程序执行时间.如果判断时 ...

  3. Linux C程序操作Mysql 调用PHP采集淘宝商品

    还是继续这个项目. 在上一篇Linux下利用Shell使PHP并发采集淘宝产品中,采用shell将对PHP的调用推到后台执行,模拟多线程. 此方法有一致命缺点,只能人工预判每个程序执行时间.如果判断时 ...

  4. 利用Python爬虫爬取淘宝商品做数据挖掘分析实战篇,超详细教程

    项目内容 本案例选择>> 商品类目:沙发: 数量:共100页  4400个商品: 筛选条件:天猫.销量从高到低.价格500元以上. 项目目的 1. 对商品标题进行文本分析 词云可视化 2. ...

  5. Linux下利用Shell使PHP并发采集淘宝产品

    上次项目中用到<<PHP采集淘宝商品>> 此方法有一个缺点,就是执行效率问题.一个商品采集平均需要0.8秒.那10000个商品采集完需要2个半小时. 首先想到的解决办法是并发. ...

  6. Selenium+Chrome/phantomJS模拟浏览器爬取淘宝商品信息

    #使用selenium+Carome/phantomJS模拟浏览器爬取淘宝商品信息 # 思路: # 第一步:利用selenium驱动浏览器,搜索商品信息,得到商品列表 # 第二步:分析商品页数,驱动浏 ...

  7. 利用Selenium爬取淘宝商品信息

    一.  Selenium和PhantomJS介绍 Selenium是一个用于Web应用程序测试的工具,Selenium直接运行在浏览器中,就像真正的用户在操作一样.由于这个性质,Selenium也是一 ...

  8. selenium+PhantomJS 抓取淘宝搜索商品

    最近项目有些需求,抓取淘宝的搜索商品,抓取的品类还多.直接用selenium+PhantomJS 抓取淘宝搜索商品,快速完成. #-*- coding:utf-8 -*-__author__ =''i ...

  9. 使用Selenium爬取淘宝商品

    import pymongo from selenium import webdriver from selenium.common.exceptions import TimeoutExceptio ...

随机推荐

  1. 解决阿里云SLB无法添加https证书的问题

    私钥是在Linux中通过下面的openssl命令生成的: openssl req -new -newkey rsa:2048 -nodes -keyout cnblogs.key -out cnblo ...

  2. autocomplete实现联想输入,自动补全

    jQuery.AutoComplete是一个基于jQuery的自动补全插件.借助于jQuery优秀的跨浏览器特性,可以兼容Chrome/IE/Firefox/Opera/Safari等多种浏览器. 特 ...

  3. [2]. jekyll安装与应用

    一.ruby安装 这里在win下安装ruby,对应自己电脑的操作系统位数,如我的是64位,对应下载Ruby 2.0.0-p353 (x64)这个版本的ruby.然后安装过程就很简单了: 命令行下输入r ...

  4. [jQuery学习系列一]1-选择器与DOM对象

    前言: 好久没有更新博客了, 最近想复习下 之前学过的JS的相关内容, 也算是自己的一种总结. 知识长时间不用就会忘记, 多学多记多用!! 下面的程序都可以在下面的网站进行在线调试: http://w ...

  5. Atitit.如何选择技术职业方向

    Atitit.如何选择技术职业方向 1. 原则是应该如下的应该从以下指标判断1 1.1. 技术的长寿性(长生命周期1 1.2. 技术的普适性(市场份额)1 1.3. **属于open体系还是封闭体系? ...

  6. 海康威视 NET_DVR_FindFile NET_DVR_PlayBackByTime 尝试读取或写入受保护的内存,这通常指示其他内存已损坏

    从农民伯伯那下载的代码 NET_DVR_PlayBackByTime NET_DVR_FindFile 这两个方法执行不了 下面是我改的 经过测试了 [DllImport("HCNetSDK ...

  7. android eclipse关联源码,以及源码(代码)以及jar查看软件

    1.eclipse关联源码 步骤一:自已百度下载相应版本的源码,我这里是4.2也就是API=17的版本. 步骤二:找到你安装sdk的目录, G:\Program Files\adt-bundle-wi ...

  8. [推荐]Zookeeper大型分布式系统的可靠协调系统知识介绍

    [推荐]Zookeeper大型分布式系统的可靠协调系统知识介绍 基于Zookeeper的锁开发手册 http://wenku.baidu.com/view/acbb8fc6102de2bd960588 ...

  9. 阿里云产品介绍(二):云服务器ECS的孪生兄弟们

    上一篇介绍的云服务器ECS,是阿里云最基础的产品,也是每一个云计算厂商最基础的产品,俗称爆款.除了标准的云服务器,阿里云也不停的在推出面向特殊业务场地的云服务器,可以说是ECS的孪生兄弟们. 这一篇就 ...

  10. 了解Browserify

    Browserify是一个Javascript的库,可以用来把多个Module打包到一个文件中,并且能很好地应对Modules之间的依赖关系.而Module是封装了属性和功能的单元,是一个Javasc ...