如何使用Python的Selenium WebDriver下载登录保护网站的图片
解决Selenium登录后图片下载的问题
嘿,我明白你现在的困扰——登录后能拿到网页文本,但要么没法直接保存图片,要么截出来的图尺寸不对。别担心,我给你几个靠谱的解决方案:
方法一:提取图片URL,带着登录Cookies用requests下载
这是最靠谱的方式,直接获取图片源文件,比截图质量好得多。核心思路是利用登录后浏览器的会话Cookies,让requests也能访问受保护的图片资源:
- 登录完成后,定位到目标图片元素,获取它的真实URL
- 把浏览器的Cookies转换成requests能识别的格式
- 用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格式的图片
如果图片的src是data: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




