如何给urllib.request.urlretrieve 加上header

目前知道的爬虫下载文件就是两种方式:

urllib.request.urlretrieve,感觉这种更快?至少代码比较简洁,但是不能直接加header,遇到一些网站会直接拒绝

urllib.request.get 或者 requests.get 然后写入文件,可以直接加上header,因为requests是基于urllib的,所以我认为是一回事

 

问题是urllib.request.urlretrieve如何加上header呢?

 查了下urllib文档(https://docs.python.org/3/library/urllib.request.html)

urllib.request有一个urlretrieve函数,这个是直接用的

另外有个urllib.request.URLopener类,这个类有一个urlretrieve方法,可以在URLopener类当中设置header,然后用urlretrieve方法下载。

设置header:

headers={
    'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'
    }
opener=urllib.request.URLopener()
opener.version=headers
urllib.request.URLopener.urlretrieve(url,path)

然而测试失败,仍然被拒绝。看文档说是要用一个子类来改变version,试了下也不行,而且显示DeprecationWarning,这个类已经不建议使用了。

另一个方法:

利用OpenerDirector类

headers=('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36')   
opener = urllib.request.build_opener()#实例化一个OpenerDirector
opener.addheaders = [headers]#添加header,注意格式
urllib.request.install_opener(opener)#将OpenerDirector装进opener
urllib.request.urlretrieve(url, path)

测试成功。

可以将上述操作装进一个函数,然后调用即可

复制代码
def add_header_to_retrieve():
    headers=('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36')
    opener = urllib.request.build_opener()
    opener.addheaders = [headers]
    urllib.request.install_opener(opener)
  return
add_header_to_retrieve()
urllib.request.urlretrieve(url, path)
 
复制代码

 

posted @   shang的学习园地  阅读(1165)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示