casperjs淘宝网打不开打不开.

利用nodejs+phantomjs+casperjs采集淘宝商品的价格
编辑:www.fx114.net
本篇文章主要介绍了"利用nodejs+phantomjs+casperjs采集淘宝商品的价格",主要涉及到利用nodejs+phantomjs+casperjs采集淘宝商品的价格方面的内容,对于利用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,&
&&&&loadPlugins:&false&
});&br&&br&phantom.outputEncoding
2.打开具体的url
casper.start(url,&function()
&&casper.GetDetailUrl(url);
casper.GetDetailUrl
=&function(detailUrl)
  casper.thenOpen(detailUrl,&function()
  console.log(this.getCurrentUrl());
3.处理当前页面的所有sku价格与信息
casper.then(function&getPic()
= casper.evaluate(function&getProductFromPage()
&&&&return&$('ul[class*=&tb-img&]').children().size();
&&console.log(product);
&&for&(var&i
= 1; i &= i++) {
+= casper.getPrice(i) +&&|&;
&&var&item
=&new&Object();
&&item.price
&&item.numiid
=&this.getCurrentUrl();
&&casper.PostData(item);
});&br&&br&
casper.getPrice
=&function(index)
= casper.clickByImg(index);
return&'';
productPrice
= casper.evaluate(function&getPriceFromPage()
return&$('.tm-price').first().text().trim();
return&(dd
+&&_&&+
productPrice);
casper.clickByImg
=&function(index)
= require('casper').selectXP
=&'//*[@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');&
4.将最后处理后得到的结果提交到服务器上
casper.PostData
=&function(item)
&&casper.open('').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出场吧~
console.log('主进程开启');
var&startTime
=&new&Date().getTime();
= require('http');
https.get('',&function(res)
&&res.on('data',&function(d)
&&&&var&obj
= JSON.parse(d)
&&&&for&(var&i
= 0; i & obj.items. i++) {
&&&&&&capture(obj.items[i].detail_url);
}).on('error',&function(e)
&&console.error(e);
function&capture(url)
&&count++;
&&var&spawn
= require('child_process').spawn,
= spawn('casperjs',
['casperjs.js',
&&ls.on('close',&function(code)
&&&&if&(code
&&&&&&console.log('child
process异常结束。目标:'&+
  当然,这里我们的casperjs需要进行模块化处理的,其实就是让casperjs可以获取调用的参数啦
var&system
= require('system');
= system.args[4];
  以上,就是所有采集需要使用到的代码了!怎么样,是不是非常的彪悍啊,整个处理流程只用了区区100来行的代码,就搞定了所有的采集流程.
http://www.cnmiss.cn/?p=413
http://blog.csdn.net/sagomilk/article/details/
http://www.cnblogs.com/zeusro/p/4188229.html
http://casperjs.readthedocs.org/en/latest/modules/casper.html
一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!
二、互相尊重,对自己的言论和行为负责。
本文标题:
本页链接:用HtmlUnit爬取淘宝数据
作者:用户
浏览:808 次
http://jiuxu.taobao.com/比如我想爬取上面页面的所有宝贝链接如&ahref="http://item.taobao.com/item.htm?spm=a1z10.1.w50
http://jiuxu.taobao.com/比如我想爬取上面页面的所有宝贝链接如&ahref="http://item.taobao.com/item.htm?spm=a1z10.1.w994.1.fVp17O&id=&scene=taobao_shop"target="_blank"data-spm-wangpu-module-id="994"data-spm-anchor-id="a1z10.1.w994.1"&&imgsrc="http://img02.taobaocdn.com/imgextra/i2//TB2j6UraXXXXXaUXpXXXXXXXXXX_!!.jpg"width="621"height="442"border="0"alt=""&&/a&我想要http://item.taobao.com/item.htm?spm=a1z10.1.w994.1.fVp17O&id=&scene=taobao_shop这个内容HttpUtils没有渲染页面功能所以直接就放弃了(而且的确也抓不出我想要的内容)在使用Unit渲染页面的时候发现获得tbody内的信息不完整原因经过查询相关资料大致了解:因为有的js内容需要浏览器滚动下拉才会加载请问我要如何模拟浏览器的滚动下拉来加载页面上所有的js?参数设置如下://1启动JSwebClient.getOptions().setJavaScriptEnabled(true);//2禁用Css,可避免自动二次請求CSS进行渲染webClient.getOptions().setCssEnabled(false);//3启动客戶端重定向webClient.getOptions().setRedirectEnabled(true);//4js运行错誤時,是否拋出异常webClient.getOptions().setThrowExceptionOnScriptError(false);//5设置超时webClient.getOptions().setTimeout(50000);HtmlPagehtmlPage=webClient.getPage(url);//等待JS驱动dom完成获得还原后的网页webClient.waitForBackgroundJavaScript(10000);//网页內容/*System.out.println(htmlPage.asXml());*/webClient.closeAllWindows();returnhtmlPage.asXml();然后http://zarakara.tmall.com/这个页面用上述方法根本渲染不出所需的宝贝链接已经尝试过各种方法包括下面的phantomjs+casperjs虽然可以解析但是依然无法加载下面的内容还有什么百度蜘蛛谷歌蜘蛛。解决方案
解决方案二:这类脚本都比较复杂,实际上你很难搞到一个比较完备的脚本引擎。可以考虑用WebKit后台执行该页面,也就是用真正的浏览器来解析页面,然后抓取内容;缺点是开销较高。解决方案三:引用1楼ldh911的回复:这类脚本都比较复杂,实际上你很难搞到一个比较完备的脚本引擎。可以考虑用WebKit后台执行该页面,也就是用真正的浏览器来解析页面,然后抓取内容;缺点是开销较高。嗯哼,你说的方法试过,但是依然会遇到我上面说的问题:不向下滚动页面去激活那些js就无法获得里面的内容我前段时间用的Selenium+chromeDriver就是跟你类似的方法吧解决方案四:可以代码触发浏览器的滚动条下滚。不过总的来说是代价比较高。还有个方案:是研究并分析出该页面在发生滚动后,究竟向服务器发出了什么新的请求,是怎么增量刷出其它内容的。然后直接用程序去构造这个新的HTTP请求。不过这个方案估计难度不小。解决方案五:引用3楼ldh911的回复:可以代码触发浏览器的滚动条下滚。不过总的来说是代价比较高。还有个方案:是研究并分析出该页面在发生滚动后,究竟向服务器发出了什么新的请求,是怎么增量刷出其它内容的。然后直接用程序去构造这个新的HTTP请求。不过这个方案估计难度不小。多谢和同事讨论了一下决定放弃改用人工手工收集信息(这个成本比较小解决方案六:哈哈。不过以前也碰到项目最后决定还是人工算了的,性价比不合适。解决方案七:我猜多数行不通。淘宝这样的大公司肯定有防爬虫的机制。解决方案八:http://bbs.aliyun.com/read/169222.html?displayMode=1有没有遇到这样的问题,在win平台下或是本地eclipse下调试可以获取商品,但是部署在阿里云centos下却不可以
【云栖快讯】新年大招!云栖社区为在读大学生/研究生准备了一份学(huan)习(zhuang)攻略,发布博文即有机会赢得iPad mini 4等大奖,学习换装两不误!欢迎报名参与~&&
稳定可靠、可弹性伸缩的在线数据库服务,全球最受欢迎的开源数据库之一
6款热门基础云产品6个月免费体验;2款产品1年体验;1款产品2年体验
弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率
开发者常用软件,超百款实用软件一站式提供匿名用户不能发表回复!|2013年5月 总版技术专家分月排行榜第一
2016年7月 总版技术专家分月排行榜第二2016年3月 总版技术专家分月排行榜第二2015年12月 总版技术专家分月排行榜第二2014年8月 总版技术专家分月排行榜第二2014年7月 总版技术专家分月排行榜第二2013年6月 总版技术专家分月排行榜第二
2013年5月 总版技术专家分月排行榜第一
2016年7月 总版技术专家分月排行榜第二2016年3月 总版技术专家分月排行榜第二2015年12月 总版技术专家分月排行榜第二2014年8月 总版技术专家分月排行榜第二2014年7月 总版技术专家分月排行榜第二2013年6月 总版技术专家分月排行榜第二
2013年5月 总版技术专家分月排行榜第一
2016年7月 总版技术专家分月排行榜第二2016年3月 总版技术专家分月排行榜第二2015年12月 总版技术专家分月排行榜第二2014年8月 总版技术专家分月排行榜第二2014年7月 总版技术专家分月排行榜第二2013年6月 总版技术专家分月排行榜第二
2013年5月 总版技术专家分月排行榜第一
2016年7月 总版技术专家分月排行榜第二2016年3月 总版技术专家分月排行榜第二2015年12月 总版技术专家分月排行榜第二2014年8月 总版技术专家分月排行榜第二2014年7月 总版技术专家分月排行榜第二2013年6月 总版技术专家分月排行榜第二
匿名用户不能发表回复!|因为一些业务需求需要采集淘宝店铺商品的销售价格,但是淘宝详情页面的价格显示是通过js动态调用显示的.所以就没法通过普通的获取页面html然后通过正则或者xpath的方式获取到想到的信息了.所幸我们现在有了casperjs.这个是一个基于Phantomjs的库,而Phantomjs则是一个服务器端的js api的webkit浏览器.是不是很神奇?真的是.net的以外的世界很神奇,我们要多走去看看.好了,现在废话不多说,开始切入正题.首先就是就是几个相关库的安装.安装过程很简单,相关内容大家百度即可.在文章的底部我也会列出参考链接.我们先进行下简要的分析:具体的操作流程就是利用casperjs模拟鼠标点击商品的图片,然后网页显示对应的价格.默认情况是这样的,如果不点击颜色分类下的图片,则对应的促销价格也只是会显示一个区间.
而只要我们点击了颜色分类对应的图片之后,则会是下面的效果
那么我们具体的操作步骤应该是:1)打开具体的商品详情页2)获取到颜色分类下图片个数,然后依次模拟鼠标点击3)每点击一次图片,然后获取对应的促销价格4)保存每次操作后的结果到数据库或者本地文件中待下一步处理下面我们就来具体的一步步实现上面分析后所需要的步骤:1.初始化casperjsvar casper = require('casper').create({clientScripts: [&jquery.js&],verbose: false,logLevel: 'debug',pageSettings: {loadImages: false, // The WebPage instance used by Casper willloadPlugins: 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 &= i++) {str += casper.getPrice(i) + &|&;}var item = new Object();item.price =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').selectXP// 如果此商品缺货则跳出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. 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=413http://blog.csdn.net/sagomilk/article/details/http://www.cnblogs.com/zeusro/p/4188229.htmlhttp://casperjs.readthedocs.org/en/latest/modules/casper.html
最新教程周点击榜
微信扫一扫}

我要回帖

更多关于 淘宝图片打不开 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信