2017-04-07 44 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