很早就有做这个东西的想法了。上星期的某一天(根据校内日志是星期六),我突然想把它付诸实践,于是我在校内上发了篇日志 ,记下了我认为应该可行的实现步骤,以下是最终方案:
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还是比较小众啊。。。
我也照着自己对文档里的说明的理解做了各种尝试,都已失败而告终。。而这时,我已经好几天没有好好上课去了,貌似还有作业没交,我终于觉得有点得不偿失了。于是终于痛下决心暂时放弃这个东西了。等有时间了再搞吧。
放弃果然是痛苦的啊。。。。
Posted by wong2 on 四月 27th, 2010
277次浏览
Read More
这是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
Posted by wong2 on 四月 1st, 2010
186次浏览
Read More
不知道大家玩过名字打架这个无聊的游戏没。。
这次,无聊的王二和超人把它搬到了Android上。

Posted by wong2 on 一月 28th, 2010
297次浏览
Read More
明天上午考完 万恶的 毛邓三,下午就启程回家,我的寒假就终于正式开始了。
这个寒假主要计划有学习Python、看看数据结构、熟悉在Linux下编程。
不多说了(没话说了。。),大家可以通过右下角的Google Latitude了解我的踪迹哈!(这是跟zpc学的。。)
Posted by wong2 on 一月 28th, 2010
191次浏览
Read More
请原谅我用20XX年的第一场雪这个已经被用滥了的题目,因为我想不出更好的了。。
雪是前天中午开始下的,到了晚上世界就白茫茫了。加菲同学跟我说第二天早上8点去打雪仗,于是当晚特别的早睡了。
第二天,即昨天,早上8点左右起床,给加菲打电话,嘟嘟嘟了一会,那边把电话挂了。我都能想象出 这家伙睡梦中迷迷糊糊听到手机响了,然后慢腾腾的起来拿手机,看了一眼,按下挂机键 的情景。过了一会,一条短信发了过来:“活动取消,没人啊”。。这家伙就是这么懒啊。。
于是我自己下楼吃了早饭,来到中心操场,没人打雪仗,可能大家都习惯了睡懒觉了吧。倒是有两个女生在堆雪人。
就在这时,我突然想堆个草泥马。于是我堆了。


唉,完全没有草泥马应有的神韵。。
后来在校内上看到了西边的牛人堆的草泥马:

内牛满面啊。。。我还专门跑去西边观摩了一下,下面那俩杯具太传神了。。。
This is it. 偶尔调侃一下,别整天板着一张严肃的面孔。
Posted by wong2 on 一月 7th, 2010
320次浏览
Read More
额。。我看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 。加菲同学看到后说 : 你是不是发烧了 。。。。
今天又是星期三,作业发下来了,结果如下:

看到这个,我真的十分高兴。我为我没有看到一个大大的红叉,旁边写上鲜红的“胡闹”而高兴。还记得“–雪化了之后是春–不对,是水”的故事,看来,大学真的比小学进步了许多,可是,有多少孩子的创造力被扼杀在了萌芽里啊。。。。
Posted by wong2 on 一月 1st, 2010
182次浏览
Read More
告别
万能的Google告诉我09年还有78XX 秒就完了。

看着那蓝色的数字一秒一秒的 i – -,心里倒没有什么感觉。明天还是新的一天,跟昨天看今天一样。本来酝酿着写点年度总结的,可是一面对这个框框突然又不想写了。
那就简单的告别吧,2009。就像去年告别2008一样。
再也见不着了,2009.
喜迎
<?php echo “printf( ‘ print( ” Hello , 2010! ” ) ’ );” ; ?>
PR ↗ 1
今天看zpc小朋友校内的状态说他的博客PR从0升到了2,我那个羡慕啊。。
赶紧去查查自己的小站。哈哈,没想到我的博客在09年最后一天也从0升到了1,虽然比zpc小朋友低,不过人家写的比咱勤快,也是应当的。
新年的展望
提出一点展望,对自己也是一种激励和督促。
1. 学技术。 我准备深入的学习一下 Python 。还有系统的学习一下javascript。
2.成绩。 王二小朋友现在成绩中等,究其原因,我觉得并不是搞技术耽误了时间,而是浪费了太多时间,这也是我时时感到空虚的原因。现在我对自己提出这点最低要求:不管在做什么,不要浪费时间。
3.成长。 我希望自己不要再这么浅薄和没有想法,多读书,更重要的是,多思考。
i = 2009
print ‘Bye, %d . Hello, %d .’ % (i, i+)
Posted by wong2 on 十二月 31st, 2009
255次浏览
Read More
Posted by wong2 on 十二月 20th, 2009
392次浏览
Read More
理念:
每个人拥有的图书汇集起来就是一座最大的图书馆
模式:
建设一个网站,在这个网站上每个人都有两种角色:供书者和借书者。
用户将自己愿意借出的书的信息(如书名、ISBN)登记在网站上,并注明愿以怎样的价格借出(如 10元/月,或者免费),其它用户通过站内搜索找到这本书后,如果感到合适,将运费及借书费用打入供书者的账户中,供书者收到后,负责把书通过快递等方式送至借书者处,借阅期限到后,借书者在征得供书者同意后,可通过增加费用续借。最后借书者要负责把书寄回。
问题:
以上只是一种理想情况,而在实际中,我们不得不考虑各种可能发生的情况。
- 借书者在借阅期限到后,拒不还书怎么办
- 借书者在借阅期间造成书籍的损坏、丢失怎么办,以及损坏的判别标准是什么
- 供书者故意说借书者损坏了图书,怎么办
- 邮寄的费用问题
结论:
还得再想想。。
PS:
春哥佑我四级、物理。
Posted by wong2 on 十二月 15th, 2009
267次浏览
Read More