2017-04-07 47 views
1

的问题与此链接
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

你的答案在你的代码片段中:'HTTP Error 403:Forbidden' –

+0

@ kpa6uk下载器(例如:IDM)如何下载完整的文件? –

回答

1

的区别是:

  1. 您正在使用不同的SSL的信息:你的浏览器有一个内置的一套证书颁发机构。 Python使用操作系统附带的一套。如果你正在访问的网站使用一个知道你的浏览器但python不知道的地方,它们会有所不同&,python会抛出一个异常。
  2. 您正在使用不同的用户代理进行访问。您的浏览器告诉服务器它是Chrome或IE或其他。 Python正在告诉服务器它是python。无论出于何种原因,服务器可能会决定它不喜欢这种情况并返回Forbidden。
  3. 服务器的工作可能比您想象的要困难:虽然看起来请求是针对一个简单的文件,但您确实需要一个资源。它可能(尽管在这种情况下不太可能)所请求的资源会导致服务器和浏览器之间的多重交互 - cookies,javascript等 - 它们在浏览器中成功执行,返回到服务器&它然后传递文件。你的python请求没有这样做。
  4. 你的浏览器(可能)有你的python没有的现有状态。您说您可以使用浏览器访问该文件,但这可能仅仅是因为您访问了网站上的其他资源,或登录了其他任何资源。您的浏览器正在通过服务器识别该信息(可能是cookie的session_id?)。你的python代码没有以前的状态,所以服务器禁止这种状态。

这是哪种情况?你需要调查。你可以得到wget或卷曲工作?调试浏览器的访问权限:正在发送什么头文件,您收到的回复是什么?

+0

谢谢!我认为浏览器缓存了文件的一部分,以便浏览器可以下载不完整的文件,但下载器如何下载整个文件? –

+0

下载器(例如:IDM) –

+0

@ZhouTK,不,浏览器不会以这种方式缓存要下载的部分文件。 IDM实际上只是一个能够理解HTTP,HTTPS,FTP等的多协议程序,并且具有内置重试等功能,具有介于“浏览器”和“简单Python请求”之间的功能。 – pbuck