简友广场

request.urlretrieve请求图片地址下载失败404

2020-03-12  本文已影响0人  刘年

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)

上一篇下一篇

猜你喜欢

热点阅读