2015-09-10 103 views
1

我試圖呼叫connect()函數parse_ip(),它將通過網頁搜索輸入IP來查找匹配項。對列表THREAT的每個元素調用 Connect函數。 這裏是我的代碼:HTTP連接解析失敗

def connect(url): 
    sessions = requests.Session() 
    print "Connecting with", url 
    try: 
     r = sessions.get(url, 
         headers = create_basic_headers(), 
         proxies = {'http': HTTP_PROXY, 'https': HTTPS_PROXY}) 
     return r 
    except: 
     sys.stdout.write('[!] Could not connect to: %s\n' % url) 

def parse(ip): 
    counter = 0 
    ioc_list = [] 
    for filename, source in THREAT.iteritems(): 
     c = connect(source) 
     for line in c: 
      if line.startswith("/") or line.startswith('\n') or line.startswith("#"): 
       pass 
      else: 
       counter += 1 
       d = 0 
       while d < len(ip): 
        if ip[d] in line: 
         print ip[d], source 

        d +=1 

在運行腳本,解析頁面連接失敗和atlast我收到以下錯誤:

[!] Could not connect to: http://... for line in c: TypeError: 'NoneType' object is not iterable

誰能幫我在盤算什麼錯誤在這。

+2

爲什麼不嘗試抓取並在'connect()'中打印異常? – mhawke

+0

暫時刪除try/except塊來顯示堆棧跟蹤,這比你在那裏有更多的幫助。當你終於弄明白的時候,趕上一個特定的異常並處理它。不要按照您目前的方式捕捉所有異常:這很難調試問題。 –

回答

1

requests無法建立到服務器的連接。引發異常,然後在除外條款中處理。沒有關於例外的信息顯示,所以很難診斷實際的連接問題。

在例外connect()返回None給調用者,然後嘗試遍歷它。這是導致TypeError的原因。

爲什麼不嘗試打印異常?

def connect(url): 
    sessions = requests.Session() 
    print "Connecting with", url 
    try: 
     r = sessions.get(url, 
         headers = create_basic_headers(), 
         proxies = {'http': HTTP_PROXY, 'https': HTTPS_PROXY}) 
     return r 
    except requests.exceptions.ConnectionError as exc: 
     sys.stdout.write('[!] Could not connect to: %s\n' % url) 
     sys.stdout.write('Exception: %s' % exc) 

希望這會告訴你爲什麼連接失敗。

之後,您需要檢查返回值connect()parse()。喜歡的東西:

c = connect(source) 
if c is not None: 
    for line in c: 
     .... 

另外,您可以在connect()重新拋出異常,讓parse()處理。

+0

謝謝阿霍克。捕捉到詳細的異常幫助我發現,由於防火牆設置,連接被拒絕。改變它們有助於工作。謝謝! –

+0

@abhinavsingh:很高興聽到。聽取關於「except:'陳述」的建議。正如你所見,它們使調試變得困難。 – mhawke