使用Python urllib无法下载图片问题求助
解决urllib下载图片生成空文件的问题
这种情况十有八九是网站拦截了默认的urllib请求头——浏览器请求时会带上标准的User-Agent标识自己是浏览器,而urllib默认的User-Agent太直白(比如Python-urllib/2.7),网站服务器直接返回空内容或者拒绝响应。我之前踩过这个坑,给你几个靠谱的解决方法:
方法1:补全你尝试的FancyURLopener用法(适合Python2)
你已经写了自定义Opener的开头,只需要实例化后调用retrieve方法就行:
from urllib import FancyURLopener class MyOpener(FancyURLopener, object): # 替换成浏览器的User-Agent,这里用Chrome的例子,你也可以换成Firefox的 version = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' url = "https://xxxxxxxxxxxxxxxxxxxxxxxxxx.jpg" myopener = MyOpener() myopener.retrieve(url, "myimage.jpg")
方法2:用urllib2手动构造请求头(Python2)
如果不想用FancyURLopener,直接构造Request对象带自定义headers也可行:
import urllib2 url = "https://xxxxxxxxxxxxxxxxxxxxxxxxxx.jpg" headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' } req = urllib2.Request(url, headers=headers) response = urllib2.urlopen(req) with open('myimage.jpg', 'wb') as f: f.write(response.read())
方法3:Python3的urllib.request写法
要是你用的是Python3,urllib的结构有变化,得这么写:
from urllib.request import Request, urlopen url = "https://xxxxxxxxxxxxxxxxxxxxxxxxxx.jpg" headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' } req = Request(url, headers=headers) with urlopen(req) as response, open('myimage.jpg', 'wb') as out_file: out_file.write(response.read())
方法4:用requests库更简单(强烈推荐)
requests库的语法比urllib友好太多,一行请求就能搞定,还自动处理很多细节:
先安装requests:
pip install requests
然后写代码:
import requests url = "https://xxxxxxxxxxxxxxxxxxxxxxxxxx.jpg" headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' } response = requests.get(url, headers=headers) with open('myimage.jpg', 'wb') as f: f.write(response.content)
另外提个醒:如果网站还有更严格的反爬(比如需要Cookie、Referer),你可以用浏览器F12打开开发者工具,复制请求头里的完整参数加到代码里,基本就能解决问题。
内容的提问来源于stack exchange,提问作者FabioDev
相关产品推荐
相关产品推荐

