Qq空间

用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.

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

之前写过一篇文章简单说明如何用Python抓取QQ空间的文章,当时的脚本有两个缺陷:1.没有保存日志图片 2.未能获取日志发布时间。 当然原有的脚本还是可以使用的,今天对其进行了修改,改进了上面两个缺陷。 前篇文章说,未能获取日志发布时间的原因是文章是从简版抓取下来的,因此要想获取精确时间,就必须找到完整的日志地址。 在HttpFox的帮助下,地址并不难找: http://b1.cnc.qzone.qq.com/cgi-bin/blognew/blog_output_data?uin=QQ号码&blogid=文章ID 当然前面的二级地址与网络条件有关。这个地址就是真正的日志地址。只要将上次的脚本进行小幅修改,就可以抓取日志的内容了。 接着要保存图片。 这里只考虑保存在QQ空间相册里的图片,其他图床的情况较复杂,有兴趣的同学可以自行分析。 既然是保存在QQ空间相册中的图片,域名自然是QQ的,但是QQ的图片域名并没有后缀,而是像下面这样: http://b214.photo.store.qq.com/psu?/28499588-e936-4ad1-9d29-8048ecba8c54/TynjoQTxqQWMDDZ43wMDg7x2EemJeXmuQRkFtZ4S7qY!/b/YUAUnX.eAQAAYlIImn99AQAA 上面这个是近期日志的图片地址,下面这个是之前日志的图片地址: http://b210.photo.store.qq.com/http_imgload.cgi?/rurl4_b=d43765322eef1b64785ae3ab1f68a8a7e8f3cd5f08244b76a9981b6e6a62e0f81f601ece0421fac90b29f6c18bb5ea2839f18d666a3069bf880fd98a97d8e857ade443f4479c3719504d07c2033c4ff3e0fcfde6&a=210&b=210 好在腾讯似乎没有做太多的防盗链,也就是说,直接复制上面的地址到浏览器,是可以直接打开的,并且图片的URL只是后面有变化。因此图片地址的正则表达式也就很好写了: http://bd*.photo.store.qq.com/[^"]* 但是因为这个URL是看不出后缀的,因此需要获取MIME类型并判断图片后缀: imgInfo = urllib2.urlopen(image).info() #获取图片信息 这样可以获取图片的所有相关信息,得到的是一个字典类型变量,其中的”Content-Type”项就保存了图片的MIME类型,通过对MIME字符串进行处理,就可以得到图片的后缀。 剩下的就是保存图片的工作了,与保存网页相同,不再赘述。 更新后的代码仍然托管在bitbucket:http://goo.gl/vTNL1。 至此,所有抓取的工作就完成了,剩下的就是对已抓取的内容进行处理,提取日志内容和评论。

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

今天找了点时间看了点Python抓站的教程,便想把自己QQ空间的文章抓下来。 一开始想要直接抓站,可是QQ空间满是javascript一时让我无从下手,于是暂时作罢。 其实QQ空间还有一个掌上设备的版本, http://qz.qq.com ,这个版本的主页没有使用javascript(但是有些不便的地方,这个之后再说)。 简单分析了一下它的url,因为是面向掌上设备的版本,因此url并不复杂,文章列表的url的基本格式为: http://qz.qq.com/你的QQ号/bloglist?page=页码 而文章url的基本格式为: http://qz.qq.com/你的QQ号/blog?uin=你的QQ号&vin=0或者你的QQ号&blogid=文章ID 上面url中“0或者你的QQ号”取决与你是否登录,未登录就是0,登陆后就是你的QQ号(猜测)。 需要注意的是,最后的文章ID有两种,一般最近几年发表的日志都是10位数字,而几年前发表的日志则是从1开始的数字,例如,如果你昨天发表了一篇日志,你的url看上去是这样的(假设你的QQ号是10000,且未登录): http://qz.qq.com/10000/blog?uin=10000&vin=0&blogid=1234567890 而你几年前发表的日志的url看上去则是这样的: http://qz.qq.com/10000/blog?uin=10000&vin=0&blogid=12 因为这个问题让我郁闷了一会。。。 知道了这些剩下的工作就可以交给我们的Python了,根据 http://goo.gl/IMPOH 和 http://goo.gl/IfRJn 这两篇文章的说明,使用urllib2包进行抓站操作,花了两个小时的时间,就有了这样一个非常笨拙的代码: http://goo.gl/vTNL1。 目前还处在非常原始的状态,只能机械的将抓到的站保存为html文件,而且因为css神马的都在服务器上没有下载下来,所以打开的时候必须要联网。。。不过这些都不是主要问题,我抓站的主要目的是提取其中的文章与评论。 前面说过qz.qq.com有个不便的地方,那就是日志的时间显示不是精确时间,而是“两年前”,“三年前”这样的时间,因此抓下来的文章没法转换为我需要的格式,等我用firebug找到完整版日志的地址之后,再继续更新抓站程序吧(偷个懒都不行,腾讯你。。。)。