request.urlretrieve请求图片地址下载失败404
request.urlretrieve可以直接下载图片、网页和视频等文件,而不需要用with open,有时候非常好用。
这个请求把请求和下载二合一,太简单了因此容易犯错。正常情况下两行代码即可实现
import urllib.request
urllib.request.urlretrieve('https://img.aitaotu.cc:8089/Pics/2019/0402/c_72/70992897ec064b798510b83d5eb9ff0d.jpg','tu.jpg')
但是有一次却出现了网址打不开,但是点击网址明明可以打开
报错404,但是实际点击网址就可以打开这里我们需要设置个请求头了,requests用习惯后,要区分requests和urllib.request之间请求的区别
urllib.request中的hearders要通过创建opener实现
from urllib import request
opener = request.build_opener()
opener.addheaders = [('User-Agent', '"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3741.400 QQBrowser/10.5.3863.400'), ]
request.install_opener(opener)
request.urlretrieve('https://img.aitaotu.cc:8089/Pics/2020/0312/39/01.jpg','ssss.jpg')
以上代码补充了user-agent,但是还是出现同样的情况,点击图片网址打开,开发者模式检查
请求头因此继续补充请求头,注意请求头是[(,),(,)]的形式
from urllib import request
opener = request.build_opener()
opener.addheaders = [('User-Agent', '"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3741.400 QQBrowser/10.5.3863.400'), ('Referer','https://img.aitaotu.cc:8089/Pics/2020/0312/39/01.jpg') ]
request.install_opener(opener)
request.urlretrieve('https://img.aitaotu.cc:8089/Pics/2020/0312/39/01.jpg','ssss.jpg')
这样既可实现下载图片
再把requests请求头Mark一下
# headers ={
# 'referer':'https://img.aitaotu.cc:8089/Pics/2020/0312/39/01.jpg',
# 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3741.400 QQBrowser/10.5.3863.400'
# }
使用{ ‘ ’:,‘ ’: }形式,并且不用建立opener
对了,在urllib中也有一种请求方式,它不需要建立opener,建立请求头的方式与上面Requests相似
即urllib.request.Request(url,headers=headers)
并且headers也是 { ‘ ’:,‘ ’: }形式,但是request.Request不是直接发送请求的,而是要用urllib.request.urlopen打开
import urllib.request
headers ={
" ": , " ":
}
req = urllib.request.Request(url,headers=headers)
resp =request.urlopen(req)