• 首页
  • 狐文
  • 狐图
  • About
狐窝
OvO
  1. 首页
  2. 未分类
  3. 正文

利用 Python + Selenium 自动化快速截图

2017年08月09日 225点热度 0人点赞 0条评论
2016 from---http://codingpy.com/article/take-screenshot-of-web-page-using-selenium/

Selenium 是一个可以让浏览器自动化地执行任务的工具,常用于自动化测试。与bs4等结合使用,也适合爬取动态网页数据。不过没想到,它居然可以用于网页截图,而且由于可编程性,用法更具想象空间。

目前,Selenium 支持 Java、C#、Ruby 以及 Python 四种客户端语言。如果你使用 Python,则只需要在命令行里输入pip install selenium并回车,即可安装 selenium 的 Python 版本客户端支持。

如何截取整个网页窗口

如果想截取整个窗口的话,可以使用 driver.save_screenshot() 。下面以编程派的网站为例,编写一个脚本截取首页的截图:

from selenium import webdriver

browser = webdriver.Firefox()
url = "http://codingpy.com"
browser.set_window_size(1200, 900)
browser.get(url)

browser.save_screenshot("codingpy.png")
browser.close()

我们运行这段代码之后,会当前目录创建名为codingpy.png的图片文件。我们看一下实际效果(我已对图片进行裁剪,只保留了前面一部分)。

我们发现,第二篇文章的配图没有加载出来,是空白的。这是因为我在设计时要求窗口滚动到元素位置时才加载图片。

先执行JS脚本再截图

不过还好 Selenium 支持注入JS脚本。我们先在首页上执行一段 JavaScript 脚本,将页面的滚动条拖到最下方,然后再拖回顶部,最后才截图。这样可以解决像上面那种按需加载图片的情况。

下面是改进后的代码,封装进了一个名为 `take_screenshot 的函数中:

from selenium import webdriver
import time


def take_screenshot(url, save_fn="capture.png"):
    browser = webdriver.Firefox() # Get local session of firefox
    browser.set_window_size(1200, 900)
    browser.get(url) # Load page
    browser.execute_script("""
        (function () {
            var y = 0;
            var step = 100;
            window.scroll(0, 0);

            function f() {
                if (y < document.body.scrollHeight) {
                    y += step;
                    window.scroll(0, y);
                    setTimeout(f, 100);
                } else {
                    window.scroll(0, 0);
                    document.title += "scroll-done";
                }
            }

            setTimeout(f, 1000);
        })();
    """)

    for i in xrange(30):
        if "scroll-done" in browser.title:
            break
        time.sleep(10)

    browser.save_screenshot(save_fn)
    browser.close()


if __name__ == "__main__":

    take_screenshot("http://codingpy.com")

如何截取某个网页元素

有时候我们只想截取某个网页元素的图片呢?比如说会动态变化的验证码。本来 Selenium 也提供了对元素截图的支持,只要在选中的元素上调用其 screenshot() 方法即可。

但是在实际使用时却遇到了 Unrecognized command 这个异常,经过一段时间检索也没有找到解决办法。所以,只能曲线救国,利用 Selenium 执行JS代码,将页面上不需要的元素一一删除,只保留我们希望留下的元素,然后再利用上面的窗口截屏功能。

例如,如果我们只截取编程派网站右侧的二维码,可以执行这样一段JQuery代码:

$('#main').siblings().remove();
$('#related__wrapper').siblings().remove();
$('.ui.sticky').siblings().remove();
$('.follow-me').siblings().remove();
$('img.ui.image').siblings().remove();

代码执行完毕之后,就只剩下二维码的图片了。然后我们再截屏。不过这样有一点不好,就是截屏图片的下方会有大量空白内容。

结语

虽然对元素截图出现了问题,但是 Selenium 的这个截图功能还是非常强大的。如上所示,它可以在页面上注入并执行一段 JavaScript 代码,还可以模拟鼠标点击等行为;而且可以同时运行多个实例,多个线程同时截图。

总的来说,使用 Selenium 进行网页截图是个不错的选择。

参考资料

  • Capture with Selenium
  • Selenium Python Docs
标签: 暂无
最后更新:2017年08月09日

OvO

狐狸

点赞
< 上一篇
下一篇 >
最新 热点 随机
最新 热点 随机
brave编译打包时dump_syms报错Couldn't locate EXE or DLL file 使用Windows Kits创建PE 及精简镜像 Windows精简部署相关简易内容 APC UPS SUA1000ICH 踩坑记 TrueNAS SCALE虚拟机无法 Ping主机 TrueNas Scale libvirt-sock RDMA RoCE相关资料 Linux系统修改网卡名(eth0-3) Linux系统打开SRIOV 构建android内核时DTC工具中的多个定义错误 Windows 来宾系统提示“安全删除硬件” 修改jar的三种方法(反编译jar) 如何在 Debian 10上安装和配置 VNC Openwrt内SR-IOV网卡桥接问题 Linux下编译android 时报错loadlocale.c:130 windows 查看文件夹被那个进程占用 MongoDB中的多表关联 mongodb 学习记录
Debian8 更新源配置 Centos7安装Oracle12c Mysql开启远程连接方法 编译 Linode 内核模块小白教程,以 tcp_hybla 为例 利用iptables防止ssh暴力破解和控制网速 Js 拦截全局ajax请求 音响的拆解及简要系统分析 2020最好的Linux发行版 软路由系统推荐 如何构建一个中型的 web 应用(全栈技术) 验证码破解技术四部曲之使用卷积神经网络(四) 我的 fedora 調校手冊 Python 爬虫的工具列表 添加SCOTT实例步骤 selenium webdriver 你所不知道的quit 和close Nginx配置子路径WordPress(文件目录与url不同) SourceTree 免登录跳过初始设置 常用 Git 命令清单  
标签聚合
ssl git android e http https linux com 编译 文件 密码 路由 chrome 下载 docker 网卡

COPYRIGHT © 2020 狐窝. ALL RIGHTS RESERVED.

THEME KRATOS MADE BY VTROIS