订阅我的博客

很早就有做这个东西的想法了。上星期的某一天(根据校内日志是星期六),我突然想把它付诸实践,于是我在校内上发了篇日志 ,记下了我认为应该可行的实现步骤,以下是最终方案:

1. 模拟登录

2. 访问http://photo.renren.com/photo/用户id/album-相册id/reorder   ,这是相册的图片排序页面,列出了这个相册里的所有图片的缩略图,可以通过drag&drop实现对图片的排序。看一下它的源码可以看到,图片部分的代码是这样的:

<ul id=“photos” class=“DragablePhotoList”>
<li pid=“2866049429″ >
<img src=“http://fmn.xnimg.cn/fmn039/20100424/1445/p_head_dJmX_035b000089622d13.jpg” alt=“” /></li>
<li pid=“2772466126″ >
<img src=“http://fmn.xnimg.cn/fmn039/20100324/2350/p_head_jwoD_66e0000147002d11.jpg” alt=“怀旧” /></li>
…..
</ul>

从这里可以得到所有缩略图的地址,但是没什么用,因为不知道怎么由缩略图的地址得到大图的地址;有用的是每个<li>的pid值,这是图片的 id,得到它之后,http://photo.renren.com/photo/用户id/photo-pid 就是显示这张图片的网页的地址。

3. 在上面提到的那个网页里提取图片的地址

4.根据地址下载图片

我从一开始就决定用Python来做,因为以前就见过Python抓网页的代码例子,好像还比较简单。然后仔细一看,确实很简单,以下语句就可以抓取Google主页的源码了:

import urllib2
print urllib2.urlopen('http://www.google.com').read()

简单吧。不过这个我要做的这个程序要是这么简单就好了,一来需要校内网需要登录才能访问,二来 第3步里提到了“提取图片地址”,可是看网页的源码,显示图片的代码是:

1 <img id=“photo” src=“http://xnimg.cn/a.gif” title=“点击查看下一张” />

显然图片的地址是后来通过js修改的,这就给抓地址的工作带来了很大的困难。。。

第一个模拟登陆的问题,我在网上一搜,搜到了一个校内自动发贴机的代码,登录部分的代码整理如下:

import urllib2
import urllib
import cookielib
 
class RenRen:
 
    def __init__(self, email, pwd):
        self.email = email
        self.pwd = pwd
 
    def login(self):
        cj = cookielib.LWPCookieJar()
        opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
        urllib2.install_opener(opener)
 
        params = {'domain': 'renren.com', 'origURL': 'http://www.renren.com/Home.do', 'email': self.email, 'password': self.pwd}
        req = urllib2.Request('http://www.renren.com/PLogin.do', urllib.urlencode(params))
        operate = opener.open(req)
        if operate.geturl() == "http://www.renren.com/Home.do":
            print 'logged on successfully!'
        else:
            print 'logged on error!'
 
if __name__ == '__main__':
    wong2 = RenRen("usrname", "password")
    wong2.login()

看会书睡觉,明天再写吧。。。

—————————————

明日复明日,明日何其多。

—————————————

明天到了。

上回说到可以模拟登录了,然后就登录进去抓取吧。可是这样抓只能抓到网页的HTML源码,具体到图片地址那一部分,我只能抓取出: <img id=“photo” src=“http://xnimg.cn/a.gif” title=“点击查看 下一张” /> ,却得不到JS替换之后的图片地址。。

咋办呢?

这个问题的难度就在于你要模拟出一个浏览器环境,因为js是在浏览器里生成和操纵DOM的。

Google吧,记得那天晚上中英文交杂的搜到三点,试了几种方法,最后发现一个比较靠谱的: Downloading a page’s content with python and WebKit

作者是利用PyQt的QWebkit实现的,一个例子(需安装PyQt4):

import sys
import signal
 
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.QtWebKit import QWebPage
 
class Crawler( QWebPage ):
	def __init__(self, url, file):
		QWebPage.__init__( self )
		self._url = url
		self._file = file
 
	def crawl( self ):
		signal.signal( signal.SIGINT, signal.SIG_DFL )
		self.connect( self, SIGNAL( 'loadFinished(bool)' ), self._finished_loading )
		self.mainFrame().load( QUrl( self._url ) )
 
	def _finished_loading( self, result ):
		file = open( self._file, 'w' )
		file.write( self.mainFrame().toHtml() )
		file.close()
		sys.exit( 0 )
 
if __name__ == '__main__':
	app = QApplication( sys.argv )
	crawler = Crawler("http://google.com", "/home/wong2/code/google.html")
	crawler.crawl()
	sys.exit( app.exec_() )

看上去不错。

激动之余我就赶紧睡觉了。

第二天起来继续搞,这才发现一个问题:校内网是要登录的,虽说上面已经实现了模拟登录了,可是在PyQt里怎么实现呢?

于是剩下的几天就在看PyQt4文档的QWebkit和QNetwork这一部分,可惜里面连个例子也没有,去网上查吧,什么也没查到,看来PyQt还是比较小众啊。。。

我也照着自己对文档里的说明的理解做了各种尝试,都已失败而告终。。而这时,我已经好几天没有好好上课去了,貌似还有作业没交,我终于觉得有点得不偿失了。于是终于痛下决心暂时放弃这个东西了。等有时间了再搞吧。

放弃果然是痛苦的啊。。。。

  • Share/Bookmark

这是gogo给我的一个任务,以前也见过这样的应用,比如金山词霸的网站有个即划即译的功能,就是鼠标划词然后自动加载翻译,如图:

这个主要要考虑浏览器的兼容性。
在IE中,要使用 document.selection.createRange().text
在 Firefox、Chrome、Opera中则使用 window.getSelection()
所以为了兼容性,要判断一下是哪种浏览器然后调用对应的方法。为了使代码简练点,我用了一个三元运算符

var sText = window.getSelection ? window.getSelection() : document.selection.createRange().text;

可以点这里看例子: wong2.cn/works/select.html

  • Share/Bookmark

准备挑战一下  Python Challenge , 把过程写成一个系列,不知道要搞到什么时候。我保证不去搜索答案。

第0关:

地址:http://www.pythonchallenge.com/pc/def/0.html

题目就是图片里有个 2的38次方。这个没啥想的,直接  print 2 ** 38 就可以了。

这个应该是想展示一下Python的长整数型,它可以有任意大(看你的内存大小)。

提示是 try to change the URL address.

那就把URL里的0换成算出来的274877906944就可以了。页面跳转到了下一关。

  • Share/Bookmark

不知道大家玩过名字打架这个无聊的游戏没。。

这次,无聊的王二和超人把它搬到了Android上。

NameFighting

  • Share/Bookmark

明天上午考完 万恶的 毛邓三,下午就启程回家,我的寒假就终于正式开始了。

这个寒假主要计划有学习Python、看看数据结构、熟悉在Linux下编程。

不多说了(没话说了。。),大家可以通过右下角的Google Latitude了解我的踪迹哈!(这是跟zpc学的。。)

  • Share/Bookmark

请原谅我用20XX年的第一场雪这个已经被用滥了的题目,因为我想不出更好的了。。
雪是前天中午开始下的,到了晚上世界就白茫茫了。加菲同学跟我说第二天早上8点去打雪仗,于是当晚特别的早睡了。
第二天,即昨天,早上8点左右起床,给加菲打电话,嘟嘟嘟了一会,那边把电话挂了。我都能想象出 这家伙睡梦中迷迷糊糊听到手机响了,然后慢腾腾的起来拿手机,看了一眼,按下挂机键 的情景。过了一会,一条短信发了过来:“活动取消,没人啊”。。这家伙就是这么懒啊。。
于是我自己下楼吃了早饭,来到中心操场,没人打雪仗,可能大家都习惯了睡懒觉了吧。倒是有两个女生在堆雪人。
就在这时,我突然想堆个草泥马。于是我堆了。

Image and video hosting by TinyPic

Image and video hosting by TinyPic

唉,完全没有草泥马应有的神韵。。

后来在校内上看到了西边的牛人堆的草泥马:

Image and video hosting by TinyPic

内牛满面啊。。。我还专门跑去西边观摩了一下,下面那俩杯具太传神了。。。

This is it. 偶尔调侃一下,别整天板着一张严肃的面孔。

  • Share/Bookmark

额。。我看Google网页快照里还有这篇,赶紧抢救回来了。。。

上周三做离散数学作业,有一题是这样的:
设有二元代数V=< {a,b,c,d}; • >,其中运算•由下表定义:

(1)证明V是一循环独异点 ……..(以下略)

要证明V是循环独异点,首先要证明它是半群,于是要证明运算 • 是可结合的,即证明 对于任意的 x,y,z∈{a,b,c,d},有 (x*y)*z=x*(y*z)成立。 如果一个一个验证的话,有 4*4*4=64种情况。我实在没有耐心一个一个验证这64种情况,又没有想到更好的办法,于是准备写个程序来验证它。

首先,把运算 • 表示出来,如果把 a、b、c、d看做字符的话,可以归纳出 • 可用下面的函数表示:

1
2
3
4
char func(char x,char y)
{
     return x+y-'a'-(x+y-2*'a'<=3?0:4);
}

于是可以写如下程序来验证运算• 是否可结合的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include<stdio.h>
char func(char x,char y)
{
     return x+y-'a'-(x+y-2*'a'<=3?0:4);
}

main()
{
     int i,j,k,flag=0;
     char s[5]="abcd";
     for(i=0;i<4;i++)
     {
         for(j=0;j<4;j++)
         {
             for(k=0;k<4;k++)
             {
                 if(func(s[i],func(s[j],s[k]))!=func(func(s[i],s[j]),s[k]))
                     flag=1;
             }
          }
     }

      if(!flag)
          printf("This operation is combinable");
      else
          printf("This operation is NOT combinable");
}

我就把这个程序写在了作业本上,并且注明我在电脑上运行过了,确实输出了 This operation is combinable 。加菲同学看到后说  : 你是不是发烧了 。。。。

今天又是星期三,作业发下来了,结果如下:

看到这个,我真的十分高兴。我为我没有看到一个大大的红叉,旁边写上鲜红的“胡闹”而高兴。还记得“–雪化了之后是春–不对,是水”的故事,看来,大学真的比小学进步了许多,可是,有多少孩子的创造力被扼杀在了萌芽里啊。。。。

  • Share/Bookmark

告别


万能的Google告诉我09年还有78XX 秒就完了。
Image and video hosting by TinyPic

看着那蓝色的数字一秒一秒的 i – -,心里倒没有什么感觉。明天还是新的一天,跟昨天看今天一样。本来酝酿着写点年度总结的,可是一面对这个框框突然又不想写了。

那就简单的告别吧,2009。就像去年告别2008一样。

再也见不着了,2009.

喜迎


<?php  echo “printf( ‘ print( ” Hello , 2010! ” ) ’ );” ; ?>

PR ↗ 1

今天看zpc小朋友校内的状态说他的博客PR从0升到了2,我那个羡慕啊。。 :-o 赶紧去查查自己的小站。哈哈,没想到我的博客在09年最后一天也从0升到了1,虽然比zpc小朋友低,不过人家写的比咱勤快,也是应当的。

新年的展望

提出一点展望,对自己也是一种激励和督促。

1. 学技术。 我准备深入的学习一下 Python 。还有系统的学习一下javascript。

2.成绩。      王二小朋友现在成绩中等,究其原因,我觉得并不是搞技术耽误了时间,而是浪费了太多时间,这也是我时时感到空虚的原因。现在我对自己提出这点最低要求:不管在做什么,不要浪费时间。

3.成长。      我希望自己不要再这么浅薄和没有想法,多读书,更重要的是,多思考。

i = 2009

print   ‘Bye, %d . Hello, %d .’   %    (i,  i+)

  • Share/Bookmark

什么是独立游戏

关于什么是独立游戏,Google了半天也没发现一个肯定的解释,也许其定义本就是一个仁者见仁的问题,也许我们可以参照独立电影的概念来理解。总的来说独立游戏是区分于商业游戏的,其背后一般是一个人数不多的制作团队,制作成本也不会很高,画面可能不是那么精美(不过很多游戏画面还是很好的),但其创意都是没的说的。


独立游戏节


独立游戏节Independent Games Festival ,IGF)于1998年开始,每年一届,目前已举行了11届,其官方网站为:www.igf.com

奖项设置和获奖作品的列表在维基百科上可以看到。

从09年开始,天朝也有了独立游戏节,官方网站


推荐几个独立游戏

游戏的乐趣还是要自己玩才能体会得到的,下面推荐的几个游戏都是我玩过或者正在玩的。

1. 机械迷城 (Machinarium)

一款解密冒险游戏,在09年独立游戏节上获得了视觉艺术奖。正是通过这个游戏,我才知道了独立游戏和独立游戏节。

游戏的画面相当细腻,据说游戏的每个场景都是手绘而成。

机械迷城

主角就是图中的可爱的机器人。这个游戏还是很考验人的,有些地方很难想,不过想不出来也没关系,通过完成一个小游戏你可以得到一份解密的图示,虽然这样就没啥意思了。。

最后来一个宣传视频:

2. 蜡笔物理学(Crayon Physics)

获得08年独立游戏节的塞尤玛斯·麦克纳利游戏节大奖。

这个游戏让我相当震惊。至于怎么玩,看看视频你就明白了:

当然,这游戏用触屏玩的话是相当爽的(Android上也有这个游戏,在同学的G2上玩了一下),不过用鼠标也还行啦。

这个游戏的乐趣就在于你可以充分发挥自己的想象力,网上也有很多让人佩服的过关视频,比如这个:

3. 粘粘世界(World of Goo)

08年独立游戏节中,《粘粘世界》荣获创新设计奖和优秀技术奖。

在这个游戏中,你将扮演建筑师的角色,把游戏中的Goo(黏黏球)叠起来以到达目的地。


———————分割线—————————-

好了,就先介绍这几个了,如果想找到更多好玩的独立游戏,可以猛击这里

玩惯了实况、COD这些游戏后,再来玩这些“小游戏”,我常常忍不住赞叹:太TM有创意了,游戏竟然还可以这样玩。

  • Share/Bookmark

理念:

每个人拥有的图书汇集起来就是一座最大的图书馆

模式:

建设一个网站,在这个网站上每个人都有两种角色:供书者和借书者。

用户将自己愿意借出的书的信息(如书名、ISBN)登记在网站上,并注明愿以怎样的价格借出(如 10元/月,或者免费),其它用户通过站内搜索找到这本书后,如果感到合适,将运费及借书费用打入供书者的账户中,供书者收到后,负责把书通过快递等方式送至借书者处,借阅期限到后,借书者在征得供书者同意后,可通过增加费用续借。最后借书者要负责把书寄回。

问题:

以上只是一种理想情况,而在实际中,我们不得不考虑各种可能发生的情况。

  1. 借书者在借阅期限到后,拒不还书怎么办
  2. 借书者在借阅期间造成书籍的损坏、丢失怎么办,以及损坏的判别标准是什么
  3. 供书者故意说借书者损坏了图书,怎么办
  4. 邮寄的费用问题

结论:

还得再想想。。

PS:

春哥佑我四级、物理。

  • Share/Bookmark