You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用Python的Selenium WebDriver下载登录保护网站的图片

解决Selenium登录后图片下载的问题

嘿,我明白你现在的困扰——登录后能拿到网页文本,但要么没法直接保存图片,要么截出来的图尺寸不对。别担心,我给你几个靠谱的解决方案:

方法一:提取图片URL,带着登录Cookies用requests下载

这是最靠谱的方式,直接获取图片源文件,比截图质量好得多。核心思路是利用登录后浏览器的会话Cookies,让requests也能访问受保护的图片资源:

  1. 登录完成后,定位到目标图片元素,获取它的真实URL
  2. 把浏览器的Cookies转换成requests能识别的格式
  3. 用requests下载图片并保存到本地

完整代码示例:

from selenium import webdriver
from selenium.webdriver.common.by import By
import requests

# 初始化浏览器并访问目标页面
browser = webdriver.Chrome('../chromedriver')
browser.get('你的目标网站URL')

# 这里请补充你的登录逻辑,比如输入用户名、密码,点击登录按钮
# 示例:
# browser.find_element(By.ID, 'username').send_keys('你的账号')
# browser.find_element(By.ID, 'password').send_keys('你的密码')
# browser.find_element(By.ID, 'login-btn').click()

# 定位目标图片元素(请根据实际网页结构修改定位方式)
img_element = browser.find_element(By.XPATH, '//img[@alt="目标图片描述"]')
# 获取图片的真实URL
img_url = img_element.get_attribute('src')

# 把浏览器的Cookies转换成requests可用的字典格式
session_cookies = {cookie['name']: cookie['value'] for cookie in browser.get_cookies()}

# 下载图片
response = requests.get(img_url, cookies=session_cookies)
# 检查请求是否成功
if response.status_code == 200:
    with open('downloaded_image.jpg', 'wb') as file:
        file.write(response.content)
    print('图片下载成功!')
else:
    print(f'下载失败,状态码:{response.status_code}')

# 关闭浏览器
browser.quit()

注意事项:

  • 如果图片是懒加载的,可能需要先滚动到图片位置,或者获取data-src这类属性(而不是src),具体要看网页的实现
  • 有些网站的图片URL会带临时签名,要确保获取URL时会话是有效的

方法二:截取图片元素本身(而非整个页面)

如果你更倾向于用截图的方式,别用browser.save_screenshot(),直接对图片元素进行截图,这样尺寸就完全匹配了:

from selenium import webdriver
from selenium.webdriver.common.by import By

browser = webdriver.Chrome('../chromedriver')
browser.get('你的目标网站URL')

# 完成登录操作

# 定位图片元素
img_element = browser.find_element(By.CSS_SELECTOR, 'img.target-image-class')

# 直接截取这个元素的截图
img_element.screenshot('image_element_screenshot.png')

browser.quit()

这个方法的好处是不需要处理URL和Cookies,直接截取可见的图片元素,适合那些URL难以获取的场景(比如图片是canvas生成的)。

额外小技巧:处理Base64格式的图片

如果图片的srcdata:image/xxx;base64,xxxxxx这种格式,你可以直接提取Base64内容解码保存:

img_src = img_element.get_attribute('src')
# 分割出Base64部分
base64_data = img_src.split(',')[1]
# 解码并保存
import base64
with open('base64_image.jpg', 'wb') as file:
    file.write(base64.b64decode(base64_data))

内容的提问来源于stack exchange,提问作者beninato

火山引擎 最新活动