利用nodejs+phantomjs+casperjs采集淘宝商品的价格

因为一些业务需求需要采集淘宝店铺商品的销售价格,但是淘宝详情页面的价格显示是通过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.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

时间: 2024-10-09 16:17:10

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

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

项目内容 本案例选择>> 商品类目:沙发: 数量:共100页  4400个商品: 筛选条件:天猫.销量从高到低.价格500元以上. 项目目的 1. 对商品标题进行文本分析 词云可视化 2. 不同关键词word对应的sales的统计分析 3. 商品的价格分布情况分析 4. 商品的销量分布情况分析 5. 不同价格区间的商品的平均销量分布 6. 商品价格对销量的影响分析 7. 商品价格对销售额的影响分析 8. 不同省份或城市的商品数量分布 9.不同省份的商品平均销量分布 注:本项目仅以以上几项分析为

python网络爬虫学习(六)利用Pyspider+Phantomjs爬取淘宝模特图片

本篇博文在编写时参考了http://cuiqingcai.com/2652.html,向作者表示感谢 一.新的问题与工具 平时在淘宝上剁手的时候,总是会看到各种各样的模特.由于自己就读于一所男女比例三比一的工科院校--写代码之余看看美女也是极好的放松方式.但一张一张点右键–另存为又显得太过麻烦而且不切实际,毕竟图片太多了.于是,我开始考虑用万能的python来解决问题. 我们先看看淘女郎页面的URL,https://mm.taobao.com/json/request_top_list.htm?

PHP采集淘宝商品

转载自:http://www.cnblogs.com/lywy510/p/3613528.html           http://www.cnblogs.com/lywy510/p/3613522.html           http://www.cnblogs.com/lywy510/p/3696177.html

利用Selenium爬取淘宝商品信息

一.  Selenium和PhantomJS介绍 Selenium是一个用于Web应用程序测试的工具,Selenium直接运行在浏览器中,就像真正的用户在操作一样.由于这个性质,Selenium也是一个强大的网络数据采集工具,其可以让浏览器自动加载页面,这样,使用了异步加载技术的网页,也可获取其需要的数据. Selenium模块是Python的第三方库,可以通过pip进行安装: pip3 install selenium Selenium自己不带浏览器,需要配合第三方浏览器来使用.通过help命

使用Selenium爬取淘宝商品

import pymongo from selenium import webdriver from selenium.common.exceptions import TimeoutException from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.wait im

淘宝商品列表以及商品详情数据抓取

前段时间老师让我爬取淘宝的商品列表以及其商品详情数据,期间遇到了很多问题.最困难的就是淘宝的价格数据是以Ajax异步加载的,这些数据暂时还没有能力获取到. 下面介绍一下基本思路. 首先,通过抓取商品列表的商品ID获取商品的身份标识,然后根据商品ID跳转到具体的商品列表,对其他属性进行抓取. 观察两条商品列表的URL: https://s.taobao.com/search?q=帽子&imgfile=&commend=all&ssid=s5-e&search_type=ite

Beatiful Soup获取淘宝商品详情

Beatiful Soup生成商品详情页面的剖析树, 主要函数:findAll(name=None, attrs={}, recursive=True, text=None, limit=None, **kwargs) 利用findAll先获取标签范围的内容,再利用正则表达式进行匹配输出. Beatiful Soup的中文文档: http://www.crummy.com/software/BeautifulSoup/bs3/documentation.zh.html#Searching%20t

python基础项目实战:selenium控制浏览器爬取淘宝商品信息

今天为大家介绍一个Python利用selenium打开浏览器的方式来爬取淘宝商品的信息,下面就来看看,关于selenium的知识点,是如何做到控制浏览器获取网站的信息 导入第三方库 关键词搜索 抓取索引页 大家在学python的时候肯定会遇到很多难题,以及对于新技术的追求,这里推荐一下我们的Python学习扣qun:784758214,这里是python学习者聚集地!!同时,自己是一名高级python开发工程师,从基础的python脚本到web开发.爬虫.django.数据挖掘等,零基础到项目实

ios 类似淘宝商品详情页面的效果

今天试着写ios 类似淘宝商品详情页面的效果 我用到的第三方库EGORefreshTableHeaderView下拉刷新的效果还有就是PWLoadMoreTableFooterView上拉加载更多 主要的思路在于UISCrollView两页,一页展示商品概况,另一页展示商品更多详情 首先,第一页的view包含一个UITableView,这个tableView实现PWLoadMoreTableFooterView中的delegate方法, 实现delegate代理方法的时候使用 - (void)s