转载自: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九曲之五——正则表达式

最新评论

PhotoRobot之Sohu相册

Posted on 2007-03-27 16:19 龙舞九天 阅读(181) 评论(0)  编辑 收藏 引用 所属分类: Python


这次的目标是sohu的相册,http://pp.sohu.com,免费相册,图片公园。它的首页,美女没有yahoo的那么多,但是比163的光秃秃好点,所以作为第二位。

Sohu使用的技术向来比较成熟稳健,而又有技术含量。例如很久以前,它的新闻和论坛就使用了CMS系统搭建,非常的规范。而博客则使用了Ajax技术,异步加载页面的不同部分,速度很快。所以在对它的相册动手之前,就做好了打硬仗的心理准备。

同样,先进入专辑的第一张图片,这样页面的图片信息比较明确,方便提取,随便找个美女相册进先

http://pp.sohu.com/photo.jhtml?method=view&id=74529157#74529157

1. 定位图片source

照例,view page source,先看看有没有图片部分的源代码,还好,正常

<A id="photoHref" href="javascript:gPhotoPage.nextPhoto(onPhotoChange);">
    <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.    重新分析页面的源代码

在源代码的最后一部分,找到

        <script type="text/javascript">
            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数据的解析,两个模块各司其责,清晰明了。

看看源代码的版权信息,寒一个

            # a port of xmlrpclib to json.
            #
            #
            # 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例子

                s = jsonrpclib.ServerProxy("http://jsolait.net/services/test.jsonrpc")
                reply = s.echo("foo bar")
                print reply

一个javaScript例子

                var jsonrpc = new  JSONRpcClient("/<%=ApplicationHelper.getWebAppName(request)%>/JSON-RPC");
                jsonrpc.myObject.setName(“Vince”);

仔细研究这两个例子,再参考sohu的页面代码,猜到,其实

                var rpccall = new JSONRpcClient("/rpccall",null,null, "photoMgr");
                photosList = rpccall.getAllPhotos(74529157)

是json rpc 的一种javascript写法,可以改成

                var jsonrpc = new JSONRpcClient("/rpccall");
                photosList = jsonrpc.photoMgr.getAllPhotos(74529157)

那么换成python就是

                s = jsonrpclib.ServerProxy("http://pp.sohu.com/rpccall")
                reply = s.photoMgr.getAllPhotos(74529157)

当然了,这个写法也是改了好几次才得到的,结果是好长的一个dict对象,看到结果的时候,我得意的笑,得意的笑..

动态语言的优势这个时候就体现了,同为动态语言的python和javascript,都是不需要什么类型强制转换,直接获得的对象,再调用方法就可以了,换成了严谨的java,要如何处理才好呢?恐怕要写长好几句了。

得到后就简单了,分析一下reply的dict结构,提取出imgList

            imglist = reply.get('result').get('list'))

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>

<script type="text/javascript"> function pageLoad() { Sys.WebForms.PageRequestManager.getInstance().add_initializeRequest(handleInitializeRequest); //Sys.WebForms.PageRequestManager.getInstance().add_endRequest(handleEndRequest); } function handleInitializeRequest(sender, args) { var prm = Sys.WebForms.PageRequestManager.getInstance(); var eid = args.get_postBackElement().id; if (eid.indexOf("DeleteLink")>0) { args.get_postBackElement().innerHTML = "正在删除..."; } else if (eid.indexOf("btnSubmit")>0) { document.getElementById("AjaxHolder_PostComment_ltSubmitMsg").innerHTML="正在提交..."; document.getElementById("AjaxHolder_PostComment_btnSubmit").disabled = true; } else if(eid.indexOf("refreshList")>0) { document.getElementById("AjaxHolder_PostComment_refreshList").innerHTML="正在刷新..."; } } function TempSave(ElementID) { try { CommentsPersistDiv.setAttribute("CommentContent",document.getElementById(ElementID).value); CommentsPersistDiv.save("CommentXMLStore"); } catch(ex) { } } function Restore(ElementID) { CommentsPersistDiv.load("CommentXMLStore"); document.getElementById(ElementID).value=CommentsPersistDiv.getAttribute("CommentContent"); } </script>

刷新评论列表
     
标题 请输入标题
姓名 请输入你的姓名
主页  
请输入验证码
验证码 *
内容(提交失败后,可以通过“恢复上次提交”恢复刚刚提交的内容) 请输入评论内容
Remember Me?
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
[使用Ctrl+Enter键可以直接提交]
相关文章:

  • PhotoRobot之Sohu相册
  • Python九曲之五——正则表达式
 

<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相册相关推荐

  1. PhotoRobot之Sohu相册

    这次的目标是sohu的相册, http://pp.sohu.com,免费相册,图片公园.它的首页,美女没有yahoo的那么多,但是比163的光秃秃好点,所以作为第二位. Sohu使用的技术向来比较成熟 ...

  2. 七十八首适合相册视频的背景音乐

    七十八首适合相册视频的背景音乐 转载▼ 记得初次接触相册视频制作时,没有意识到音乐的重要性,胡乱添加自己喜欢的音乐,结果很多时候相册总给人的感觉"不搭配",没法提起兴致继续下去. ...

  3. 汽车漫谈1:汽车的研发到制造过程

    不同的汽车企业其汽车的研发流程略有不同,讲述一般的正向开发研发流程: 一:市场调研 一个全新车型的开发需要十几亿的大量资金投入,汽车公司一般会委托专门的市场调研公司对国内消费者的需求.喜好.习惯等做出 ...

  4. 数据治理-理论-1-基本概念

    数据治理-理论-基本概念 为什么需要数据治理 数据治理概念 数据治理的目标 数据治理体系框架 数据治理管理措施 数据治理技术措施 转载 https://www.sohu.com/a/152614302 ...

  5. 一堂精彩的全息教学公开课!

    转载http://www.sohu.com/a/226364907_415466 2018年3月21日,上海市松江区新桥中学迎来了一节别开生面的生物公开课,授课内容使用了最先进的全息教学系统.系统采用 ...

  6. C#之使用HttpClient的优解

    转载http://www.sohu.com/a/123674135_467799 新工作入职不满半周,目前仍然还在交接工作,适应环境当中,笔者不得不说看别人的源码实在是令人痛苦.所幸今天终于将大部分工 ...

  7. 关于逾期率你所不知道的秘密

    https://study.163.com/course/courseMain.htm?courseId=1005988013&share=2&shareId=400000000398 ...

  8. 无线通信的信道容量与带宽

    采用更高的频率,以便获得更高的带宽和数据率 我们平常所说的"带宽"不是带宽,而是信道容量 而信道容量与带宽设计到两个公式 1.尼奎斯特公式 2.香浓公式 信道要搞清楚以上两个定理, ...

  9. 从重采样到数据合成:如何处理机器学习中的不平衡分类问题? 转载 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 ...

最新文章

  1. 算法-链表-给定一个数小于该值的在左边等于在中间大于的在右边
  2. 2021大厂面试高频100题最新汇总(附答案详解)
  3. 如果给你机会,阿里巴巴的中层职位和马云的专属司机,你怎么选?
  4. Sister Sharp
  5. SpringBoot 中 get/post 请求处理方式,以及requestboy为Json时的处理
  6. 仲裁时,年假有效期两年
  7. python语言的基本数据类型_python语言基本数据类型-深浅拷贝
  8. matlab中怎么计算信噪比,如何计算通信中的信噪比SNR
  9. RFID电子标签对于图书管理的应用
  10. spyglass 学习笔记之cdc check
  11. Didn't find class ...l on path: DexPathList
  12. Locality Sensitive Hashing ( LSH,局部敏感哈希 ) 详解
  13. Service Mesh框架选型对比分析:Linkerd、Envoy、Istio、Conduit
  14. 你们想要知道的跳一跳都在这了,23333333
  15. Hadoop集群上的Hive安装时进行初始化元数据信息出现错误HiveSchemaTool:Parsing failed. Reason: Missing required option:
  16. 饱受争议的闪电网络,能在2020年迎来大爆发吗?
  17. qconf 配置中心 php,QConf
  18. DNS服务器优化的几种方式
  19. 2020天池 “数字人体”视觉挑战赛_VNNI赛道_冠军_方案分享
  20. android官方语言,Kotlin都转正成Android官方语言了,你还不试一下?

热门文章

  1. typora上传图片
  2. python八枚硬币问题
  3. 相容或,排斥或的相关符号化问题,即排斥或在符号化时一定是只出现∧吗
  4. vue自定义指令---输入框禁止输入特殊字符
  5. 树袋熊无线网络打印服务器,树袋熊
  6. ie浏览器下载文件中文名称乱码
  7. luogu2161 SHOI2009 会场预约
  8. 计算机主板里的电池有什么用,电脑冷知识,你知道电脑主板上的小电池是做什么用的吗?...
  9. Charles 抓包工具 报You may need to configure your browser or application to trust the Ch......错误
  10. The supplied data appears to be in the OLE2 Format. You are calling the part of POI that deals with