如何使用python来截取网页图像?


需要使用python来截取若干网页的图像,请问用什么包比较方便? 该如何操作?

开发 经验 截图 python

hwybr 9 years, 5 months ago

webkit2png, http://github.com/AdamN/python-webkit...

这个工具本身可以抓取一个网页,然后使用webkit引擎对其进行渲染,并最终将渲染结果保存为png格式的图片。从官方给出的资料来看,webkit2png在Ubuntu上的安装还是比较简单的,在CentOS这一系列OS上的安装可能比较费劲。

安装

如果是在ubuntu桌面版:

apt-get install python-qt4 libqt4-webkit
git clone git://github.com/adamn/python-webkit2png.git
cd python-webkit2png/
python setup.py install

如果是在服务器端:

#安装xvfb用于虚拟X环境
apt-get install xvfb xbase-clients xfonts-base libgtk2.0-0

#安装中文字体
apt-get install xfonts-wqy

#配置字体
fontconfig-voodoo -f -s zh_CN

使用

webkit2png本身的参数和选项并不多,使用也比较简单。一般来说,我们可能用到的选项就是:

-o FILE, --output=FILE                 输出文件的路径
-F FEATURE, --feature=FEATURE         需要额外使用什么webkit功能。可选的也不多,也就javascript或者plugins
-w SECONDS, --wait=SECONDS            截图之前最多等待多长时间。这个也相当于设置一个超时机制。
--encoded-url                         将后面传递的url参数当作url-encode过的来处理

使用本身很简单,接下来问题是。往往服务器操作系统是没有GUI的,直接在shell下运行webkit2png会遇到如下错误信息:

$ webkit2png -o out.png -F javascript http://www.baidu.com
webkit2png: cannot connect to X server :99

为了解决这个问题,需要将之前直接的截图命令做一点改动:

$ xvfb-run webkit2png -o out.png -F javascript http://www.baidu.com

这时候就可以正常对网页截图了。但是很可能截出来的图清晰度不够,无法满足需求(这个不一定,我在Ubuntu下没有遇见这个问题,但是在CentOS上遇见了)。实际上xvfb-run这个命令是一个shell脚本,默认情况下,这个脚本位于/usr/bin。该脚本可以接收一个--server-args的选项。我们只需要添加该参数即可设置截图的分辨率:

$ xvfb-run --server-args="-screen 0 640x480x16" webkit2png -o out.png -F javascript http://www.baidu.com

前面提到,xvfb-run是一个脚本。当我们不加--server-args的选项的时候,他是有默认值的,我们可以打开脚本看一下,我这里挑选出设置选项默认值的地方:

PROGNAME=xvfb-run
SERVERNUM=99
AUTHFILE=
ERRORFILE=/dev/null
STARTWAIT=3
XVFBARGS="-screen 0 640x480x8"
LISTENTCP="-nolisten tcp"
XAUTHPROTO=.

这里的XVFBARGS实际上就是对应--server-args选项的默认值,将这里的默认值改成-screen 0 640x480x16,再截图基本图片清晰度就可以满足一般的截图需要了。另外,我们当时的需求是再一个Java Web项目中使用该工具进行截图。我们在测试的过程中发现,连续的截图请求中,后面的请求往往会失败,在错误日志中,我们看到下面的错误信息:

webkit2png: Fatal IO error: client killed
/usr/bin/xvfb-run: line 171: kill: (2879) - No such process

实际上在xvfb-run脚本的第171行有一个kill当前Xvfb进程的过程:

kill $XVFBPID

将这一行注释掉之后,连续的截图请求就能够正常处理了。

krypton answered 9 years, 5 months ago

Your Answer