2017-07-17 23 views
1

我正在嘗試使用httplib檢查30k +網站列表中的每個網址是否仍然有效。每個URL都從一個.csv文件讀入一個矩陣,然後該矩陣通過文件中每個url的for循環。之後,(我的問題在哪裏),我運行一個函數runInternet(url),它接受url字符串,如果url有效,則返回true;否則返回false。 我已經使用this作爲我的基準,並且還查看了this。雖然我都試過,我不太瞭解後者,既不工作... ...爲什麼HTTPConnection不起作用?非數字端口

def runInternet(url): 
    try: 
     page = httplib.HTTPConnection(url) 
     page.connect() 
    except httplib.HTTPException as e: 
     return False 
    return True 

但是,後來,所有的鏈接都表述爲碎了!我隨機選擇了一些有用的工具,當我將它們輸入到瀏覽器中時它們會工作......那麼發生了什麼?我已經縮小了問題點到這一行: page = httplib.HTTPConnection(url)

編輯:我試着輸入'www.google.com'換取網址,程序工作,當我嘗試打印e,它表示非數字端口...

+0

不要使用低(ISH)級HTTP類似'httplib'接口 - 它不會處理很多事情對你來說,包括修飾符,重定向,cookie ...至少使用'urllib/urllib2',或者甚至更好地使用'requests'模塊。如果你仍然堅持,至少要提供一個數據樣本,你是如何調用你的函數的,理論上它應該適用於簡單直接的URL。 – zwer

+0

我最初嘗試使用urllib2,但它最終速度太慢了,在它達到了〜2100分之後撞到了我。但是我會研究一下請求,看看它是否更好。 – JPLim

回答

0

您可以通過允許HTTPException傳播而不是捕獲它來解決此問題。特定的異常類型可能有助於理解錯誤。

我懷疑,雖然這個問題是這一行:

page = httplib.HTTPConnection(url) 

的第一個參數的構造不是一個URL。相反,它是一個主機名。例如,通過一個URL來構造此代碼示例失敗:

page = httplib.HTTPConnection('https://www.google.com/') 
page.connect() 

httplib.InvalidURL: nonnumeric port: '//www.google.com/' 

相反,如果我通過主機名的構造函數,然後URL到request方法,那麼它的工作原理:

conn = httplib.HTTPConnection('www.google.com') 
conn.request('GET', '/') 
resp = conn.getresponse() 
print resp.status, resp.reason 

200 OK 

僅供參考,這裏是HTTPConnection相關刪節文檔:

class HTTPConnection 
| Methods defined here: 
| 
| __init__(self, host, port=None, strict=None, timeout=<object object>, source_address=None) 
... 
| request(self, method, url, body=None, headers={}) 
|  Send a complete request to the server. 
相關問題