【已实现】想要通过python脚本实现抓取百度空间上的文章,评论,图片 v2011-12-20
想要实现,把百度空间的所有内容,包括日志的详细信息,评论的详细信息,和日志中所包含的图片,全部搬家到wordpress
网上找了一番,多数都是2008年左右的帖子,最新的一个相关的2011年4月的hi-baidu-mover_v2.py,经过测试,也由于百度空间改版html源码改变,而失效了。
其他也有一些间接的办法,其中包括借助blogbus搬博客,导出xml,再转为wordpress的可以识别的xml,但是结果都无法让人满意。至少评论等信息,就没法完全的保留。后来实在逼急了,打算自己修改hi-baidu-mover_v2.py,自己去实现自己所需要的全部功能。经过1周多时间的折腾,终于完全实现了自己所要的上述要求,并且也提供了足够多的功能和配置选项,以满足其他人类似的需求。
关于脚本的功能介绍,参见这里(会不定期的更新该贴的):
hi-baidu-mover_v2011-12-20.py
http://againinput4.blog.163.com/blog/static/1727994912011111111217185/
下面对于中间所经历的过程,进行简单介绍,以方便后来人,少走弯路,以及知道如何走这条路:
1.只是要抓取百度空间的文章,倒是简单,参考别人的python脚本:
hi-baidu-mover_v2.py
其现在已经失效,经过自己的修改,以后可以实现下载百度空间的帖子的标题,内容,时间等信息了,但是对于帖子的评论信息,网页的html源码中,就看不到。
看到这里的介绍:
转贴:C#抓取AJAX页面的内容 百度空间_应用平台
http://www.360doc.com/content/10/1008/09/3722251_59251496.shtml
得知,其是通过AJAX实现的,运行javascript从服务器端获取的评论的信息。
对此部分内容,不了解,目前无从着手。
2. 网上搜了下,关于如何用python操作javascript的,找到这个:
python 用什么模块处理网页的javascript
http://zhidao.baidu.com/question/264256493.html
但是也还是看不太懂。
3.现在想要找个python模块,可以操作javascript的。
(1)其中这里:
http://markmail.org/message/ovmzzdlhmliqvoal#query:+page:1+mid:rg3lvvlus3kkghfk+state:results
提到了ironpython,找了下,好像不是我需要的。
(2)这里http://blackbaby.iteye.com/blog/573651提到了pywin32,好像也不是我要的。
(3)这里:http://justpy.com/archives/110,解释了,说一个是Pyrex,一个是Python-Spidermonkey。
其中Pyrex,根据这里:
http://www.ibm.com/developerworks/cn/linux/l-cppyrex.html
的解释,也是从之前的一点点发展过来的,其中包括IronPython。
不过,找来找去,好像还是Python-Spidermonkey符合我的要求。
对于Python-Spidermonkey,这里
http://markmail.org/message/w3npzdrfzwxeqys2#query:+page:1+mid:fvytw5onprfxd2c3+state:results
也提到了,也给出了地址:
http://code.google.com/p/python-spidermonkey/
具体安装和使用过程,也可以参考这里:
如何用spidermonkey在python里调用javascript代码
http://www.4ucode.com/Study/Topic/1772597
下载的话,好像可以去这里:
https://github.com/davisp/python-spidermonkey/downloads
剩下的就是有空自己折腾折腾了。
去下载了python-spidermonkey,结果好像windows下编译,出现缺少make工具,
所以又去装了cygwin,结果去运行
python setup.py install
又出现错误:
crifan@crifan-PC /cygdrive/e/WebServer/python/davisp-python-spidermonkey-6e3d647/davisp-python-spidermonkey-6e3d647 ————————————————————————— (Note: if this machine does not have network access, please obtain the file http://pypi.python.org/packages/2.6/s/setuptools/setuptools-0.6c9-py2.6.egg and place it in this directory before rerunning this script.) |
然后看到这里:
http://www.4ucode.com/Study/Topic/1377800
和
http://blog.csdn.net/jxfengzi/article/details/5365746
都是关于如何在windows下编译spidermonkey的,但是编译结果,好像都是生成对应的lib或dll库的,
也就像这里:
http://www.oschina.net/question/12_16100
所说的。明显没法放在python中用。
另外,有人提到了:
http://hi.baidu.com/drunkdream/blog/item/749555608c9543c38db10d9a.html
可以在python中执行javascript,但是需要用到pywin32。
所以,去尝试一下,试试这个是否可行。
后来经过尝试,是可以实现运行简单的那个javascript的add函数的,但是对于我此处所要的复杂的一对的javascript脚本,却无从下手,不知道如何才能运行。
4.有空参考一下这个:
python如何获得网页JavaScript脚本执行后的全部源代码
http://topic.csdn.net/u/20100306/09/f82b81e0-4714-4272-8f3b-867407bd1150.html
和其对应博客帖子:
使用python在win下通过IE组件获得Ajax执行后网页源代码
http://blog.csdn.net/dongnanyanhai/article/details/5353684
5另外这个,也许也可以参考参考:
http://blog.motane.lu/2009/06/18/pywebkitgtk-execute-javascript-from-python/
6.这里:
http://www.elias.cn/Python/HomePage
对于python中运行javascript,有总结:
|
7. 最后还是需要先去看懂百度博客中的html源码里面的执行的逻辑
以
http://hi.baidu.com/recommend_music/blog/item/5fe2e923cee1f55e93580718.html
为例,看了其html源码。
看了半天,还是很不懂。
不过对于其中用到了一些函数,比如
baidu.dom.insertHTML
baidu.dom.getPosition
baidu.dom.ready
baidu.G
然后就去网络上搜索,后来无意间找到了这里:
得知这些函数都是百度的Tangram库中的API函数。
然后就接着找,找到了百度的Tangram的API在线手册:
http://tangram.baidu.com/api.html#baidu.dom.g
其核心源代码已经公开了:
https://github.com/BaiduFE/Tangram-base
(1)baidu.g
针对baidu.g这个API,刚开始找了半天没有找到,后来终于看到了:
http://tangram.baidu.com/api.html#baidu.dom.g
中的API 参考手册 -> Base 部分 -> dom -> g ,右边可以看到“快捷方式:baidu.g,T.G”
即baidu.dom.g可以简写位baidu.g或者T.G
即baidu.g=baidu.dom.g,具体的功能是,获得对应的标签的属性:
baidu.dom.g 从文档中获取指定的DOM元素 语法: baidu.dom.g(id) |
也可以点击“获取源码”而看到对应的代码实现:
<table border="1" cellspacing="1" cellpadding="1" width="80%"><tbody><tr><td><p> /**<br /> * 从文档中获取指定的DOM元素<br /> * @name baidu.dom.g<br /> * @function<br /> * @grammar baidu.dom.g(id)<br /> * @param {string|HTMLElement} id 元素的id或DOM元素<br /> * @shortcut g,T.G<br /> * @meta standard<br /> * @see baidu.dom.q<br /> * <br /> * @returns {HTMLElement|null} 获取的元素,查找不到时返回null,如果参数不合法,直接返回参数<br /> */<br />baidu.dom.g = function (id) {<br /> if ('string' == typeof id || id instanceof String) {<br /> return document.getElementById(id);<br /> } else if (id && id.nodeName && (id.nodeType == 1 || id.nodeType == 9)) {<br /> return id;<br /> }<br /> return null;<br />};</p><p>// 声明快捷方法<br />baidu.g = baidu.G = baidu.dom.g;</p></td></tr></tbody></table>
后面就是一点点分析那些javascript脚本的内容了,然后找到如何去获得对应的一个帖子的评论内容的。关于具体分析过程,贴在这里了:
<font size="3"><font color="#0000ff"><span><font face="微软雅黑">如何去分析百度空间的html源码,以得知其是如何去获得一个帖子的评论内容的 v2011-12-14</font></span> </font></font><br /><a href="http://againinput4.blog.163.com/blog/static/1727994912011111915324824/">http://againinput4.blog.163.com/blog/static/1727994912011111915324824/</a>