如何给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)