python selenium+firefox对网页截长图

需求

对网页截图,包括网页的不可视部分。

方法

1.Firefox webdriver,无头模式+调整窗口宽高+截图窗口

options = Options()
options.add_argument('--no-sandbox')
options.add_argument('--headless')
options.add_argument('--disable-gpu')
options.add_argument('--disable-dev-shm-usage')
driver = webdriver.Firefox(options=options)
S = lambda X:driver.execute_script('return document.body.parentNode.scroll' + X)
driver.set_window_size(1366, S('Height'))
driver.save_screenshot('test.png')

2.针对已知元素id的元素截图,可以直接截图元素全部内容

# 例如微信公众号文章可以用以下方法截取文章内容(需要已知元素id)
driver.find_element_by_id('img-content').screenshot('tt.png')

上面2个方法的优点是实现简单。缺点是方法1的图片分辨率和质量一般,需要自行调整,消耗资源一般。
具体实现可参考网上已有的:https://github.com/auv1107/PythonSpiderLibs/blob/master/WebDriverLib.py

3. 其他未验证的方法,曲线救国
  1. html转canvas截图,Firefox自带的截图插件使用的就是这种方法
  • 注入第三方html转canvas的js库
  • 获取元素html源码
  • 将html转换为canvas:http://html2canvas.hertzen.com/documentation.html
  • 下载canvas
  1. PIL裁剪拼接
    每次截图当前可视窗口,再依次拼接起来。可参考:https://www.cnblogs.com/superhin/p/11482188.html
    缺点:有悬浮导航tab时会在拼接后的图片上保留多个悬浮导航,且窗口位置需要自行调试测试,可能有错位,速度一般。
  2. Firefox改为phantomJs驱动,可直接截图整个窗口和元素
    不是可视化的浏览器,类似于Firefox的无头模式,且phantomJs不更新了,不推荐。
  3. 去掉干扰元素单独截取某个元素的图片
    网上有人说选取元素进行截图遇到bug,所以用了替代方案即去掉干扰元素再截图全屏,会有很多多余空白,不推荐。

你可能感兴趣的:(Python,selenium)