这个脚本是根据图书的isbn号来抓取对应的图书评分信息的。data.csv是一个包含图书的isbn的列表文件,每一行是一个图书的isbn号。 这个版本只使用了单线程抓取,并且只能从csv文件中读取数据。因为是朋友拜托抓取的,数据量不大,以后如果有需要再慢慢改进好了。 整个Python脚本很简单,主要使用了BeautifulSoup进行html的内容提取。

P.S.最近手头还有几个非常有趣的项目正在制作,希望我能够早日搞定它们 :)

import urllib,urllib2
import re
import BeautifulSoup

def isbn_2_score(isbn):
    url = 'http://www.douban.com/subject_search?search_text='
    try:
        response = urllib2.urlopen(url+isbn)
    except Exception,e:
        return 0.0
    doc = response.read()
    soup = BeautifulSoup.BeautifulSoup(''.join(doc))
    try:
        book_info = soup.find("a",{"class":"nbg"})
    except Exception,e:
        return 0.0
    if isinstance(book_info,BeautifulSoup.Tag):
        url_book_info = book_info['href']
        try:
            response = urllib2.urlopen(url_book_info)
        except Exception,e:
            return 0.0
        book_page = response.read()
        soup = BeautifulSoup.BeautifulSoup(''.join(book_page))
        score_info = soup.find('strong','ll rating_num')
        if isinstance(book_info,BeautifulSoup.Tag):
            score = score_info.string
            return score
        return 0.0
    return 0.0

def read_file(file_name):
    file_handler = open(file_name,'r')
    return file_handler

def return_isbn(file_handler):
    isbn = file_handler.readline()
    return isbn


if __name__ == '__main__':
data = read_file('data.csv')
	f = open('dump','w')
	k = return_isbn(data)
	while k is not None:
    	score = isbn_2_score(k)
    	result = k[0:-1]+":"+str(score)+"\n"
    	print result
    	f.write(result)
    	k=return_isbn(data)
	f.close()

项目地址:https://github.com/quake0day/douban_crawler

看完这部电影,感慨良多。这是一部关于成长的电影,当自己成长起来的时候,也就失去了原有的童真。在成长的过程中,我们会得到许多,也会失去许多。

从高中到大学再到美国读研,8年的时间,让我从一个孩子,渐渐成长为一个成年人。在这8年里,发生了很多很多事情。我失去了很多,也得到了很多。有的时候静下心来想想自己走过的路,我会觉得这段路真的很漫长。和Kiki一样,在自己不断往前奔跑的时候,丢掉了一些人,抛掉了许多暖色晨曦。

魔女kiki和我一样,都是到了一个全新的地方去生活。离开自己的家,到一个陌生的国度,自然会遇到各种困难。当我们开始新的生活的时候,很多事情并不是那样一帆风顺,我们会像Kiki那样遇到很多困难,遇到很多挫折。但是,只要坚持,只要努力,我们也总会越过那些坎。

从来美国到现在,已经过了8个月了,在这段时间里,我也遇到很多不顺,有的时候很困惑,感觉就像是和kiki一样,原先拿手的东西突然不好用了,就像魔力消失了一样。

后来我发现,其实魔力并没有消失,只是之前没有足够的努力,没有完全适应这边的生活。现在我已经慢慢适应了独自一个人在异国他乡生活,小心翼翼,一点点细心的把自己的生活打理的井井有条。

谁都有事情无法继续下去的时候,这个时候干着急是没有用的。在重新获得灵感之前,我可能要休息一下。

希望自己多一点点勇敢与坚持。山重水复疑无路,柳暗花明又一村。

非常喜欢这部电影。

以上是对最近5个月没有写新日志,没有新作品的解释。

美国的新年快到了,国内的同学们已经迎来了新的一年,我正好利用时差赶在这2010的最后一天里面发篇技术文章。

昨晚偶然发现Create Chen写了一篇利用基于HTTP的QQ api实现的QQ登陆的文章。作者给出了实现的C#代码,并对协议做出了详尽的分析。(URL1 URL2

通过HTTP的POST动作控制QQ,就可以开发很多很有意思的应用。比如我们可以开发QQ消息轰炸机(呵呵 :) ),可以制作QQ机器人...等等

我按照文章中所叙述的方法用我所喜欢的Python重新实现了一遍,下面是Python的代码。代码只实现了基本功能,对于返回的信息并没有进行处理,如果大家有兴趣,可以结合Create Chen的文章自行对返回信息进行处理。

下面是代码:

import urllib,httplib,md5,time
from time import sleep
class qq:
    def __init__(self,qq="",pwd=""):
        self.pwd=md5.new(pwd).hexdigest()
        self.headers=""
        self.qq=qq

    def getdata(self):
        self.conn=httplib.HTTPConnection("tqq.tencent.com:8000")
        self.conn.request("POST","",self.headers)
        response=self.conn.getresponse()
        print response.read().decode('utf-8').encode("cp936")
        sleep(1)
        self.conn.close()
    
    def Login(self):
        self.headers=("VER=1.1&CMD;=Login&SEQ;="+\
                       str(int(time.time()*100)%(10**5))+"&UIN;="+\
                       self.qq+"&PS;="+\
                       self.pwd+\
                       "&M5;=1&LC;=9326B87B234E7235")
        self.getdata()

    def GetInfo(self,friend=""):
        self.headers=("VER=1.1&CMD;=GetInfo&SEQ;="+\
                      str(int(time.time()*100)%(10**5))+"&UIN;="+\
                      self.qq+"&LV;=2&UN;="+\
                      friend)
        self.getdata()
        
    def AddToList(self,friend=""):
        self.headers=("VER=1.1&CMD;=AddToList&SEQ;="+\
                      str(int(time.time()*100)%(10**5))+"&UIN;="+\
                      self.qq+"&UN;="+\
                      friend)
        self.getdata()

    #agree_Type = 0 agree
    #agree_Type = 1 deny
    def Ack_AddToList(self,fri_Num,agree_Type):
        self.headers=("VER=1.1&CMD;=Ack_AddToList&SEQ;="+\
                      str(int(time.time()*100)%(10**5))+"&UIN;="+\
                      self.qq+"&UN;="+\
                      fri_Num+"&CD;="+agree_Type+"&RS;=")
        self.getdata()
                     
    def SendMsg(self,friend="",msg=""):
        self.headers=("VER=1.1&CMD;=CLTMSG&SEQ;="+\
                      str(int(time.time()*100)%(10**5))+"&UIN;="+\
                      self.qq+"&UN;="+\
                      friend+"&MG;="+\
                      msg.decode("cp936").encode('utf-8'))
        self.getdata()
                     
    def GetMsg(self):
        self.headers=("VER=1.1&CMD;=GetMsgEx&SEQ;="+\
                      str(int(time.time()*100)%(10**5))+"&UIN;="+\
                      self.qq)
        self.getdata()

    def Query_Stat(self):
        self.headers=("VER=1.1&CMD;=Query_Stat&SEQ;="+\
                      str(int(time.time()*100)%(10**5))+"&UIN;="+\
                      self.qq+"&TN;=50&UN;=0")
        self.getdata()

    def List(self):
        self.headers=("VER=1.1&CMD;=List&SEQ;="+\
                      str(int(time.time()*100)%(10**5))+"&UIN;="+\
                      self.qq+"&TN;=160&UN;=0")
        self.getdata()

    #stat = 10 online
    #stat = 20 offline
    #stat = 30 busy
    def Change_Stat(self,stat=""):
        self.headers=("VER=1.1&CMD;=Change_Stat&SEQ;="+\
                      str(int(time.time()*100)%(10**5))+"&UIN;="+\
                      self.qq+"&ST;="+stat)
        self.getdata()
    
    def Logout(self):
        self.headers=("VER=1.1&CMD;=Logout&SEQ;="+\
                      str(int(time.time()*100)%(10**5))+"&UIN;="+\
                      self.qq)
        self.getdata()



test = qq('9918xxxx','xxxxx')
test.Login()
print "OK"
#i =0 
#while i<5:
 #   print i
  #  sleep(2)
 #   test.SendMsg('xxxxxx',"I am robot")
#    i = i+1
i = 0
while i<10:
    print i
    test.Change_Stat('10')
    sleep(1)
    test.Change_Stat('30')
    sleep(1)
    test.Change_Stat('20')
    sleep(1)
    i = i + 1
test.Logout()

代码下载地址:http://www.darlingtree.com/download/qqlogin.tar.gz 祝大家新年快乐!

p最近很多事情都不太顺利。不知道是不是因为之前努力的不够的原因。给我一些时间调整。/p

走了一年了,我还是经常会梦到你。不敢去想一年以前的今天,那一刻就像是世界末日一样。那段记忆不是灰色的,却并不鲜活,一切都像是在梦里,但那又不是梦。

我不信耶稣,因为在那段时光里,我祈祷了太多次,太多次,但奇迹没有发生。一切都如同预定好的那样,迅速的发生,迅速的结束。而我,就像是被命运所支配的一个木偶,自己置身于剧中,却除了祈祷,无能为力。

其实从前几年开始,我心里就开始有种恐惧,有的时候我就想,如果你走了,我怎么办,那时我不敢继续想下去。我天真的以为这个场景离我还很遥远,但是,就在那一刻,我所想象的一切都突然排山倒海一般的扑到了我的面前,我还没来得及去确认,这一幕幕场景就已经变成了回忆。

小的时候,我记得晚上关了灯和你在一起,你说:"要是奶奶有一天没了,你该怎么办"。我说:“奶奶你还能活好长时间呢!”。其实,那晚后来我悄悄地哭了,我真的不知道你走了对我意味着什么。

每个假期,我都要去你那里去住。我管那里叫“奶奶家”,是因为我和你比较亲。直到现在,我还偶尔会把爷爷家说成是奶奶家,尽管你已经不在。

记得假期里,我最幸福的时刻,就是在每天早晨醒来后,盯着从客厅撒进卧室的一缕阳光,听着你和爷爷聊天。你们总是以为我还在睡觉,以为我听不见。有的时候,我做了恶梦,醒来之后,一听到你和爷爷的对话,顿时就觉得自己能活在美好的现实中,真好。奶奶家,对我来说,不仅仅是一个家,更像是一个心灵的港湾。

可是现在,一切都不在了。我心灵的家,已经消失了。

于是,我只能被迫长大,变得成熟,从那一刻起,我就不再是孩子,从那一刻起,我就再也不怕任何冒险,不怕任何困境,再大的风浪,也没法打垮我。我知道,你不可能陪伴我走过一生,既然改变不了现实,那么我只有接受,只有去改变自己。

现在我在美国,一切都好。你的遗愿我一直牢牢记在心里,我会实现它。