python3 request.urlretrieve 添加请求头下载图片
import urllib.request
opener = urllib.request.build_opener()
opener.addheaders = [("User-agent", "Mozilla/5.0")]
urllib.request.install_opener(opener)
urllib.request.urlretrieve("type URL here", "path/file_name")
在urllib.request.urlretrieve()使用内部urllib.request.urlopen()(至少在Python 3)。因此,您可以使用相同的方式来影响的行为urlopen。
当urlopen(params)被调用时,它实际上首先查看特殊的全局变量urllib.request._opener,如果是,None则urlopen使用默认的打开程序集来设置该变量,否则它将保留它。在下一步中,它将调用urllib.request._opener.open()(在下一部分中,我urllib.request._opener仅称为opener)。
在opener.open()包含处理程序不同协议的列表。当opener.open()被称为那么它会做的动作:
从URL urllib.request.Request对象创建(或者,如果您直接提供,Request它将使用它)。
从Request对象中提取协议(从URL方案推导得出)。
根据协议,它将尝试查找并使用以下方法:
protocol_request(例如http_request)-它用于在打开连接之前对请求进行预处理。
protocol_open -实际上与远程服务器建立连接
protocol_response -处理来自服务器的响应
有关其他方法,请参阅Python的文档
对于您自己的opener,您必须执行以下三个步骤:
创建自己的处理程序
处理程序的生成列表包含您的自定义处理程序(函数urllib.request.build_opener)
将新的opener安装到urllib.request._opener(功能urllib.request.install_opener)中
对于您自己的开场白,您必须执行以下3个步骤:
这个urllib.request.build_opener创建包含自定义处理程序的打开程序,并添加默认的打开程序,但自定义处理程序继承的处理程序除外。
本博客源码Github地址:
请随手给个star,谢谢!