HTTP 错误 403:禁止使用 urlretrieve
HTTP Error 403: Forbidden with urlretrieve
我正在尝试下载 PDF,但出现以下错误:HTTP 错误 403:禁止访问
我知道服务器出于某种原因阻塞,但我似乎找不到解决方案。
import urllib.request
import urllib.parse
import requests
def download_pdf(url):
full_name = "Test.pdf"
urllib.request.urlretrieve(url, full_name)
try:
url = ('http://papers.xtremepapers.com/CIE/Cambridge%20IGCSE/Mathematics%20(0580)/0580_s03_qp_1.pdf')
print('initialized')
hdr = {}
hdr = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36',
'Content-Length': '136963',
}
print('HDR recieved')
req = urllib.request.Request(url, headers=hdr)
print('Header sent')
resp = urllib.request.urlopen(req)
print('Request sent')
respData = resp.read()
download_pdf(url)
print('Complete')
except Exception as e:
print(str(e))
你似乎已经意识到了这一点;远程服务器显然正在检查用户代理 header 并拒绝来自 Python 的 urllib 的请求。但是 urllib.request.urlretrieve()
不允许您更改 HTTP headers,但是,您可以使用 urllib.request.URLopener.retrieve()
:
import urllib.request
opener = urllib.request.URLopener()
opener.addheader('User-Agent', 'whatever')
filename, headers = opener.retrieve(url, 'Test.pdf')
N.B。您正在使用 Python 3,这些函数现在被视为 "Legacy interface" 的一部分,并且 URLopener
已被弃用。因此,您不应在新代码中使用它们。
撇开上述不谈,你要简单地访问一个 URL 会很麻烦。您的代码导入了 requests
,但您没有使用它 - 但您应该使用它,因为它比 urllib
容易得多。这对我有用:
import requests
url = 'http://papers.xtremepapers.com/CIE/Cambridge%20IGCSE/Mathematics%20(0580)/0580_s03_qp_1.pdf'
r = requests.get(url)
with open('0580_s03_qp_1.pdf', 'wb') as outfile:
outfile.write(r.content)
我正在尝试下载 PDF,但出现以下错误:HTTP 错误 403:禁止访问
我知道服务器出于某种原因阻塞,但我似乎找不到解决方案。
import urllib.request
import urllib.parse
import requests
def download_pdf(url):
full_name = "Test.pdf"
urllib.request.urlretrieve(url, full_name)
try:
url = ('http://papers.xtremepapers.com/CIE/Cambridge%20IGCSE/Mathematics%20(0580)/0580_s03_qp_1.pdf')
print('initialized')
hdr = {}
hdr = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36',
'Content-Length': '136963',
}
print('HDR recieved')
req = urllib.request.Request(url, headers=hdr)
print('Header sent')
resp = urllib.request.urlopen(req)
print('Request sent')
respData = resp.read()
download_pdf(url)
print('Complete')
except Exception as e:
print(str(e))
你似乎已经意识到了这一点;远程服务器显然正在检查用户代理 header 并拒绝来自 Python 的 urllib 的请求。但是 urllib.request.urlretrieve()
不允许您更改 HTTP headers,但是,您可以使用 urllib.request.URLopener.retrieve()
:
import urllib.request
opener = urllib.request.URLopener()
opener.addheader('User-Agent', 'whatever')
filename, headers = opener.retrieve(url, 'Test.pdf')
N.B。您正在使用 Python 3,这些函数现在被视为 "Legacy interface" 的一部分,并且 URLopener
已被弃用。因此,您不应在新代码中使用它们。
撇开上述不谈,你要简单地访问一个 URL 会很麻烦。您的代码导入了 requests
,但您没有使用它 - 但您应该使用它,因为它比 urllib
容易得多。这对我有用:
import requests
url = 'http://papers.xtremepapers.com/CIE/Cambridge%20IGCSE/Mathematics%20(0580)/0580_s03_qp_1.pdf'
r = requests.get(url)
with open('0580_s03_qp_1.pdf', 'wb') as outfile:
outfile.write(r.content)