python selenium保存图片最好的两种方法

 更新时间:2022年01月26日 16:38:30   作者:五十风  
大家好,本篇文章主要讲的是python selenium保存图片最好的两种方法,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下

selenium爬取页面时经常遇到要保存图片的需求,通常的做法是获取链接后用 requests 下载,但这种方法脱离了selenium环境,如遇到有校验的情况还需要绕过校验。

下面介绍两种直接通过selenium保存图片的方法:

1. 通过抓包

selenium-wire 是selenium扩展,它可以对所有请求抓包,同时还可以修改请求头,请求body,请求返回值等,功能非常强大。

selenium-wire 的使用和selenium一样,你只从seleniumwire导入webdriver就行,对于其他包还是从selenium导入

from selenium.webdriver.chrome.options import Options
from seleniumwire.webdriver import Chrome

driver = Chrome(options= Options())

下载图片有两种方法:

1-1.通过拦截器

通过拦截器预先把所有图片保存下来,要用到时在缓存目录中找

def get_img_path_from_url(url):
    # 自行实现
    return url

def response_interceptor(request, response):
    t=response.headers['Content-Type']
    if request.host=='xxx' and t and 'image' in t:
        with open(get_img_path_from_url(request.url), 'wb') as f:
            f.write(response.body)
            
driver.response_interceptor = response_interceptor

driver.get('...')
src=driver.find_element_by_tag_name('img').get_attribute('src')
img_path=get_img_path_from_url(src)

1-2. 请求后在所有请求中获取

这种方法有个缺点,浏览器会自动缓存图片,如果之前已经缓存过这张图片是不会有网络请求的

# 下载前先清理数据,不然请求太多
del driver.requests
driver.get('...')
src=driver.find_element_by_tag_name('img').get_attribute('src')</code>
<code>
for r in driver.iter_requests():
    if r.url==src:
        with open('img', 'wb') as f:
            f.write(r.response.body)

2. 通过canvas

使用js把图片放到canvas中,然后获取base64字符串,再保存

import base64
import os
import re
from io import BytesIO
from PIL import Image

def base64_to_image(base64_str):
    base64_data = re.sub('^data:image/.+;base64,', '', base64_str)
    byte_data = base64.b64decode(base64_data)
    image_data = BytesIO(byte_data)
    img = Image.open(image_data)
    return img


js = "let c = document.createElement('canvas');let ctx = c.getContext('2d');" \
     "let img = document.getElementsByTagName('img')[0]; /*找到图片*/ " \
     "c.height=img.naturalHeight;c.width=img.naturalWidth;" \
     "ctx.drawImage(img, 0, 0,img.naturalWidth, img.naturalHeight);" \
     "let base64String = c.toDataURL();return base64String;"
     
base64_str = driver.execute_script(js)
img = base64_to_image(base64_str)

img.save('xx.png')

总结

到此这篇关于python selenium保存图片最好的两种方法的文章就介绍到这了,更多相关python selenium保存图片内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python并发多线程的具体操作步骤

    Python并发多线程的具体操作步骤

    并发指的是任务数多余cpu核数,通过操作系统的各种任务调度算法,实现用多任务一起执行,下面这篇文章主要给大家介绍了关于Python并发多线程的具体操作步骤的相关资料,需要的朋友可以参考下
    2024-02-02
  • Python实现带参数与不带参数的多重继承示例

    Python实现带参数与不带参数的多重继承示例

    这篇文章主要介绍了Python实现带参数与不带参数的多重继承,结合具体实例形式对比分析了Python实现带参数与不带参数的多重继承相关操作技巧,需要的朋友可以参考下
    2018-01-01
  • python笔记(2)

    python笔记(2)

    python笔记,参考上一篇文章大家继续
    2012-10-10
  • Python自带的IDE在哪里

    Python自带的IDE在哪里

    在本篇内容里小编给大家分享的是关于如何找到Python自带的IDE的相关内容,有兴趣的朋友们可以学习下。
    2020-07-07
  • 浅谈Series和DataFrame中的sort_index方法

    浅谈Series和DataFrame中的sort_index方法

    今天小编就为大家分享一篇浅谈Series和DataFrame中的sort_index方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-06-06
  • Python连接字符串过程详解

    Python连接字符串过程详解

    这篇文章主要介绍了python连接字符串过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • python 简单的多线程链接实现代码

    python 简单的多线程链接实现代码

    这篇文章主要介绍了python 简单的多线程链接实现代码,需要的朋友可以参考下
    2016-08-08
  • python中Flask Web 表单的使用方法介绍

    python中Flask Web 表单的使用方法介绍

    这篇文章主要介绍了python中Flask Web 表单的使用方法介绍,表单的操作是Web程序开发中最核心的模块之一,绝大多数的动态交互功能都是通过表单的形式实现的。更多介绍需要的小伙伴可以参考下面文章内容
    2022-05-05
  • 探索Python random模块随机性神奇世界

    探索Python random模块随机性神奇世界

    Python中的random模块提供了丰富的工具和函数,帮助我们生成随机数、操作随机序列,以及模拟随机性事件,在本文中,我们将分享random模块,了解它的基本用法、功能和应用领域,并提供示例代码来帮助你更好地理解随机性的神奇世界
    2023-11-11
  • windows11环境安装django项目GNU gettext工具的步骤

    windows11环境安装django项目GNU gettext工具的步骤

    Django 框架具有很好的 I18N 和 L10N 的支持,其实现是基于 GNU 的 gettext,本文主要介绍了windows11环境安装django项目GNU gettext工具的步骤,具有一定的参考价值,感兴趣的可以了解一下
    2024-04-04

最新评论