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

目录
  • 1. 通过抓包
    • 1-1.通过拦截器
    • 1-2. 请求后在所有请求中获取
  • 2. 通过canvas
  • 总结

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保存图片内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python爬虫系列Selenium定向爬取虎扑篮球图片详解

    前言: 作为一名从小就看篮球的球迷,会经常逛虎扑篮球及湿乎乎等论坛,在论坛里面会存在很多精美图片,包括NBA球队.CBA明星.花边新闻.球鞋美女等等,如果一张张右键另存为的话真是手都点疼了.作为程序员还是写个程序来进行吧! 所以我通过Python+Selenium+正则表达式+urllib2进行海量图片爬取. 运行效果: http://photo.hupu.com/nba/tag/马刺 http://photo.hupu.com/nba/tag/陈露 源代码: # -*- coding: utf

  • Python+selenium实现截图图片并保存截取的图片

    这篇文章介绍如何利用Selenium的方法进行截图,在测试过程中,是有必要截图,特别是遇到错误的时候进行截图.在selenium for Python中主要有三个截图方法,我们挑选其中最常用的一种. 截图技能对于测试人员来说应该是较为重要的一个技能. 在自动化测试中,截图可以帮助我们直观的定位错误.记录测试步骤. 记得以前在给某跨国银行做自动化项目的时候,某银的PM要求我们自动化测试的每一步至少需要1个截图,以证明每个功能都被自动化测试给覆盖过,在这种情况下截图就成了证明自动化测试有效性的重要手

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

    目录 1. 通过抓包 1-1.通过拦截器 1-2. 请求后在所有请求中获取 2. 通过canvas 总结 selenium爬取页面时经常遇到要保存图片的需求,通常的做法是获取链接后用 requests 下载,但这种方法脱离了selenium环境,如遇到有校验的情况还需要绕过校验. 下面介绍两种直接通过selenium保存图片的方法: 1. 通过抓包 selenium-wire 是selenium扩展,它可以对所有请求抓包,同时还可以修改请求头,请求body,请求返回值等,功能非常强大. sele

  • python 自动刷新网页的两种方法

    1.简介 打开网页 实现定时刷新 可以看到 多次自动打开关闭网页之后,浏览的数量 从 118 自动变成了 119 2.功能实现 1) 一种方法 from time import sleep from selenium import webdriver driver= webdriver.Chrome() # 需要 下载 对应浏览器 驱动到 python 安装目录 driver.get("https://blog.csdn.net/qq_27061049/article/details/90577

  • Python在图片中添加文字的两种方法

    本文主要介绍的是利用Python在图片中添加文字的两种方法,下面分享处理供大家参考学习,下来要看看吧 一.使用OpenCV 在图片中添加文字看上去很简单,但是如果是利用OpenCV来做却很麻烦.OpenCV中并没有使用自定义字体文件的函数,这不仅意味着我们不能使用自己的字体,而且意味着他无法显示中文字符.这还是非常要命的事情.而且他显示出来的文字位置也不太好控制.比如下面的代码,他想做的仅仅是显示数字3: 代码: #coding=utf-8 import cv2 import numpy as

  • python实现中文输出的两种方法

    本文实例讲述了python实现中文输出的两种方法.分享给大家供大家参考.具体如下: 方法一: 用encode和decode 如: import os.path import xlrd,sys Filename='/home/tom/Desktop/1234.xls' if not os.path.isfile(Filename): raise NameError,"%s is not a valid filename"%Filename bk=xlrd.open_workbook(Fi

  • Python生成MD5值的两种方法实例分析

    本文实例讲述了Python生成MD5值的两种方法.分享给大家供大家参考,具体如下: # -*- coding:utf-8 -*- import datetime # NO.1 使用MD5 import md5 src = 'this is a md5 test.' m1 = md5.new() m1.update(src) print m1.hexdigest() 运行结果: 174b086fc6358db6154bd951a8947837 # -*- coding:utf-8 -*- # NO

  • Python实现平行坐标图的两种方法小结

    平行坐标图,一种数据可视化的方式.以多个垂直平行的坐标轴表示多个维度,以维度上的刻度表示在该属性上对应值,相连而得的一个折线表示一个样本,以不同颜色区分类别. 但是很可惜,才疏学浅,没办法在Python里实现不同颜色来区分不同的类别.如果对此比较在意的大神可以不要往下看了......... 上图是一个基于iris数据集所画的一个平行坐标图. 隔开隔开.......................................隔开隔开 不多扯了,下面正式上代码 方法一.基于pyecharts第三

  • python生成requirements.txt的两种方法

    python项目如何在另一个环境上重新构建项目所需要的运行环境依赖包? 使用的时候边记载是个很麻烦的事情,总会出现遗漏的包的问题,这个时候手动安装也很麻烦,不能确定代码报错的需要安装的包是什么版本.这些问题,requirements.txt都可以解决! 生成requirements.txt,有两种方式: 第一种 适用于 单虚拟环境的情况: : pip freeze > requirements.txt 为什么只适用于单虚拟环境?因为这种方式,会将环境中的依赖包全都加入,如果使用的全局环境,则下载

  • python爬虫模拟浏览器的两种方法实例分析

    本文实例讲述了python爬虫模拟浏览器的两种方法.分享给大家供大家参考,具体如下: 爬虫爬取网站出现403,因为站点做了防爬虫的设置 一.Herders 属性 爬取CSDN博客 import urllib.request url = "http://blog.csdn.net/hurmishine/article/details/71708030"file = urllib.request.urlopen(url) 爬取结果 urllib.error.HTTPError: HTTP

  • python 读取yaml文件的两种方法(在unittest中使用)

    作者:做梦的人(小姐姐) 出处:https://www.cnblogs.com/chongyou/ python读取yaml文件使用,有两种方式: 1.使用ddt读取 2,使用方法读取ddt的内容,在使用方法中进行调用 1.使用ddt读取 @ddt.ddt class loginTestPage(unittest.TestCase):     @ddt.file_data(path)     @ddt.unpack     def testlogin(self,**kwargs):       

  • Python获取网络时间戳的两种方法详解

    目录 方法一 代码实现 调用方法 返回结果 方法二 代码实现 调用方法 返回结果 在我们进行注册码的有效期验证时,通常使用获取网络时间的方式来进行比对. 以下为获取网络时间的几种方式. 方法一 需要的时间会比较长,个别电脑上可能会出现不兼容现象 代码实现 def get_web_server_time(self, host_URL, year_str='-', time_str=':'): ''' 获取网络时间,需要的时间会比较长,个别电脑上可能会出现不兼容现象 :param host_URL:

随机推荐