headless browser

采用python开发的一些爬虫工具:https://github.com/flyer103

利用 Heritrix 构建特定站点爬虫http://www.ibm.com/developerworks/cn/opensource/os-cn-heritrix/

 数据爬取方面的博客(好久没有更新了)http://www.cnblogs.com/lexus/archive/2011/10/26.html

知乎上关系爬虫的讨论(比较浅): http://www.zhihu.com/question/20899988

cola:https://github.com/chineking/cola/wiki

QtWebKit 设置浏览器的大小和触发拉动滚动条的动作:https://groups.google.com/forum/#!topic/python-cn/8XYiefPRVJU

 QWebView.resize() 方法

 QWebFrame::scroll(int dx, int dy) 

QApplication::QApplication ( int & argc, char ** argv, bool GUIenabled )

构造一个使用argvargc个命令行参数的应用程序对象。如果GUIenabled为真,图形用户界面应用程序被构造,否则非图形用户界面(命令行)应用程序被创建。

对于没有图形用户界面的程序,设置GUIenabled为假可以在没有窗口系统的情况下运行。

在X11下,如果GUIenabled为真,窗口系统被初始化。如果GUIenabled为假,应用程序不连接X服务器。在Windows和Macintosh,现在窗口系统总是被初始化,而不管GUIenabled的值。在Qt未来的版本这也许会改变。


QPrinter printer;
printer.setOutputFormat(QPrinter::PdfFormat);
printer.setOutputFileName(fileName);

page->mainFrame->print(&printer);



最近在做 'headless browser',用在抓取网页方面。目前遇到了瓶颈,希望能得到大家的指点。


网页中一般有 AJAX 请求,如向下拉动滚动条时再加载网页的其它信息。遇到这种情况,要么分析 AJAX 请求的 url,在代码中显式发送这些 url,要么通过特殊的方法,发送一次请求就完全解析包含 AJAX 的网页,即实现 'headless browser'。

目前我了解过的可以实现 'headless browser' 的方法有:

  1. PyQt4 中的 QtWebKit 模块
  2. Selenium
  3. Splinter
  4. PhantomJS
使用 Selenium 的话,可以通过设置 Xvfb 的参数可以获取到网页的全部信息。但它本质上是在内存中打开本地的浏览器,依赖于本地的浏览器,占用系统资源很大,完全解析一个页面在 30s 以上(普通的笔记本上测试的数据),消耗的时间太长。

Splinter 提供了一个 'headless browser',但经我使用发现,它并不能解析 JS,若想解析 JS,仍需调用 Selenium 提供的 webdriver。

PhantomJS 没有尝试过,但有人以前试过,不过听说由于 PhantomJS  读取 url 和存储抓取到的网页信息都要存储到文本中而不能及时交给 python 处理,暂时没有尝试。昨天看到有人在邮件列表中讨论结合 Python、PhantomJS 使用,接下来会尝试下使用。

这两周一直在研究 QtWebKit,它的 API 很强大,提供了很多操作浏览器的功能,但与它相关的资料太少,有价值的只有 API 手册,这对于初次接触 PyQt4/PySide 的人来说,有些吃力。
不过,网上有几个例子可以参考,但这些例子只能抓取 “一屏”
 数据,即不能完全解析页面,其它的内容需要触发往下拉动滚动条的动作才能获得。

对于这种情况,有两种解决方案,一种是通过 QWebView().resize() 方法来变大 "浏览器" 的大小,因为在不同的浏览器尺寸下,一次能获得信息量不同。另一种是通过 PyQt4 提供的 API 触发拉动滚动条的动作。

前一种方法对于某些网页适用,我尝试了,对于某些网站的网页,可以基本完全解析网页,包括那些需要往下拉动滚动条才能获得的网页信息。但对于另一些网站,没有效果,发送的 HTTP 请求数在不同的浏览器 "尺寸" 下基本都相同。
后一种方法经过测试,发现是在所有代码执行完后才会看出滚动条被拉下的行为,这样就不能在触发该动作后把网页的信息抓取到。

同时,可能是网络的原因,在不同的网络环境下,相同的代码发送的 HTTP 请求数也不一样。即使是相同的代码、相同的网络环境,在不同的时间段发送的 HTTP 请求有时也不一样……
这有些诡异……

基于 QtWebKit 还有些好处是,可以通过它控制网络行为,即控制哪些请求可以发送、哪些不能发送、是否接收图片等。

希望大家能根据我分析的情况,帮我分析下如何才能获得一个完全解析的页面。提前感谢下。

你可能感兴趣的:(headless browser)