如何给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 @ 2021-03-11 21:17  shang的学习园地  阅读(1007)  评论(0编辑  收藏  举报