轻量级Python网络浏览器
我这里有个有点奇怪的请求,不过我实在想不出答案。
我正在写一个Python应用程序,用来显示网页和本地存储的图片。
我需要一种方法,用Python快速且轻量地显示网页。这样做的原因是因为这个程序要在树莓派上运行。
当然,我有很多选择。我可以通过在Raspbian系统上安装的网页浏览器来运行它,并在Python中作为一个单独的进程运行;我也可以下载一个兼容Arch-Linux的浏览器,并在Python中作为一个单独的进程运行;最后,我可以使用Gtk或PyQt编写自己的原生Python文件。
不过,这些方法都有缺点,并且开销很大。网页浏览器在显示网页时必须全屏,而在显示图片时又要最小化。
我在使用Gtk和PyQt时遇到的主要问题是,它们必须在主线程中执行——这对我多线程的架构来说是不可能的。使用Raspbian上预装的网页浏览器的缺点是,从Python中控制它很困难,而且速度也慢。至于使用Arch-Linux的浏览器,结果往往会变得杂乱无章,难以控制。
我理想中的需求是一个几乎能瞬间加载网页的浏览器,或者一个可以处理多个实例的多线程网页浏览器。这样我就可以在后台加载一个网页,同时显示另一个网页。
你们有没有什么建议可以让我找到正确的方向?我本以为现在应该有一个不错的基于Python的多线程解决方案,但我觉得这可能是因为没有人需要做我正在做的事情(不太可能)——或者我错过了什么重要的东西(更可能)!
任何建议都非常感谢。
詹姆斯。
3 个回答
我用Vala写了一个叫winks-up的小程序。它体积小,运行快,而且在Raspbian系统上编译得很好。所有的代码都经过优化,以减少内存占用。虽然不是完美的,但总比没有要好。
我会用PyQT来显示页面,但如果PyQT处理线程的方式不适合你的应用程序,你可以用PyQT写一个简单的网页浏览器(大概只需要10行代码),然后把它从你的主应用程序中分离出来吗?
我找到的解决办法是使用两个叫做 netsurf-fb 和 links2 的 Linux 帧缓冲浏览器。
不过经过大量测试后,我觉得这些浏览器不太合适,因为它们不支持 JavaScript。
所以最终的解决方案是使用一个叫做 cutycapt 的脚本,它在一个叫做 xvfb 的虚拟 X 窗口帧缓冲中运行。
我通过 Python 调用了这个脚本,使用了 pxpect 库,代码如下:
process=pexpect.spawn(xvfb_run_bin+' --server-args "-screen 0, '+self.width_height+'x24" cutycapt --url='+uri+' --out='+temp_path)
process.wait()
在我的实现中,这个脚本会运行,渲染网页并保存屏幕截图。然后,一个图片查看器会从我的缓存中获取这个图片并显示出来。
如果有人还有其他问题,欢迎在这个问题下留言...
关于 cutycapt 的重要信息。如果你想用 JavaScript 渲染整个页面,可能会花更长时间... 你可以指定 --delay 1000
,这样会让加载延迟 1 秒。在我的情况下,大约需要 7000 毫秒才能达到理想效果...