- 浏览: 370787 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (159)
- java world (63)
- php (12)
- ruby/python (0)
- web front (5)
- linux (4)
- db (1)
- 创业 (1)
- 生活 (13)
- 工作 (5)
- web (3)
- js uploader (1)
- java web (1)
- groovy (11)
- groovy sql (1)
- groovy swingbuilder (0)
- groovy antbuilder (1)
- json jquery (1)
- dom html (1)
- java punit (1)
- websql (1)
- 移动 (2)
- angularjs (2)
- 团购 java groovy (1)
- groovy watch dog (1)
- web karma seajs (1)
- angularjs primeui (1)
- groovy http test (1)
- golang (1)
- gradle (1)
- groovy linux (1)
最新评论
-
tongfan:
有能跑起来的demo么?? 按照你的思路 和代码 做的de ...
通过bean parser实现spring scan groovy文件装载bean -
zhangyuxidd:
谢谢分享,好东西
下载了人家的数据——中国行政区编码(电话,区号等),分享一下 -
逍遥道人:
谢谢博主的慷慨分享,谢谢!
下载了人家的数据——中国行政区编码(电话,区号等),分享一下 -
noyce520:
给这种精神 赞一个。csdn老要分,,烦死了
下载了人家的数据——中国行政区编码(电话,区号等),分享一下 -
wwwqqeew:
LoveStart 写道
纯js实现浏览器图片选择预览、旋转、批量上传
RT——在大家做网站或GUI的业余时间,可能你会碰到这样的需求——
1. 为了推广,有目的地爬一些邮件,群发广告;
2. 做一个博客管理软件,同时管理新浪、网易、搜狐的个人博客;
3. 淘宝商家在推广一个新宝贝时候,根据关键词的热度对它进行标签标示;
4. 朋友参与一个网络投票活动,可能帮他刷点票;
5. 。。。。。
等等,这些东东,所谓“网络应用”乍一看没什么技术含量,当你通过网络得知“某一款淘宝客工具有近万用户,每个用户每月都要支付***”,一款商务快车(制造网络垃圾)的东东是那么地受推崇——你或许会感叹一声,现在的web啊。。。
Well,言归正传,要解决类似的需求,我抛个砖,大家可以拍砖,当然更欢迎补充——
1. 准备好你的Tools Box:
喜欢Web Spider的,去open-open.com上找几个热门的,通过文档学习这些东东偶就不累述了;
寻找一个自己熟悉的脚本语言(灵活点在这里好处你会慢慢发现的)——推荐PHP Ruby/Python——如果你和我一样有点少数人倾向,Groovy/Scala也不错;
浏览器的辅助,这个在一些复杂的http交互环境中更显得重要——推荐Firefox的HttpFox,还有就是Chrome自带的js调试面板和Network面板;
2. 编程语言上的工具:
这些需求好多都是在模拟Http请求,所以一个Http Client之类的库是不可少的——有的童鞋会想到HttpUnit(Java)的可以直接提供模拟浏览器文档模型和事件驱动,但当你用过你就知道,开源的js库能做到跨浏览器的还真不多。。。
更好的封装——CURL工具或Restful Client之类的库,这个看个人喜好,自己通过文档一样可以在HttpClient上弄出比如权限认证之类的。。。
和具体需求相关的一些专用工具或网络资源——比如Sina Weibo SDK,TaobaoClient等,一些代理IP列表。。。
3. 一个好的文本编辑器——你可以称它为一个IDE,但是对于脚本来说,像Eclipse/NetBeans/VS之类的,不如EditPlus Vim Notepad++ MadEdit Geany UltraEdit来的方便——别说你还没能熟练地运用其中的一款,恭喜你,你作为一个Coder还有很大的提升空间(题外话)——但当你真正熟悉其中一个时,你会爱死他的。。。
我以前的博客写过一些关于网络抓取、代理投票、门户网站登录发博等文章了,总得来说,其内容零零散散,代码也片片的,下面我以最近的一个淘宝上的需求为例说明下具体解决过程——
1. 需求:作为一个卖家,获取所有的会员信息记录和交易记录,从中分析出Email和手机号,然后进行邮件群发和短信群发以作推广。
2. 背景:如果你没接触过淘宝卖家的那些后台功能,没关系,我简单说下——Taobao提供的SDK中Email\手机号在API文档里是搞不出来的。Taotao提供一个发站内信和Email的工具,价格好像每封2分,如果会员有10000个,这个功能如果自己能搞了,可以省下200快钱呢!而且Taobao发站内信还做了时间间隔的限制(一段时间内至多发几次)
3. 思路:模拟登陆,模拟请求获取源码,然后分析——太俗套了,本质上还是Spider,哈哈,BS下自己。。。
4. 过程:我只提几个——
Taobao的用户密码:一般这帮网站都会用一堆加了密的Js对密码再进行加密然后再提交的,这个时候HttpFox就很有帮助了,具体使用有个小技巧——在Post Data里Copy All Rows然后再用正则替换下,就成了一个标准的请求参数Map了——别真一个个手工去敲;还有就是好多Form都有Token;
5. 参考:http://www.iteye.com/topic/593801
6. 代码(进行修改和整合的)——如果你想用多个类,更职责分明或更优美一点的话,一点都不是什么难事儿。
package app import groovy.sql.Sql import org.apache.http.HttpEntity import org.apache.http.HttpResponse import org.apache.http.client.ClientProtocolException import org.apache.http.client.HttpClient import org.apache.http.params.HttpProtocolParams import org.apache.http.client.methods.* import org.apache.http.impl.client.DefaultHttpClient import org.apache.http.entity.StringEntity import org.apache.http.util.EntityUtils import org.apache.http.client.entity.UrlEncodedFormEntity import org.apache.http.NameValuePair import org.apache.http.message.BasicNameValuePair def static String parseResp(HttpEntity respEntity){ String encoding = 'gbk' StringBuffer sb = new StringBuffer() BufferedReader reader = new BufferedReader( new InputStreamReader(respEntity.getContent(), encoding)) String line = null while ((line = reader.readLine()) != null) { sb.append(line) sb.append("\n") } return sb.toString() } def static String get(HttpClient httpclient, String host, String targetURL){ HttpGet gg = new HttpGet(host) gg.setURI(new URI(targetURL)) HttpResponse response = httpclient.execute(gg) HttpEntity respEntity = response.getEntity() String rr = parseResp(respEntity) if (respEntity != null) { respEntity.consumeContent() } return rr } def static String post(HttpClient httpclient, String targetURL, Map paramList){ String urlEncoding = 'gbk' HttpPost httppost = new HttpPost(targetURL) List<NameValuePair> nvps = new ArrayList<NameValuePair>() if(paramList){ paramList.each{k, v -> nvps.add(new BasicNameValuePair(k, v)) } } httppost.setEntity(new UrlEncodedFormEntity(nvps, urlEncoding)) HttpResponse response = httpclient.execute(httppost) HttpEntity respEntity = response.getEntity() String rr = parseResp(respEntity) if (respEntity != null) { respEntity.consumeContent() } return rr } // ****************************** String host = 'https://login.taobao.com/' // TODO String uu = '你的账户名' String seller_id = '你的卖家ID' // 这个通过HttpWatch看下就知道 // 这2个通过HttpWatch看下就知道 String pp = 'XXX' // 加过密的密码 String xxtid = 'XOR_1_000000000000000000000000000000_63584557457974767E740B7F' // tid // 表示全局的一个表单token String token = '' // 一共就一个实例 HttpClient httpclient = new DefaultHttpClient() // 如果不想把数据保存到数据库,这里也没什么事儿了 Map p = [ url:'jdbc:h2:~/h2-data/taobao_member', u:'u', p:'p', driver:'org.h2.Driver' ] Sql db = Sql.newInstance(p.url, p.u, p.p, p.driver) // 取得登陆token String r1 = get(httpclient, host, 'https://login.taobao.com/member/login.jhtml') (r1 =~ /_tb_token_' type='hidden' value='([^']+)'/).each{ token = it[1] } // 登陆Post的表单参数 Map params = [ TPL_username:uu, TPL_password:pp, TPL_redirect_url:'', tid:xxtid, _tb_token_:token, action:'Authenticator', event_submit_do_login:'anything', from:'tb', fc:'2', style:'default', support:'000001', CtrlVersion:'1,0,0,7', loginType:'4', minititle:'', minipara:'', pstrong:'', longLogin:'-1', llnick:'', sign:'', need_sign:'', isIgnore:'', popid:'', callback:'', guf:'', not_duplite_str:'', need_user_id:'', poy:'', gvfdcname:'10', from_encoding:'' ] // 登陆 post(httpclient, 'https://login.taobao.com/member/login.jhtml', params) // 根据会员关系管理的会员列表获取会员信息 //String rr = get(httpclient, host, 'http://ecrm.taobao.com/member/member_list.htm') //(rr =~ /_tb_token_' type='hidden' value='([^']+)'/).each{ // token = it[1] //} // //Map params_member_ll = [ // _tb_token_: token, // page: '1', // sellerId: seller_id, // buyerId: '', // maxAmount: '0', // minAmount: '0', // maxCount: '0', // minCount: '0', // memberInfo: '', // buyerNick: '', // relation: '0', // minTradeCount: '', // maxTradeCount: '', // minTradeAmount: '', // maxTradeAmount: '', // startTradeTime: '', // endTradeTime: '', // status: '0' //] // //int max_page = 100 //(1..max_page).each{ // List member_ll = [] // // params_member_ll.page = it + '' // String rr2 = post(httpclient, 'http://ecrm.taobao.com/member/member_list.htm', params_member_ll) // // // <a href="http://ecrm.taobao.com/member/member_detail.htm?seller_id=&buyer_id=372068812&status=1">837821089_88</a> // (rr2 =~ /<a href="(http:\/\/ecrm\.taobao\.com\/member\/member_detail\.htm\?seller_id=(\d+)&buyer_id=(\d+)&status=\d)">([^<]+)<\/a>/).each{ // Map item = [:] // item.url = it[1].replaceAll(/&/, '&') // item.seller_id = it[2] // item.buyer_id = it[3] // item.nick = it[4] // // member_ll << item // } // // member_ll.each{ // String dd = get(httpclient, host, it.url) // (dd =~ /买家姓名:<\/th>[^<]+<td>([^<]+)<\/td>/).each{gg -> // it.name = gg[1] // } // (dd =~ /买家性别:<\/th>[^<]+<td>([^<]+)<\/td>/).each{gg -> // it.gender = gg[1].trim() // } // (dd =~ /买家生日:<\/th>[^<]+<td>([^<]+)<\/td>/).each{gg -> // it.birth = gg[1] // } // (dd =~ /交易量(笔):<\/th>[^<]+<td>([^<]+)<\/td>/).each{gg -> // it.transf_num = gg[1] // } // (dd =~ /交易额(元):<\/th>[^<]+<td>([^<]+)<\/td>/).each{gg -> // it.transf_amount = gg[1] // } // (dd =~ /省份:<\/th>[^<]+<td>([^<]+)<\/td>/).each{gg -> // it.prov = gg[1] // } // (dd =~ /城市:<\/th>[^<]+<td>([^<]+)<\/td>/).each{gg -> // it.prov = gg[1] // } // (dd =~ /城市:<\/th>[^<]+<td>([^<]+)<\/td>/).each{gg -> // it.city = gg[1] // } // (dd =~ /电子邮箱:<\/th>[^<]+<td>([^<]+)<\/td>/).each{gg -> // it.email = gg[1] // } // (dd =~ /b_red_(\d+)\.gif/).each{gg -> // it.credit = gg[1] // } // } // member_ll.each{ // List args = [it.buyer_id, it.nick, it.name, it.gender, // it.prov, it.city, it.email, it.credit] // db.executeInsert("insert into taobao_member(uid, nick, name, gender, " + // "prov, city, email, credit) values (?,?,?,?,?,?,?,?)", args) // // println 'Add ok for ' + it.nick // } //} // 根据成功交易获取 联系人 手机 和收货地址 Map trade_param_ll = [ event_submit_do_query:'1', user_type:'1', pageNum:'1', isArchive:'false', order:'desc', order_type:'orderList', isArchiveDefault:'0', isQueryMore:'false', select_shop_name:'', isOwnOfficialShop:'false', sellerNumID:seller_id, '_fmt.q._0.a':'', '_fmt.q._0.bi':'', '_fmt.q._0.biz':'00:00', '_fmt.q._0.bizo':'', '_fmt.q._0.bizor':'00:00', '_fmt.q._0.b':'', '_fmt.q._0.au':'SUCCESS', '_fmt.q._0.c':'ALL', '_fmt.q._0.bizord':'', '_fmt.q._0.l':'ALL', '_fmt.q._0.t':'ALL', '_fmt.q._0.sh':'All', action:'itemlist/QueryAction', fromTag:'true' ] // TODO 这个交易的是总页数 int max_page = 100 (1..max_page).each{ List member_ll = [] trade_param_ll.pageNum = it + '' String rr2 = post(httpclient, 'http://trade.taobao.com/trade/itemlist/list_sold_items.htm', trade_param_ll) // <a href="http://trade.taobao.com/trade/detail/trade_item_detail.htm?bizOrderId=45055548819742&his=false" class="detail-link" target="_blank">详情</a> (rr2 =~ /<a href="(http:\/\/trade\.taobao\.com\/trade\/detail\/trade_item_detail\.htm[^"]+)" class="detail-link" target="_blank">/).each{ Map item = [:] item.url = it[1] member_ll << item } member_ll.each{ String dd = get(httpclient, host, it.url) (dd =~ /收货地址:<\/th>[^<]+<td>([^<]+)<\/td>/).each{gg -> it.info = gg[1] } (dd =~ /<span class="nickname">([^<]+)<\/span>/).each{gg -> it.nick = gg[1] } } member_ll.each{ def item = db.firstRow("select id from taobao_member_trade where info = ?", [it.info]) if(item){ println 'Skip trade for ' + it.nick }else{ List args = [it.info, it.nick] db.executeUpdate("insert into taobao_member_trade(info, nick) values (?,?)", args) println 'Add trade ok for ' + it.nick } } } httpclient.getConnectionManager().shutdown()
发表评论
-
通过bean parser实现spring scan groovy文件装载bean
2016-04-28 10:54 2011Spring使用groovy作为bean,官方用了lang标 ... -
只是自己放东西以供下载。。。
2011-10-19 20:32 0-jar E:/Program/node/jstd/JsT ... -
动态语言+约定,剩下的只需要文件系统就够了
2011-09-02 09:54 186最近在工作中一直用jdk1 ... -
jdk6的httpserver小试
2011-07-28 17:04 1690网上一堆例子,个人做一个,有下载,可以用模板的小例子。(Gro ... -
热切推荐对groovy感兴趣看这位老兄的blog
2011-07-08 22:21 1405解除groovy有很久一段时间了,自认为对groovy还是蛮了 ... -
Jdk不同版本编译时候碰到BigDecimal执行错误
2011-07-02 23:46 2233如果不是工作环境遇到,我估计自己肯定不会碰到和去查这样的问题的 ... -
groovy做单元测试(包括对groovy/java测试),如何集成到你现有的java项目中去
2011-06-06 01:43 1574标题党—— 1. 至于如何用groovy写现有java ... -
分析下如何集成QQ登陆到你自己的网站上——Java平台
2011-05-31 19:34 6946目的:如题。。。 准备工作: 1.找一个现成的OAu ... -
发布一个项目——Increx
2011-04-21 18:17 291翻翻以前写的blog的Title, 1. ... -
用Groovy做基于web的自动crud,比你想象得要简单得多
2011-04-18 17:22 1573如果你只是玩过play!或grails里演示crud的demo ... -
Groovy不是这么用的(或者说不一定这么用就是最好的)
2011-04-12 15:46 0一次面试,聊技术涉及到groovy时候,他提到几个问题: ... -
Java求职者——想说服技术主管你这个Javaer比其他Javaer强,难啊
2011-03-31 15:46 500接到一面试电话—— 简单了解点java基础和we ... -
刚阿里电面——被深深的BS了
2011-03-29 14:20 3799RT—— 有好多问题或涉及到的知识点由于基础不牢固—— ... -
基于JQuery和Base的一个WebOS的雏形——配合基于Java的服务端
2011-03-29 00:31 2638有个很模糊的录像,大家感兴趣的,先看下。 自己最近写写 ... -
最近面试时候碰到的算法题目,自己写一下,顺便和大家交流下groovy的语法糖
2011-03-21 13:51 1463题目都比较简单——用什么语言写,都不是重点——笔试中我都是狂省 ... -
Groovy——上了一个当——把String当List用
2011-03-09 16:21 165String str = '20001010' printl ... -
GAE上用H2结合Groovy——外推荐下我自己写的GAE用的框架
2011-02-23 15:46 1047见附件。eclipse工程(需要google sdk的)。 ... -
对于基于java的小型web应用部署方式感到失望。。
2011-01-11 19:51 329总是离不开servlet container和一个http / ... -
利用永中Office实现Word/Excel/PPT PDF转换
2010-12-25 00:28 1001这个思路挺酷的么? 再加上FlexPaper,在互联网 ... -
自动投票——种种
2010-11-04 00:46 1212最近闲余时间做了一些功能——主角本来是php的curl ext ...
相关推荐
电子商务平台的盈利模式分析——以拼多多为例 电子商务平台的盈利模式是指电子商务平台通过各种方式获取利润的方法和手段。随着电子商务的发展,电子商务平台的盈利模式也在不断演变和完善。本文将对电子商务平台的...
- 接下来的电商行业进入了崛起与发展期,这一时期以阿里巴巴和淘宝的成功为标志,推动了整个行业的迅猛发展。 - 最后是转型与升级期,电商行业从最初的B2B、B2C、C2C交易模式转向更加综合和多元化的服务营销,行业...
《基于电商平台为核心的互联网金融研究——以商业银行为例》 在当今数字化时代,互联网金融以其便捷、高效的特点,正在逐渐改变传统金融行业的运作模式。本研究主要探讨了以电商平台为核心的互联网金融的发展,以...
以淘宝为例,研究者可能会关注不同定位的店铺以及它们如何运用多模态话语来吸引顾客。比如,恒源祥和韩都衣舍的定位不同,分别针对中老年妈妈和更广泛的人群,他们采用的多模态话语方式也会有所不同。研究者通过分析...
本文将对这一主题进行深入的语言学分析,并针对淘宝平台上的实例提出优化建议。 首先,商品标题是多模态话语的核心组成部分,它需要简洁明了地传达商品的主要信息。在语言学角度,标题应具备关键词突出、语法完整和...
《农户的农产品电商行为现状及相关影响——以浙江为例的研究》这篇文档主要探讨了在信息技术日益发展的今天,浙江省农户参与农产品电子商务的行为特征、面临的问题以及这种行为对农户经济和社会生活的影响。...
电商网站如淘宝、京东等,拥有大量商品信息,价格、库存、用户评价等数据经常变动,分布式爬虫需要具备高效的数据抓取能力,同时遵守网站的使用规则,避免频繁的请求导致IP被封。 大数据存储和处理是分布式爬虫获取...
随着互联网经济的蓬勃发展,电商平台如淘宝和拼多多已经成为了人们日常生活中不可或缺的一部分。消费者购物行为的转变,不仅对电商平台提出了新的挑战,也为电商平台提供了提升客户粘性、增加重购率的新机遇。本研究...
【前端毕业设计——淘宝网】项目是一个以Vue2.0和Vuex为核心技术构建的电商网站,旨在模拟淘宝网的基本功能。在这个项目中,开发者利用现代前端技术栈,实现了用户友好的界面和交互,以及一些关键的电商特性。以下是...
【标题】"仿淘宝——阿里"揭示了一个项目的目标,即模仿淘宝网的界面设计和功能,为移动应用开发提供参考。这个项目可能是针对Android平台,因为文件名“taeandroid.git”暗示了它是一个Android项目的Git仓库。在IT...
业务系统方面,阿里巴巴主要包括淘宝、天猫、1688等子品牌,覆盖了B2B、C2C、B2C等多种交易模式,而京东则以京东商城为核心,涵盖图书、家电、服装等多个品类。两者的业务系统反映了各自的市场策略和目标群体。 ...
根据提供的文件信息,我们可以从《会员双十一运营手册(前站期)——淘宝商家平台事业部》这一文档中提炼出几个关键的知识点,主要集中在会员营销与会员体系构建方面: ### 一、会员体系的重要性和作用 #### 1. ...
数据分析是商业决策中不可或缺的一环,特别是在互联网广告领域。在这个案例中,我们关注的是一个针对淘宝平台广告点击数据的分析项目。目标是通过深入研究,揭示数据背后的模式和异常,以便为运营团队提供策略建议。...
#### 一、数据分析的网事【连载一】之淘宝试水——宝贝选择与描述分析 在电子商务领域,尤其是像淘宝这样的大型电商平台,数据分析扮演着至关重要的角色。本节内容主要讨论了如何通过数据分析来选择适合在淘宝平台...
为了有效地管理和利用这些数据,淘宝构建了一套基于Hadoop的数据应用开发平台——iData。该平台旨在降低数据开发的门槛,提高数据项目的开发效率,并通过数据开放,使得内外部用户都能成为数据专家。 iData平台的...
同时,作为淘宝开放平台TOP项目的唯一合作平台——阿里软件平台在其中也扮演着重要的角色,它将为开发者提供整套的淘宝API的附加服务:测试环境、技术咨询、产品上架、版本管理、收费策略、市场销售、产品评估等等。
随着信息技术的发展,人工智能正逐步融入日常生活,像图像识别技术在刷脸支付中的应用,大数据分析在淘宝购物体验中的运用,以及百度的“ALLINAI”战略等,都说明了人工智能在社会生活中的广泛应用。 在教育领域,...