开发者

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 SYCABPZgrequest.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)
          imwww.cppcns.comg = 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

      上一篇:

      下一篇:

      精彩评论

      暂无评论...
      验证码 换一张
      取 消

      最新开发

      开发排行榜