最新消息:20181230 VPS服务器已从Linode换到腾讯云香港,主题仍用朋友推荐的大前端D8

【已实现】想要通过python脚本实现抓取百度空间上的文章,评论,图片 v2011-12-20

Crawl_EmulateLogin crifan 583浏览 0评论

 【已实现】想要通过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
$ python setup.py install

—————————————————————————
This script requires setuptools version 0.6c9 to run (even to display
help).  I will attempt to download it for you (from
http://pypi.python.org/packages/2.6/s/setuptools/), but
you may need to enable firewall access for this script first.
I will start the download in 15 seconds.

(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.)
—————————————————————————
Downloading http://pypi.python.org/packages/2.6/s/setuptools/setuptools-0.6c9-py2.6.egg
Traceback (most recent call last):
&nbsp; File “setup.py”, line 186, in <module>
&nbsp;&nbsp;&nbsp; **platform_config()
&nbsp; File “setup.py”, line 141, in platform_config
&nbsp;&nbsp;&nbsp; raise RuntimeError(“Unknown system name: %s” % sysname)
RuntimeError: Unknown system name: CYGWIN_NT-6.1

然后看到这里:&nbsp;&nbsp;&nbsp;
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脚本,却无从下手,不知道如何才能运行。

&nbsp;

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,有总结:

&nbsp;

  • Python 可以通过 pamie 控制 IE 浏览器,通过 jssh 控制 Firefox ,主要目的是能比较完善地处理 Javascript 等。
  • twill:Web 访问的自动化工具,有命令行界面和 Python API 。可以填写表单、支持 cookies 等,因此可以用作 Web 的自动化测试工具。
    • mechanize是一个与之类似的东西,不过似乎使用起来比 twill 复杂一些,并且即使是这东西也仍然不支持 Javascript 的执行。
  • pyv8:这是 Google V8 Javascript 引擎的 Python 封装,也就是说可以利用这个桥接器在 Python 里头运行 Javascript 代码。
  • &nbsp;&nbsp;&nbsp;

    7. 最后还是需要先去看懂百度博客中的html源码里面的执行的逻辑

    http://hi.baidu.com/recommend_music/blog/item/5fe2e923cee1f55e93580718.html

    为例,看了其html源码。

    看了半天,还是很不懂。

    不过对于其中用到了一些函数,比如

    baidu.dom.insertHTML

    baidu.dom.getPosition

    baidu.dom.ready

    baidu.G

    然后就去网络上搜索,后来无意间找到了这里:

    名客技术网 >> Js框架 >> Tangram教程

    得知这些函数都是百度的Tangram库中的API函数。

    然后就接着找,找到了百度的Tangram的API在线手册:

    http://tangram.baidu.com/api.html#baidu.dom.g

    其核心源代码已经公开了:

    https://github.com/BaiduFE/Tangram-base

    &nbsp;

    (1)baidu.g

    针对baidu.g这个API,刚开始找了半天没有找到,后来终于看到了:

    http://tangram.baidu.com/api.html#baidu.dom.g

    中的API 参考手册 &nbsp;-> Base 部分 &nbsp;-> dom &nbsp;-> g ,右边可以看到“快捷方式:baidu.g,T.G

    即baidu.dom.g可以简写位baidu.g或者T.G

    即baidu.g=baidu.dom.g,具体的功能是,获得对应的标签的属性:

    &nbsp;baidu.dom.g

    从文档中获取指定的DOM元素

    语法: baidu.dom.g(id)

    也可以点击“获取源码”而看到对应的代码实现:

    <table border="1" cellspacing="1" cellpadding="1" width="80%"><tbody><tr><td><p>&nbsp;/**<br />&nbsp;* 从文档中获取指定的DOM元素<br />&nbsp;* @name baidu.dom.g<br />&nbsp;* @function<br />&nbsp;* @grammar baidu.dom.g(id)<br />&nbsp;* @param {string|HTMLElement} id 元素的id或DOM元素<br />&nbsp;* @shortcut g,T.G<br />&nbsp;* @meta standard<br />&nbsp;* @see baidu.dom.q<br />&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;* @returns {HTMLElement|null} 获取的元素,查找不到时返回null,如果参数不合法,直接返回参数<br />&nbsp;*/<br />baidu.dom.g = function (id) {<br />&nbsp;&nbsp;&nbsp; if ('string' == typeof id || id instanceof String) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return document.getElementById(id);<br />&nbsp;&nbsp;&nbsp; } else if (id &amp;&amp; id.nodeName &amp;&amp; (id.nodeType == 1 || id.nodeType == 9)) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return id;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; return null;<br />};</p><p>// 声明快捷方法<br />baidu.g = baidu.G = baidu.dom.g;</p></td></tr></tbody></table>
    &nbsp;

    后面就是一点点分析那些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>

    转载请注明:在路上 » 【已实现】想要通过python脚本实现抓取百度空间上的文章,评论,图片 v2011-12-20

    发表我的评论
    取消评论

    表情

    Hi,您需要填写昵称和邮箱!

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址
    57 queries in 0.275 seconds, using 10.23MB memory