转载:PhotoRobot之Sohu相册
转载自:http://www.blogjava.net/andyyehoo/archive/2007/03/27/106691.aspx
<script type="text/javascript"> </script> <script type="text/javascript" src="http://www.blogjava.net/WebResource.axd?d=PyW-m2hLmppJ9byT1bYEqw2&t=633055676242031250"></script> <script language="JavaScript" type="text/javascript"> function ctlent(evt,id) { if(evt.ctrlKey && evt.keyCode == 13) { try { TempSave(id); } catch(ex) { } finally { __doPostBack('AjaxHolder$PostComment$btnSubmit','') } } }</script> <script language="JavaScript" type="text/javascript">function SetReplyAuhor(author){document.getElementById('AjaxHolder_PostComment_tbComment').value+="@"+author+"/n";document.getElementById('AjaxHolder_PostComment_tbComment').focus();return false}</script> <script type="text/javascript" src="http://www.blogjava.net/WebResource.axd?d=PN3YVKw-Ky20FbAsNYS9UM8XqUzPcwpd0&t=633055676242031250"></script> <script type="text/javascript" src="http://www.blogjava.net/ScriptResource.axd?d=Io4r5Qx-zmHysvkgwLW9yk7rUGj5M-geQRTOmI9WMPaWNcTLoZx7IpNZpIR4LFVQ0&t=633067253590781250"></script> <script type="text/javascript" src="http://www.blogjava.net/ScriptResource.axd?d=Io4r5Qx-zmHysvkgwLW9yk7rUGj5M-geQRTOmI9WMPaVSfXvXlH0xWaTv3M_TRDPzVKh75E08VU1&t=633067253590781250"></script> <script type="text/javascript"> </script>
万物皆代码
- BlogJava
- 首页
- 新随笔
- 联系
- 聚合
- 管理
随笔分类
- IT生活(1) (rss)
- Java(2) (rss)
- Python(2) (rss)
- software (rss)
随笔档案
- 2007年6月 (3)
- 2007年3月 (2)
文章档案
- 2007年3月 (1)
最新随笔
- 1. 硅谷:生机盎然的坟场
- 2. 牛刀小试,Spring 2.0的Transaction
- 3. OAS的Cookie问题
- 4. PhotoRobot之Sohu相册
- 5. Python九曲之五——正则表达式
最新评论 ![](http://www.blogjava.net/images/xml.gif)
PhotoRobot之Sohu相册
Posted on 2007-03-27 16:19 龙舞九天 阅读(181) 评论(0) 编辑 收藏 引用 所属分类: Python
这次的目标是sohu的相册,http://pp.sohu.com,免费相册,图片公园。它的首页,美女没有yahoo的那么多,但是比163的光秃秃好点,所以作为第二位。
Sohu使用的技术向来比较成熟稳健,而又有技术含量。例如很久以前,它的新闻和论坛就使用了CMS系统搭建,非常的规范。而博客则使用了Ajax技术,异步加载页面的不同部分,速度很快。所以在对它的相册动手之前,就做好了打硬仗的心理准备。
同样,先进入专辑的第一张图片,这样页面的图片信息比较明确,方便提取,随便找个美女相册进先
1. 定位图片source
照例,view page source,先看看有没有图片部分的源代码,还好,正常
<img id="photodisplay" src="http://img44.pp.sohu.com/images/2007/3/20/15/9/11205330d6b.jpg" title="点击图片查看下一张"
alt="post-3-1173601339.jpg_搜狐免费相册" border=0 hspace=02 vspace=02 />
</A>
没163那么变态,全部藏在javascript里面。这样还是比较简单,只要能够定位到翻页的代码,就可以比较简单和机械的提取相册图片了。
2. 定位上下页
这里遇到了麻烦,sohu的页面尽管给出很好的注释,
<!--这里是面包屑目录区&管理模块区--><!--面包屑目录区&管理模块区结束-->
但是都没能找到上下页的地方,怎么办?看看页面,发现有Ajax的踪迹,
<SCRIPT LANGUAGE="JavaScript" type="text/javascript">
<!--
function addContact(userId) {
var url = "/relations.jhtml?m=add&userId=" + userId;
var actionItem = new ActionItem();
new Ajax.Request(url,{method:'get', onLoading:actionItem.onLoading.bind(actionItem),onComplete:actionItem.jsonBack.bind(actionItem)});
}
//-->
</SCRIPT>
果然不好啃啊。
3. 下载js文件
利用firefox的CacheViewer,过滤后排序,找到了pp.sohu.com的相关十几个js文件,果然是庞大啊。但是都是那种去掉分行的, 非常的难看,回头用python写个程序,专门把它们变回远样。据称最好的js编辑器,Aptana居然没有代码排版功能,感觉有点废啊。
找了下gPhotoPage.nextPhoto,发现是都是在Photos.js中,这个js文件是个很重要的类,对photo的操作都是封装在里面,后面用到了一个地方,但是没有找到获得图片列表的操作。
4. 重新分析页面的源代码
在源代码的最后一部分,找到
function loadPage() {
var rpccall = new JSONRpcClient("/rpccall",null,null, "photoMgr");
photosList = rpccall.getAllPhotos(74529157)
gPhotoPage = new Photos(photosList.list,getPhotoIdFormUrl() != null ? getPhotoIdFormUrl() : 74529157);
gLoginUser = rpccall.getLoginUser();
initRequestPhoto(gPhotoPage, gPhotoPage.photo);
}
</script>
该部分是在body load的时候调用,呵呵,看了这里是关键了,通过JSON RPC调用,获得所有的photo列表,得来不费功夫,果然是越高级的东西就越方便。
5. JSON RPC
如果把它的javascript全部跑起来,当然可以获得一样的效果,不过太麻烦。即然用python,当然要用python来进行这个调用。
使用google,找到了jsonrpclib的开源项目,python和java一样,开源的支持就是多,这点我喜欢。
jsonrpclib只有一个py,非常小巧,但是倚赖于simplejson的包,jsonrpc主要是对json的远程调用的封装,而simplejson则是对json数据的解析,两个模块各司其责,清晰明了。
看看源代码的版权信息,寒一个
![](http://www.blogjava.net/Images/dot.gif)
#
#
# The JSON-RPC client interface is based on the XML-RPC client
#
# Copyright (c) 1999-2002 by Secret Labs AB
# Copyright (c) 1999-2002 by Fredrik Lundh
# Copyright (c) 2006 by Matt Harrison
原来这东西,国外99年就在研究了,自己现在才知道...
对于Ajax我没有什么经验,JSON RPC也没有,不过凭着程序员的直觉,进行使用测试。
网上例子不多,找到了两个例子
一个python例子
reply = s.echo("foo bar")
print reply
一个javaScript例子
jsonrpc.myObject.setName(“Vince”);
仔细研究这两个例子,再参考sohu的页面代码,猜到,其实
photosList = rpccall.getAllPhotos(74529157)
是json rpc 的一种javascript写法,可以改成
photosList = jsonrpc.photoMgr.getAllPhotos(74529157)
那么换成python就是
reply = s.photoMgr.getAllPhotos(74529157)
当然了,这个写法也是改了好几次才得到的,结果是好长的一个dict对象,看到结果的时候,我得意的笑,得意的笑..
动态语言的优势这个时候就体现了,同为动态语言的python和javascript,都是不需要什么类型强制转换,直接获得的对象,再调用方法就可以了,换成了严谨的java,要如何处理才好呢?恐怕要写长好几句了。
得到后就简单了,分析一下reply的dict结构,提取出imgList
imglist是个dict的list,每个dict中,最主要的就是hosturl和imgNames属性,imgNames属性一般有3个图片名,全 部下载后,结合photos.js的_getImgeUrl方法的分析,知道最后一个非空的,就是最大的图片,这个就是我需要的啦,剩下的事情就简单了。
imgSrcs = []
for imgurl in imglist:
hosturl = imgurl["hosturl"]
imgNames = imgurl["imgNames"].split(";")
for i in range(len(imgNames)-1, 0, -1):
if imgNames[i]:
imgSrc = hosturl + imgNames[i]
break
imgSrcs.append(imgSrc)
现在sohu的图片公园也没有防止外链了,直接用SimpleDownloader下载就可以了,至此,大功告成。
<script type="text/javascript"> // </script>
标题 | 请输入标题 | |||||||
姓名 | 请输入你的姓名 | |||||||
主页 | ||||||||
|
||||||||
内容(提交失败后,可以通过“恢复上次提交”恢复刚刚提交的内容) 请输入评论内容 | ||||||||
Remember Me? | ||||||||
登录 使用高级评论 新用户注册 返回页首 恢复上次提交 | ||||||||
[使用Ctrl+Enter键可以直接提交] | ||||||||
相关文章:
|
||||||||
<script type="text/javascript"></script> <script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"> </script> width="468" scrolling="no" height="60" frameborder="0" allowtransparency="true" hspace="0" vspace="0" marginheight="0" marginwidth="0" src="http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-4210569241504288&dt=1182934554015&lmt=1182934553&format=468x60_as&output=html&correlator=1182934554015&url=http%3A%2F%2Fwww.blogjava.net%2Fandyyehoo%2Farchive%2F2007%2F03%2F27%2F106691.aspx&color_link=6699CC&ad_type=text&ref=http%3A%2F%2Fwww.blogjava.net%2Fandyyehoo%2Farchive%2F2007%2F03%2F21%2F105330.html&cc=15&flash=9&u_h=1024&u_w=1280&u_ah=957&u_aw=1280&u_cd=32&u_tz=480&u_his=1&u_java=true&u_nplug=30&u_nmime=151" name="google_ads_frame"> |
||||||||
常用链接
- 我的随笔
- 我的评论
- 我参与的随笔
java
python
评论排行榜
- 1. Python九曲之五——正则表达式(0)
- 2. PhotoRobot之Sohu相册(0)
- 3. OAS的Cookie问题(0)
- 4. 牛刀小试,Spring 2.0的Transaction(0)
- 5. 硅谷:生机盎然的坟场(0)
阅读排行榜
- 1. PhotoRobot之Sohu相册(181)
- 2. Python九曲之五——正则表达式(135)
- 3. 牛刀小试,Spring 2.0的Transaction(63)
- 4. OAS的Cookie问题(45)
- 5. 硅谷:生机盎然的坟场(43)
posts - 5, comments - 0, trackbacks - 0, articles - 1
Copyright © 龙舞九天
<script type="text/javascript"> </script> <script type="text/javascript"> </script> <script type="text/javascript"> </script> <script type="text/javascript"> </script> <script src="http://www.blogjava.net/script/ShowHidden.js" type="text/javascript"></script>
转载:PhotoRobot之Sohu相册相关推荐
- PhotoRobot之Sohu相册
这次的目标是sohu的相册, http://pp.sohu.com,免费相册,图片公园.它的首页,美女没有yahoo的那么多,但是比163的光秃秃好点,所以作为第二位. Sohu使用的技术向来比较成熟 ...
- 七十八首适合相册视频的背景音乐
七十八首适合相册视频的背景音乐 转载▼ 记得初次接触相册视频制作时,没有意识到音乐的重要性,胡乱添加自己喜欢的音乐,结果很多时候相册总给人的感觉"不搭配",没法提起兴致继续下去. ...
- 汽车漫谈1:汽车的研发到制造过程
不同的汽车企业其汽车的研发流程略有不同,讲述一般的正向开发研发流程: 一:市场调研 一个全新车型的开发需要十几亿的大量资金投入,汽车公司一般会委托专门的市场调研公司对国内消费者的需求.喜好.习惯等做出 ...
- 数据治理-理论-1-基本概念
数据治理-理论-基本概念 为什么需要数据治理 数据治理概念 数据治理的目标 数据治理体系框架 数据治理管理措施 数据治理技术措施 转载 https://www.sohu.com/a/152614302 ...
- 一堂精彩的全息教学公开课!
转载http://www.sohu.com/a/226364907_415466 2018年3月21日,上海市松江区新桥中学迎来了一节别开生面的生物公开课,授课内容使用了最先进的全息教学系统.系统采用 ...
- C#之使用HttpClient的优解
转载http://www.sohu.com/a/123674135_467799 新工作入职不满半周,目前仍然还在交接工作,适应环境当中,笔者不得不说看别人的源码实在是令人痛苦.所幸今天终于将大部分工 ...
- 关于逾期率你所不知道的秘密
https://study.163.com/course/courseMain.htm?courseId=1005988013&share=2&shareId=400000000398 ...
- 无线通信的信道容量与带宽
采用更高的频率,以便获得更高的带宽和数据率 我们平常所说的"带宽"不是带宽,而是信道容量 而信道容量与带宽设计到两个公式 1.尼奎斯特公式 2.香浓公式 信道要搞清楚以上两个定理, ...
- 从重采样到数据合成:如何处理机器学习中的不平衡分类问题? 转载 2017年08月01日 17:09:03 标签: 机器学习 / 数据 719 转自:http://www.sohu.com/a/12
从重采样到数据合成:如何处理机器学习中的不平衡分类问题? 转载 2017年08月01日 17:09:03 标签: 机器学习 / 数据 719 转自:http://www.sohu.com/a/1293 ...
最新文章
- 算法-链表-给定一个数小于该值的在左边等于在中间大于的在右边
- 2021大厂面试高频100题最新汇总(附答案详解)
- 如果给你机会,阿里巴巴的中层职位和马云的专属司机,你怎么选?
- Sister Sharp
- SpringBoot 中 get/post 请求处理方式,以及requestboy为Json时的处理
- 仲裁时,年假有效期两年
- python语言的基本数据类型_python语言基本数据类型-深浅拷贝
- matlab中怎么计算信噪比,如何计算通信中的信噪比SNR
- RFID电子标签对于图书管理的应用
- spyglass 学习笔记之cdc check
- Didn't find class ...l on path: DexPathList
- Locality Sensitive Hashing ( LSH,局部敏感哈希 ) 详解
- Service Mesh框架选型对比分析:Linkerd、Envoy、Istio、Conduit
- 你们想要知道的跳一跳都在这了,23333333
- Hadoop集群上的Hive安装时进行初始化元数据信息出现错误HiveSchemaTool:Parsing failed. Reason: Missing required option:
- 饱受争议的闪电网络,能在2020年迎来大爆发吗?
- qconf 配置中心 php,QConf
- DNS服务器优化的几种方式
- 2020天池 “数字人体”视觉挑战赛_VNNI赛道_冠军_方案分享
- android官方语言,Kotlin都转正成Android官方语言了,你还不试一下?
热门文章
- typora上传图片
- python八枚硬币问题
- 相容或,排斥或的相关符号化问题,即排斥或在符号化时一定是只出现∧吗
- vue自定义指令---输入框禁止输入特殊字符
- 树袋熊无线网络打印服务器,树袋熊
- ie浏览器下载文件中文名称乱码
- luogu2161 SHOI2009 会场预约
- 计算机主板里的电池有什么用,电脑冷知识,你知道电脑主板上的小电池是做什么用的吗?...
- Charles 抓包工具 报You may need to configure your browser or application to trust the Ch......错误
- The supplied data appears to be in the OLE2 Format. You are calling the part of POI that deals with