2017-04-27 55 views
1

我有一個簡單的函數(在python 3中)獲取一個url並嘗試解決它:打印錯誤代碼(如果有)(例如404)或解析其中一個縮短網址到完整的網址。我的網址位於csv文件的一列中,輸出保存在下一列中。問題出現在程序遇到一個URL,服務器花費很長時間來響應 - 程序崩潰。如果服務器耗時過長,是否有一種簡單的方法可以強制urllib打印錯誤代碼。我看着Timeout on a function call,但這看起來有點太複雜,因爲我剛剛開始。有什麼建議麼?當頁面需要太長的響應時間時urllib請求失敗

即(COL A)SHORTURL(COL B)http://deals.ebay.com/500276625

def urlparse(urlColumnElem): 
    try: 
     conn = urllib.request.urlopen(urlColumnElem) 
    except urllib.error.HTTPError as e: 
     return (e.code) 
    except urllib.error.URLError as e: 
     return ('URL_Error') 
    else: 
     redirect=conn.geturl() 
     #check redirect 
     if(redirect == urlColumnElem): 
      #print ("same: ") 
      #print(redirect) 
      return (redirect) 
     else: 
      #print("Not the same url ") 
      return(redirect) 

編輯:如果有人得到http.client.disconnected錯誤(比如我),看到這個問題/答案http.client.RemoteDisconnected error while reading/parsing a list of URL's

回答

1

有無看看docs

urllib.request.urlopen(url, data=None[, timeout]) 

可選的超時參數指定阻塞操作(如連接嘗試)的超時(以秒爲單位)(如果未指定,則將使用全局默認超時設置)。

您可以設置一個現實的timeout(以秒爲單位)的過程:

conn = urllib.request.urlopen(urlColumnElem, timeout=realistic_timeout_in_seconds) 

,爲了您的代碼停止破碎,移動try except塊內的一切:

import socket 

def urlparse(urlColumnElem): 
    try: 
     conn = urllib.request.urlopen(
        urlColumnElem, 
        timeout=realistic_timeout_in_seconds 
       ) 
     redirect=conn.geturl() 
     #check redirect 
     if(redirect == urlColumnElem): 
      #print ("same: ") 
      #print(redirect) 
      return (redirect) 
     else: 
      #print("Not the same url ") 
      return(redirect) 

    except urllib.error.HTTPError as e: 
     return (e.code) 
    except urllib.error.URLError as e: 
     return ('URL_Error') 
    except socket.timeout as e: 
     return ('Connection timeout') 

現在如果發生超時,您將捕獲異常並且程序不會粉碎。

祝你好運:)

+0

這部分工作,但我只是得到一個超時錯誤,程序退出,而不是等待更長的時間。 142 追溯(最近呼叫最後): ... socket.timeout:超時 –

+0

我已更新我的答案,超時引發一個'socket.timeout'異常 –

+0

是的,我得到了兩個結合答案底端。對於任何初學者,還需要導入套接字線才能工作謝謝! –

0

首先,是不是可以用來控制允許urlopen時間超時參數。接下來,urlopen中的超時應該拋出異常,更確切地說是socket.timeout。如果你不希望它中止程序,你只需要抓住它:

def urlparse(urlColumnElem, timeout=5): # allow 5 seconds by default 
    try: 
     conn = urllib.request.urlopen(urlColumnElem, timeout = timeout) 
    except urllib.error.HTTPError as e: 
     return (e.code) 
    except urllib.error.URLError as e: 
     return ('URL_Error') 
    except socket.timeout: 
     return ('Timeout') 
    else: 
     ... 
相關問題