【问题标题】:urllib request gives 404 error but works fine in browserurllib 请求给出 404 错误,但在浏览器中工作正常
【发布时间】:2020-04-29 15:34:04
【问题描述】:

当我尝试这条线时:

import urllib.request

urllib.request.urlretrieve("https://i.redd.it/53tfh959wnv41.jpg", "photo.jpg")

我收到以下错误:

Traceback (most recent call last):
  File "scraper.py", line 26, in <module>
    urllib.request.urlretrieve("https://i.redd.it/53tfh959wnv41.jpg", "photo.jpg")
  File "/usr/lib/python3.6/urllib/request.py", line 248, in urlretrieve 
    with contextlib.closing(urlopen(url, data)) as fp:
  File "/usr/lib/python3.6/urllib/request.py", line 223, in urlopen
    return opener.open(url, data, timeout)
  File "/usr/lib/python3.6/urllib/request.py", line 532, in open
    response = meth(req, response)
  File "/usr/lib/python3.6/urllib/request.py", line 642, in http_response
    'http', request, response, code, msg, hdrs)
  File "/usr/lib/python3.6/urllib/request.py", line 570, in error
    return self._call_chain(*args)
  File "/usr/lib/python3.6/urllib/request.py", line 504, in _call_chain
    result = func(*args)
  File "/usr/lib/python3.6/urllib/request.py", line 650, in http_error_default
    raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 404: Not Found

但是该链接在我的浏览器中可以正常工作吗?为什么它在浏览器中有效,但对请求无效?它适用于同一网站的其他图片。

【问题讨论】:

    标签: python


    【解决方案1】:

    请求返回

    如果您检查您的开发者控制台,它是 404:

    所以你看到的是 imgur 的自定义 404“页面”(这是一个图像)。

    编辑:

    所以urlretrieve 在 404 状态码上失败。如果你想使用请求的内容(即使状态码是 404)你可以这样做:

    try:
        urllib.request.urlretrieve("https://i.redd.it/53tfh959wnv41.jpg", "photo.jpg")
    except Exception as e:
        with open("error_photo.jpg", 'wb') as fp:
            fp.write(e.read())
    

    【讨论】:

    • 为什么请求会返回这个?我可以在浏览器中看到图片吗?
    • 错误图片说明了这一点。图片已删除(网址无效/已删除)。状态码是正确的,但是状态码为 404 的请求可以携带有效载荷 - 在这种特定情况下就是这个图像。
    • 试试这个例如:stackoverflow.com/users/241921231234/nonexistentuser状态码是404,但是你的浏览器显示它
    • 如果可以在浏览器中看到图片,应该也可以保存吧?
    • 如果我在浏览器中尝试链接i.redd.it/53tfh959wnv41.jpg,我可以看到一张图片。那不是404错误信息,为什么?
    【解决方案2】:

    尝试更改用户代理。你可以只添加一个 kwarg:

    req = urllib.request.urlretrieve("https://i.redd.it/53tfh959wnv41.jpg", "photo.jpg", headers={"User-Agent": "put custom user agent here"})
    

    【讨论】:

    猜你喜欢
    • 2014-03-15
    • 1970-01-01
    • 2019-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-23
    • 1970-01-01
    相关资源
    最近更新 更多