用Python抓取QQ空间文章(终)

其实上一篇博文就已经将所有抓取工作解决了,这篇主要是抓取后的一点点处理工作(其实也没有处理完,充其量是个半成品)。

上篇说道使用正则表达式来匹配图片地址,不过上次方案有些缺陷,那就是疼迅给每张图片都加了链接,因此直接匹配会得到很多重复的地址,不过没关系,Python里有个很好用的模块:HTMLParser(Python 3是html.parser)。

文档上有个使用的例子:

from HTMLParser import HTMLParser

class MyHTMLParser(HTMLParser):

    def handle_starttag(self, tag, attrs):
        print "Encountered the beginning of a %s tag" % tag

    def handle_endtag(self, tag):
        print "Encountered the end of a %s tag" % tag

很明显的,handle_starttag方法在遇到开始标签时会被调用,而handle_endtag会在遇到结束标签时被调用,所以用HTMLParser结合正则表达式来获取图片地址就很方便了:

def handle_starttag(self, tag, attrs):
    if tag == 'img':
        pattern = u"http://bd*.photo.store.qq.com/[^"]*"               #图片地址
        prog = re.compile(pattern);
        imgUrl = re.findall(prog, self.get_starttag_text())
        if imgUrl:
              self.imgList.extend(imgUrl)

当然不是只定义这样一个方法就行了,使用HTMLParser需要创建自己的类,并继承HTMLParser:

class PicParser(HTMLParser):

使用时只需要生成一个PicParser对象,并将网页内容作为参数调用其feed方法即可:

picParser = PicParser()
picParser.feed(self.content)

要找出日志的标题和内容,也可以用HTMLParser进行相似的操作,不赘述,详见源码(当然我写的比较ugly,只是没事用用也懒得改了)。

对于评论,疼迅是以JSON格式直接放在页面底端的:

{"data":{
"ver":"200810",
"blogid":3,
"voteids":0,
"pubtime":1156153664,
"replynum":1,
"category":"不告诉你",
"title":"不告诉你",
"effect":512,
"effect2":0,
"exblogtype":0,
"friendrelation":[],
"lp_type":0,
"lp_id":0,
"lp_style":0,
"orguin":不告诉你,
"orgblogid":3,
"ip":0,
"mention_uins":[ ],
"attach":[],
"replylist":[{"replyid":1,
"replytime":1156209968,
"replyeffect":0,
"replyuin":不告诉你,
"replynick":"不告诉你 ",
"replyautograph":"不告诉你",
"replycontent":"不告诉你 ",
"capacity":不告诉你,
"responsecontent":[ ]}]
}}

当然上面这段不知包括评论,也包括日志本身的一些信息,这个用正则表达式匹配一些很容易就出来了。

至此,所有的处理工作都完成了,因为评论是JSON,因此标题和正文也处理成了JSON,源码地址在此:

http://goo.gl/HU4Qd

为什么重建了仓库?嘛……有各种各样的原因……

给个下载:

http://goo.gl/OSaFK

使用方法内附。