2015-09-10 3 views
1

Я пытаюсь вызвать функцию connect() внутри parse_ip(), которая будет искать входной IP-адрес через веб-страницу, чтобы найти соответствие. Connect Функция вызывается для каждого элемента списка THREAT. Вот мой код:Ошибка соединения с 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 не удается установить соединение с сервером. Исправлено исключение, которое затем обрабатывается в голом except. Информация об исключении не отображается, поэтому трудно диагностировать фактическую проблему подключения.

После исключения 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

Спасибо Ahawke. обнаружение подробного исключения помогло мне понять, что соединение было отказано из-за настроек брандмауэра. Mpdifying их помогли получить работу. Благодаря! –

+0

@abhinavsingh: приятно слышать. Возьмите совет относительно голых операторов 'except:'. Как вы видели, они затрудняют отладку. – mhawke

Смежные вопросы