python selenium+firefox对网页截长图

本文介绍了使用Python的Selenium库配合Firefox浏览器,通过无头模式和调整窗口大小来实现网页全屏截图的方法。还探讨了针对特定元素截图以及通过html2canvas转换为canvas的方式,但后者在处理悬浮元素和窗口位置时存在挑战。最后提到了 PhantomJS 替代方案,但由于其不再更新,不建议使用。

需求

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

方法

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,所以用了替代方案即去掉干扰元素再截图全屏,会有很多多余空白,不推荐。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值