采用python开发的一些爬虫工具:https://github.com/flyer103
利用 Heritrix 构建特定站点爬虫:http://www.ibm.com/developerworks/cn/opensource/os-cn-heritrix/
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 )
构造一个使用argv中argc个命令行参数的应用程序对象。如果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' 的方法有:
- PyQt4 中的 QtWebKit 模块
- Selenium
- Splinter
- 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 还有些好处是,可以通过它控制网络行为,即控制哪些请求可以发送、哪些不能发送、是否接收图片等。
希望大家能根据我分析的情况,帮我分析下如何才能获得一个完全解析的页面。提前感谢下。