如何使用Python 3从URL下载图片?代码报URLError如何解决?
报错原因
- 目标站点配置了反爬规则,
urllib.request发起独立请求时没有携带Selenium浏览器会话中的Cookies、User-Agent等校验信息,被服务器主动拒绝访问 - 部分存储资源站会限制非浏览器环境的直接请求,即使拿到资源直链,无有效会话信息的请求也会被拦截
- 若本地配置了网络代理,urllib默认不会复用Selenium的代理配置,也可能触发连接失败
可行解决方案
方案1:给urllib配置Selenium会话信息后再请求
修改后的代码如下:
import urllib.request from selenium import webdriver driver = webdriver.Chrome('c://CSALE//chromedriver.exe') driver.get('https://kbdevstorage1.blob.core.windows.net/asset-blobs/19950_en_1') img = driver.find_element_by_xpath('/html/body/img').get_attribute('src') # 复用当前浏览器的请求头和Cookie构造urllib请求 opener = urllib.request.build_opener() opener.addheaders = [ ("User-Agent", driver.execute_script("return navigator.userAgent")), ("Cookie", "; ".join([f"{c['name']}={c['value']}" for c in driver.get_cookies()])) ] urllib.request.install_opener(opener) urllib.request.urlretrieve(img, "wolf.png") driver.close()
方案2:直接用Selenium元素截图能力,跳过额外请求
当前页面只有目标图片一个元素时,直接对元素截图即可,不会触发额外的请求拦截,实现更简单:
from selenium import webdriver driver = webdriver.Chrome('c://CSALE//chromedriver.exe') driver.get('https://kbdevstorage1.blob.core.windows.net/asset-blobs/19950_en_1') # 直接对图片元素截图保存 driver.find_element_by_xpath('/html/body/img').screenshot("wolf.png") driver.close()
内容的提问来源于stack exchange,提问作者Tikkaty
相关产品推荐
相关产品推荐

