Python 使用PAMIE获取JS渲染后的HTML源码
前因
现在的网页越来越动态和漂亮,大量地用到了Javascript,包括但是不限于Ajax,这样一来直接查看网页源代码的话的,获取到的并不是真正的渲染完成后的页面。这对采集来说,是一个很大的挑战。
在火车头当中,对于Ajax获取的数据的话,可以手动分析页面提取的Ajax的处理url,然后来提取。但是对于复杂的session验证(特别是.NET的网站来说)处理比较困难。
另外一方面,对于javascript生成的页面,火车头也没法直接提取。
思路
首先明确的是必须获取Javascript渲染结束后的结果。这一点是明确的,具体就是方法就因人而异。
而自己解决Javascript渲染无异于痴人说梦,所以必须借助现有的浏览器核心,比如Gecko、WebKit、IE。如果用Java开发的话可以Jrec这个库,它封装了Gecko。如果其他的语言,且在Windows平台上的话,最简单的就是用—— COM,用Internet Explorer 提供的com组件。
解决方案
突破了这层关系,下面的就水到渠成了。
在python下,对IE封装的比较完善而且文档齐全的就是PAMIE(http://sourceforge.net/projects/pamie),它的本意是作为自动化测试工具使用的。
需要注意的是,在页面加载完之后需要留出一定时间来让页面的js代码执行渲染完成后再提取html代码,这个时间需要通过试验确定。
PAMIE 示例
PAMIE是一套为Python写的用于Web自动化测试的工具,采用Win32COM的方式操作IE来实现。
Pamie是个很好的操作IE的模块,用pamie来操作ie浏览器好方便,本来它就是一个IE测试自动化的东西,这样,用pamie来抓取网页,自动提交表单很容易。
PAMIE测试最简单的例子:
from cPAMIE import PAMIE ie = PAMIE() ie.navigate("google.com") ie.textBoxSet('q','python') ie.buttonClick('btnG') ie.linkClick('Python Programming Language -- Official Website') ie.windowChange('Python Programming Language -- Official Website') ie.windowFind('Python Programming Language -- Official Website') ie.textBoxSet('q',"Automation") ie.buttonClick('submit')
直接操作页面上的form元素,访问页面的文本信息,来判断用户登陆是否成功。
需要注意点
前面所述的利用PAMIE来获取渲染后的html内容的方法是可行的,但是缺点是效率非常低。对于最常见的ajax动态内容页面来说,最直接的方法还是构造ajax请求,来获取相应内容。这样效率很高,而且返回数据都是结构化的xml或者json数据,比html更容易处理。
版权所有: 本文系米扑博客原创、转载、摘录,或修订后发表,最后更新于 2014-08-10 23:06:44
侵权处理: 本个人博客,不盈利,若侵犯了您的作品权,请联系博主删除,莫恶意,索钱财,感谢!