Python+Selenium实现无头浏览器网页截图

 更新时间:2025年03月13日 09:01:45   作者:程序员Rocky  
这篇文章主要为大家详细介绍了Python+Selenium实现无头浏览器网页截图的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

一、背景

最近有个需求,就是需要登录系统,针对系统的流程数据,有一个工作流程图或者说叫审批流程图。每个阶段都有相对应的人员审批、评论信息,以及是否通过等等。这些信息都需要进行网页截图。

 这些信息人事需要进行归档和压缩,如果是人工操作,里面的流程有将近10w+的数据条目。 这如果让人工实现实在是头大,根本无法完成这个巨大的工作量。

自然这种事情落到了我的头上,谁让我们会搞程序呢,呵呵。  我采用的Python3+Selenium的方式,模拟登录比较麻烦需要验证码各种,我直接使用人事账号的登录cookie即可实现登录,那接下来就是访问页面就可以。  访问到对应页面进行截图保存,然后又继续翻页,继续截图,以此类推。

脑海里就浮现了我的实现逻辑。说干就干。

二、Chrome无头浏览器+驱动下载安装

注意事项:   google-chrome-stable和chromedriver最好保持一致的版本,否则可能会出现兼容性报错的情况!!!!

1、google-chrome-stable下载安装

#1、安装google-chrome-stable的依赖
yum install -y atk at-spi2-atk libdrm mesa-libgbm gtk3 vulkan xdg-utils
#安装中文字体
yum install -y wqy-microhei-fonts
 
#2、下载rpm安装包
https://mirrors.aliyun.com/google-chrome/google-chrome/google-chrome-stable-110.0.5481.77-1.x86_64.rpm
 
#3、安装
 
rpm -ivh google-chrome-stable-110.0.5481.77-1.x86_64.rpm
 
#4、查看版本信息
google-chrome-stable --version

显示版本信息如下,表示google-chrome-stable安装成功:

2、安装chromedriver驱动

# 下载安装包
wget "https://registry.npmmirror.com/-/binary/chromedriver/110.0.5481.77/chromedriver_linux64.zip"
 
# 解压
unzip chromedriver_linux64.zip -d /usr/local/chromedriver
 
# 设置环境变量
 
export CHROME_DRIVER=/usr/local/chromedriver
export PATH=$PATH:$CHROME_DRIVER
 
# 验证chromedriver版本是否与google-chrome-stable版本完全一致,否则会出现兼容性问题
chromedriver --version

三、Python样例代码

1、pip3安装依赖

pip3 install selenium
 
pip3 install pillow

2、样例代码

访问https://qq.com 腾讯门户网站,将腾讯网截图保存下来。  如果是自己的业务,那么传递cookie这些参考文档传递即可。此时,您就当你的程序就是一个chorme浏览器,chrome浏览器能做的事情,你的代码就能做。 只是平时我们使用chrome是鼠标点点点,换到代码就是调用API函数即可。

from selenium.webdriver import Chrome
from selenium.webdriver.chrome.options import Options
import time
import os.path
from PIL import Image
 
def mergeImage(output_path):
    images = [Image.open(os.path.join(output_path, f"screenshot_{i}.png")) for i in range(scrolls)]
    widths, heights = zip(*(i.size for i in images))
 
    total_width = max(widths)
    total_height = sum(heights)
 
    new_image = Image.new('RGB', (total_width, total_height))
    y_offset = 0
    for img in images:
        new_image.paste(img, (0, y_offset))
        y_offset += img.height
 
    final_screenshot_path = os.path.join(output_path, "final_screenshot.png")
    new_image.save(final_screenshot_path)
    print(f"Final screenshot saved to {final_screenshot_path}")
 
 
if __name__ == "__main__":
    # 设置浏览器
    options = Options()
    options.add_argument('--no-sandbox')
    options.add_argument('--disable-gpu')
    options.add_argument('--headless')  # 无头参数
 
    output_path = "./screenshots"
    # 启动浏览器
    driver = Chrome(options=options)
    driver.maximize_window()
    try:
        # 访问页面
        url = 'https://qq.com'
        driver.get(url)
        time.sleep(1)
        # 设置截屏整个网页的宽度以及高度
        scroll_width = 2500
        scroll_height = 9500
        driver.set_window_size(scroll_width, scroll_height)
 
        # 获取页面高度
        total_height = driver.execute_script("return document.body.scrollHeight")
        viewport_height = driver.execute_script("return window.innerHeight")
        scrolls = int(total_height / viewport_height) + 1
 
        # 创建输出目录
        if not os.path.exists(output_path):
            os.makedirs(output_path)
 
        # 滚动并截屏
        for i in range(scrolls):
            y_offset = i * viewport_height
            driver.execute_script(f"window.scrollTo(0, {y_offset});")
            time.sleep(1)  # 等待内容加载
            screenshot_path = os.path.join(output_path, f"screenshot_{i}.png")
            driver.get_screenshot_as_file(screenshot_path)
            print(f"Saved {screenshot_path}")
 
        # 合并图片
        mergeImage(output_path)
 
        # 关闭浏览器
        driver.close()
        driver.quit()
 
    except Exception as e:
        print(e)
 

3、成功保存截图

四、总结

使用Python的原因是,Python针对爬虫这块包很多,也很擅长, 脚本简单清晰。倒是也没必要上Go、Java之类的,Python处理这类问题信手拈来,效率高才是王道! 

Selenium就是个自动化测试框架,底层还可以切换控制Chrome、火狐等等相关浏览器驱动。 

以上就是Python+Selenium实现无头浏览器网页截图的详细内容,更多关于Python无头浏览器截图的资料请关注脚本之家其它相关文章!

相关文章

  • 如何搭建pytorch环境的方法步骤

    如何搭建pytorch环境的方法步骤

    这篇文章主要介绍了如何搭建pytorch环境的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • Python内置函数OCT详解

    Python内置函数OCT详解

    本文给大家介绍的是python中的内置函数oct(),其主要作用是将十进制数转换成八进制,再变成字符。有需要的小伙伴可以参考下
    2016-11-11
  • python协程异步IO中asyncio的使用

    python协程异步IO中asyncio的使用

    这篇文章主要介绍了python异步编程之asyncio的使用,python中异步IO操作是通过asyncio来实现的,为了更加详细说明asyncio,我们先从协程的最基础开始讲解
    2023-12-12
  • Hadoop中的Python框架的使用指南

    Hadoop中的Python框架的使用指南

    这篇文章主要介绍了Hadoop中的Python框架的使用指南,Hadoop一般使用复杂的Java操作,但通过该框架使得Python脚本操作Hadoop成为了可能,需要的朋友可以参考下
    2015-04-04
  • wxpython中利用线程防止假死的实现方法

    wxpython中利用线程防止假死的实现方法

    上午抽空学习了一下在wxpython中启用线程的方法,将GUI和功能的执行分开,果然程序运行起来杠杠滴。因为我那个软件的代码暂时不能公开,这里专门写个小程序,作为今天的笔记吧
    2014-08-08
  • python3 如何解压缩.gz文件

    python3 如何解压缩.gz文件

    这篇文章主要介绍了python3 如何解压缩.gz文件,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09
  • 如何使用 Python为你的在线会议创建一个假的摄像头

    如何使用 Python为你的在线会议创建一个假的摄像头

    这篇文章主要介绍了使用 Python为你的在线会议创建一个假的摄像头,在 Python 的帮助下,不再强制开启摄像头,将向你展示如何为你的在线会议创建一个假的摄像头,需要的朋友可以参考下
    2022-08-08
  • python随机生成库faker库api实例详解

    python随机生成库faker库api实例详解

    今天小编就为大家分享一篇python随机生成库faker库api实例详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • python实现数据导出到excel的示例--普通格式

    python实现数据导出到excel的示例--普通格式

    今天小编就为大家分享一篇python实现数据导出到excel的示例--普通格式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • Python告诉你木马程序的键盘记录原理

    Python告诉你木马程序的键盘记录原理

    今天小编就为大家分享一篇关于Python告诉你木马程序的键盘记录原理,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02

最新评论