遇见一篇有意思的文章,或者是在购物时发现了好东西,需要分享。
不想发送链接,也许搞一个长截图是个很好的选择。
Selenium
Selenium是一种自动化测试工具,它支持各种浏览器,包括 Chrome,Safari,Firefox 等主流界面式浏览器,如果你在这些浏览器里面安装一个 Selenium 的插件,那么便可以方便地实现Web界面的测试。换句话说叫 Selenium 支持这些浏览器驱动。Selenium支持多种语言开发,比如 Java,C,Ruby, Python等等。
在这个案例中,我们使用基于Python3的运行环境进行演示。
使用pip3安装selenium
1 |
|
获取chrome-driver
在淘宝npm镜像中可以找到Chrome版本对应的驱动: http://npm.taobao.org/mirrors/chromedriver/
初始化浏览器
1 |
|
调用Webdriver提供的API, 获取网页基本信息
1 |
|
Chrome在iPhone 6的模拟环境下进行网页渲染,其宽是一定的,所以可以通过调用运行于webdriver内部的javascript代码,获得我们想要的内容。
webdrive提供了丰富的接口供我们全方位操控这个小小的浏览器。
1 |
|
或者,这里还有一个更加可操作的方法,直接在webdriver里跑js代码。Selenium提供了execute_script(str)接口,可以让用户通过自己更为熟悉的方式,得到自己想要的内容。
1 |
|
滚屏截图
webdriver提供了一个保存当前浏览器窗口截图的接口save_screenshot(path)
我们只需要让网页沿着一个预设定的高度滚动就好。
这里,这个高度是667(基于我们以iPhone 6的虚拟环境初始化的浏览器)。设定大于667的高度,每次也并不会截取到更多的页面内容,而小于667的高度,会让你最后进行图片处理的时候非常头疼。
1 |
|
合成图片
上一步结束之后,我们在/tmp_screenshots目录下会发现若干png格式的图片,利用Python中的PIL Image库,可以很方便的对图片做处理。
1 |
|
处理细节
上一步结束之后,我们获得了一张完整的图片,但是,你一定会发现很多小细节没有处理。
图片未被加载
如果你要截取的网页采用了图片懒加载模式(可以提升访问速度),你会发现所截取的网页的图片都被灰色的色块所替代。
我们可以分析网页中,未被加载的图片是否有什么共同点。比如说,是否含有特定的class,是否有自定义的属性值。
1 |
|
图片底部 显示不完全 / 留有大量的空白 / 拼接不完美
造成这个原因,无非是高度和留余问题。
网页高度
某些网页上,在滚屏完毕(即所有图片都被加载后)的高度和网页初始化后的高度并不一致。
高度的错误会导致生成图片时抛出异常
1 |
|
处理好收尾工作
在生成滚屏时,最后一张图片含有两种状态。
- 完美占据一屏的空间 (375 * 667)
- 只占据部分空间,底部含有留白
处理好最后一屏图片和倒数第二屏的关系,就可以避免出现图片拼接不完美的情况。
图片 黑屏 / 损坏
图片过长,尝试按照固定的屏幕数,将一张图切成几张小图。