阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

教你两种python selenium保存图片的方法

74次阅读
没有评论

共计 1934 个字符,预计需要花费 5 分钟才能阅读完成。

导读 大家好,本篇文章主要讲的是 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')

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 保存图片最好的两种方法的文章就介绍到这了。

阿里云 2 核 2G 服务器 3M 带宽 61 元 1 年,有高配

腾讯云新客低至 82 元 / 年,老客户 99 元 / 年

代金券:在阿里云专用满减优惠券

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-07-25发表,共计1934字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中