【发布时间】:2019-05-17 20:36:10
【问题描述】:
我有一个大的 json 文件 (2.5GB),其中包含一些文件的下载链接。我写了一个python脚本来下载所有这些文件:
with open("arxiv_2010_to_2016.json") as f:
X = json.load(f)
for article_id in X:
link = X[article_id]["link"] + ".pdf"
wget.download(link, out="docs")
json 文件中有数千个这样的文档引用。成功下载1204个文档后,脚本崩溃了HTTPError:
文件“/home/imane/anaconda3/lib/python3.6/site-packages/wget.py”,行 526,正在下载 (tmpfile, headers) = ulib.urlretrieve(binurl, tmpfile, callback) 文件 "/home/imane/anaconda3/lib/python3.6/urllib/request.py", 行 248,在 urlretrieve 中 使用 contextlib.closing(urlopen(url, data)) 作为 fp:文件“/home/imane/anaconda3/lib/python3.6/urllib/request.py”,第 223 行,在 网址打开 返回 opener.open(url, data, timeout) 文件“/home/imane/anaconda3/lib/python3.6/urllib/request.py”,第 532 行,在 打开 response = meth(req, response) 文件“/home/imane/anaconda3/lib/python3.6/urllib/request.py”,第 642 行,在 http_response 'http'、请求、响应、代码、味精、hdrs)文件“/home/imane/anaconda3/lib/python3.6/urllib/request.py”,第 564 行,在 错误 结果 = self._call_chain(*args) 文件“/home/imane/anaconda3/lib/python3.6/urllib/request.py”,第 504 行,在 _call_chain 结果 = func(*args) 文件“/home/imane/anaconda3/lib/python3.6/urllib/request.py”,第 756 行,在 http_error_302 return self.parent.open(new, timeout=req.timeout) 文件“/home/imane/anaconda3/lib/python3.6/urllib/request.py”,第 532 行,在 打开 response = meth(req, response) 文件“/home/imane/anaconda3/lib/python3.6/urllib/request.py”,第 642 行,在 http_response 'http'、请求、响应、代码、msg、hdrs)文件“/home/imane/anaconda3/lib/python3.6/urllib/request.py”,第 570 行,在 错误 返回 self._call_chain(*args) 文件“/home/imane/anaconda3/lib/python3.6/urllib/request.py”,第 504 行,在 _call_chain 结果 = func(*args) 文件“/home/imane/anaconda3/lib/python3.6/urllib/request.py”,第 650 行,在 http_error_default raise HTTPError(req.full_url, code, msg, hdrs, fp) urllib.error.HTTPError: HTTP Error 403: Forbidden
如何在不崩溃的情况下运行脚本并下载所有文档? 我正在运行 Fedora 28、python 3.6.6、wget 3.2
【问题讨论】:
-
似乎是服务器错误,服务器正在禁止请求。也许每个 IP 可以下载的文件数量有限制。或者您无法下载该文件,因为它受到保护。您可以尝试捕获异常并继续处理其他异常。如果在此之后所有文件都失败了,您知道有一个限制,您需要联系他们或使用 VPN 每 x 个文件更改您的 IP。
-
好吧,http请求可能会引发异常..你需要抑制它
标签: python-3.x wget urllib http-error