在折腾给BlogsToWordPress – 将百度空间,网易163,新浪sina等博客搬家到WordPress添加对应的QQ空间搬家的功能,然后发现了关于QQ空间的,技术层面的上的很多值得说说的东西。
说QQ空间变态,不是指用户层面的花哨等,而是指其内部。
就像一个人,除了外表弄得花里胡哨的,就是身体内部,搞不好也是肠胃互相错位等,乱就一个字,而且秉性也及其古怪,和常人思维两样。
下面就来具体说说QQ空间具体变态在哪些方面:
1.其他博客对应的帖子,对于第几页的帖子,获取的方法,一般都是/index/N,比如百度的
http://hi.baidu.com/againinput_tmp/blog/index/10
去获得对应的第10页的帖子列表,而QQ空间,则是,根据
显示的内容的第几页,比如:
如果你点击了6,对应的访问的地址,不是/index/6之类的地址,而是根据上面的6,所在的位置的坐标,比如135,则对应的url中包含pos=135之类的url地址,去访问,然后获得对应第6页的帖子的列表的。
这样的空间设置的思路,还真tmd的新颖啊。。。
难道真的是为了别人写程序抓取其网页,而故意这样设计,给别人增加难度的?
如果是,那么也无话可说,如果不是,那么设计者的思路,真tmd变态啊。
2.看到百度空间,有些地址返回的编码是UTF-8,有些是用的GBK,有些是GB2312.
真TMD的乱啊。
相比较而言,虽然其他网易,新浪等博客,也是用GBK等,但是至少人家是统一的啊。
不像QQ空间的html编码,这么变态,竟然都不统一。
3.刚刚遇到一个很巧合,也很变态的事情。
因为调试程序的时候,发现返回的值是这样的:
_Callback( |
而不是之前类似的这样的:
_Callback( |
搞得我刚才以为程序出错了呢。实际上则是,几个小时之前,写好了程序的时候,QQ空间的帖子的地址,还是类似于这样的:
http://user.qzone.qq.com/84483423/blog/1317915494
结果现在,此时此刻,当我再去测试程序的时候,才发现QQ空间,竟然内部又改版了,帖子的地址变成了:
http://user.qzone.qq.com/84483423/blog/0
http://user.qzone.qq.com/84483423/blog/1
才导致上述返回的blogid从之前的帖子的发布时间1317915494,变成了现在的帖子的序号0,1,2等。
改版不可怕,怕的是,改的这样频繁的。
这才写好程序没几个小时,结果就遇到这样的事情。
谁知道以后,QQ空间何时会再改版呢。到时候,搞得程序又不能用了,还要同步更新,那就坑爹了。
靠,刚发现一个更坑爹的,那就是,程序执行过程中,看到的打印信息,发现后来的很多帖子,blogid超过47之后,却又变成了pubsh time的datestamp值,比如1198288991。
3.刚又发现一个更加变态的事情,那就是QQ空间的帖子的评论,一般都是GB2312类型的(此处用GB18030,是GB2312的超集),然后返回的评论的数据,都是json字符串,所以,我用下面的代码:
dataJsonStrUni = dataJsonStr.decode("GB18030"); dataDict = json.loads(dataJsonStrUni, encoding="GB18030");
都是一直可以解析json字符串,获得对应评论的。
但是刚刚遇到,这个帖子:
http://user.qzone.qq.com/622007179/blog/1218912726
中的
still need get comment: startIdx=180, getNum=57
即第180-237个评论中,使用的编码,最后经过调试,调用chardet.detect的值,竟然用的是另外的编码:
encInfo= {‘confidence’: 0.7493138941403631, ‘encoding’: ‘ISO-8859-2’}
真尼玛太变态了,因为之前N多个帖子的评论数据,都已经测试OK的,有的帖子都有上千条评论的,都是好的,结果竟然还会遇到另外的帖子,变态的竟然采用不一样的编码。
真是彻底佩服了那帮QQ空间系统的设计者,编码竟然能乱到此种程度,实在无语了。
4.以为上面的已经够变态了,结果还有更变态的:
这个帖子:
http://user.qzone.qq.com/622000169/blog/1252395085
中所返回的帖子的内容:
{"data":{ "voteids":0, "pubtime":1252395085, "replynum":40, "category":"推荐阅读", "tag":"嫁人|魅力|浪子|浪漫|激情", "title":"五类男人可嫁性分析报告", "effect":136315393, "effect2":6, "exblogtype":0, "sus_flag":false, "friendrelation":[], "lp_type":0, "lp_id":0, "lp_style":0, "lp_flag":0, "orguin":622000169, "orgblogid":1252395085, "ip":3415476546, "mention_uins":[ ], "attach":[], "replylist":[………..] }} |
其中省略掉的replylist部分的数据,就是帖子的评论数据。
对于上述整个的字符串,首先是用GB18030解码:
dataJsonStrUni = dataJsonStr.decode("GB18030");
会出错,然后就再尝试用chardet.detect解析出来的:
encInfo= {‘confidence’: 0.30552020319195256, ‘encoding’: ‘ISO-8859-2’}
中的ISO-8859-2去decode,结果可以decode了,但是接着的:
dataDict = json.loads(dataJsonStrUni, encoding="ISO-8859-2");
还是出错。
但是上述的整个字符串,通过python的logging打印出来,是可以正确显示的,意味着其本身编码,至少绝大多数的字符,还是GB2312(GB18030)的,但是呢,其中的部分,大概30%左右,却又是ISO-8859-2编码的,即本身这个字符串,就是混合了70%的GB2312和30%的ISO-8859-2的编码,这样会导致,不论用GB2312,还是ISO-8859-2去解码,以及接下来的json.loads,总是会失败的,也就无法通过代码规避此问题了。
代码乱也就算了,字符编码不统一也就算了,但是你尼玛也不能混用不同字符编码啊。。。。
5.然后又碰到一个很变态的:
如下内容:
QQ空间的帖子,返回的单个的评论,正常的数据中,都包含replynick:
#Normal one: # {"replyid":2, # "replytime":1332944481, # "replyeffect":0, # "replyautograph":"", # "replycontent":"好美! ", # "ismyreply":0, # "capacity":4990, # "replyuin":421380584, # "replynick":"故乡的原风景 ", # "responsecontent":[ ]} |
果对于这个帖子
http://user.qzone.qq.com/417846901/blog/1332944095
结果其返回值中,突然就没了replynick,而变成了nickname:
#special one: # "replytime":1332944343, # "replyeffect":524288, # "replyautograph":"", # "replycontent":"梦里去过了! ", # "ismyreply":0, # "capacity":4990, # "replyuin":"03037c9a5520fe5775a202f59858ec2e5dc9c1d73e346b3d", # "nickname":"慕寒", # "responsecontent":[ ]} |
真尼玛够变态的。。。搞得程序还一直都要修修补补,这QQ空间,尼玛是谁设计的啊。。。
转载请注明:在路上 » 【记录】给Python脚本BlogsToWordPress中实现QQ空间搬家到wordpress的功能 + 感慨:QQ空间真的很变态 v2012-04-05