为什么此代码不下载文件,下载程序可以成功下载

时间:2017-04-07 14:21:16

标签: python networking

问题始于此链接
https://i1.pixiv.net/img-zip-ugoira/img/2017/04/05/00/24/41/62259492_ugoira600x600.zip

使用下载程序下载的文件已完成。

enter image description here

我尝试使用python下载文件

from urllib import request
import sys
request.urlretrieve('https://i1.pixiv.net/img-zip-ugoira/img/2017/04/05/00/24/41/62259492_ugoira600x600.zip', '123.zip')


Traceback (most recent call last):
  File "C:/Users/ssshooter/PycharmProjects/first/111.py", line 3, in <module>
    request.urlretrieve('https://i1.pixiv.net/img-zip-ugoira/img/2017/04/05/00/24/41/62259492_ugoira600x600.zip', '123.zip')
  File "C:\Users\ssshooter\AppData\Local\Programs\Python\Python36\lib\urllib\request.py", line 248, in urlretrieve
    with contextlib.closing(urlopen(url, data)) as fp:
  File "C:\Users\ssshooter\AppData\Local\Programs\Python\Python36\lib\urllib\request.py", line 223, in urlopen
    return opener.open(url, data, timeout)
  File "C:\Users\ssshooter\AppData\Local\Programs\Python\Python36\lib\urllib\request.py", line 532, in open
    response = meth(req, response)
  File "C:\Users\ssshooter\AppData\Local\Programs\Python\Python36\lib\urllib\request.py", line 642, in http_response
    'http', request, response, code, msg, hdrs)
  File "C:\Users\ssshooter\AppData\Local\Programs\Python\Python36\lib\urllib\request.py", line 570, in error
    return self._call_chain(*args)
  File "C:\Users\ssshooter\AppData\Local\Programs\Python\Python36\lib\urllib\request.py", line 504, in _call_chain
    result = func(*args)
  File "C:\Users\ssshooter\AppData\Local\Programs\Python\Python36\lib\urllib\request.py", line 650, in http_error_default
    raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 403: Forbidden

它不起作用。

1 个答案:

答案 0 :(得分:1)

区别在于:

  1. 您正在使用不同的SSL信息:您的浏览器具有一组内置的证书颁发机构。 Python使用操作系统附带的一套。它们有所不同如果你正在访问的网站使用了一个知道你的浏览器但python不知道,python将抛出异常。
  2. 您正在使用不同的用户代理进行访问。您的浏览器告诉服务器它的Chrome或IE或其他什么。 Python告诉服务器它是python。无论出于何种原因,服务器可能会认为它并不喜欢并返回Forbidden。
  3. 服务器可能比您想象的更加努力:虽然看起来请求是针对一个简单的文件,但您确实要求资源。可能(虽然在这种情况下不太可能)您正在请求的资源导致服务器和浏览器之间的多次交互 - cookies,javascript等 - 在浏览器中成功执行,返回到服务器&安培;然后它传递文件。您的python请求没有执行任何操作。
  4. 您的浏览器(可能)具有您的python没有的现有状态。您说您可以使用浏览器访问该文件,但它可能只是因为您访问过该网站上的其他资源,或登录等等。您的浏览器正在与服务器识别通信该信息(可能是通过cookie的session_id?)。你的python代码没有先前的状态,因此服务器禁止这样做。
  5. 在这种情况下是哪一个?你需要调查。你能让wget或curl工作吗?调试您的浏览器的访问权限:正在发送什么标题,您收到的回复内容是什么?