Pythonic / эффективный способ проверить организацию публичных IP-адресов - PullRequest
0 голосов
/ 11 февраля 2019

У меня есть DataFrame common_ips, содержащий IP-адреса, как показано ниже.

df

Мне нужно выполнить две основные задачи:

  1. Определить частные и публичные IP-адреса .
  2. Проверка организации на общедоступные IP-адреса .

Вот что я делаю:

import json
import urllib
import re
baseurl = 'http://ipinfo.io/'    # no HTTPS supported (at least: not without a plan)

def isIPpublic(ipaddress):
    return not isIPprivate(ipaddress)

def isIPprivate(ipaddress):
    if ipaddress.startswith("::ffff:"): 
        ipaddress=ipaddress.replace("::ffff:", "")
    # IPv4 Regexp from https://stackoverflow.com/questions/30674845/
    if re.search(r"^(?:10|127|172\.(?:1[6-9]|2[0-9]|3[01])|192\.168)\..*", ipaddress):
        # Yes, so match, so a local or RFC1918 IPv4 address
        return True
    if ipaddress == "::1":
        # Yes, IPv6 localhost
        return True
    return False

def getipInfo(ipaddress):
    url = '%s%s/json' % (baseurl, ipaddress)
    try:
        urlresult = urllib.request.urlopen(url)
        jsonresult = urlresult.read()          # get the JSON
        parsedjson = json.loads(jsonresult)    # put parsed JSON into dictionary
        return parsedjson
    except:
        return None

def checkIP(ipaddress):
    if (isIPpublic(ipaddress)):
        if bool(getipInfo(ipaddress)):
            if 'bogon' in getipInfo(ipaddress).keys():
                return 'Private IP'
            elif bool(getipInfo(ipaddress).get('org')):
                return getipInfo(ipaddress)['org']
            else:
                return 'No organization data'
        else:
            return 'No data available'
    else:
        return 'Private IP'

Иприменяя его к моему common_ips DataFrame с

common_ips['Info'] = common_ips.IP.apply(checkIP)

Но это занимает больше времени, чем я ожидал .А для некоторых IP-адресов , это с неверной информацией .

Например:

wrong ip

, где это должно было быть AS19902 Department of Administrative Services, поскольку я перепроверил его по

check ip

и

organisation ip

Что мне здесь не хватает?И как я могу выполнить эти задачи более питонским способом?

1 Ответ

0 голосов
/ 11 февраля 2019

Одеяло except: в основном всегда ошибка.Вы возвращаете None вместо обработки какого-либо аномального или ошибочного ответа от сервера, и, конечно, остальная часть вашего кода не может быть восстановлена.

В качестве первого шага отладки просто извлеките try / except обработка.Может быть, тогда вы сможете найти способ вернуть более подробный обработчик ошибок для некоторых случаев, из которых вы знаете, как восстанавливаться.

def getipInfo(ipaddress):
    url = '%s%s/json' % (baseurl, ipaddress)
    urlresult = urllib.request.urlopen(url)
    jsonresult = urlresult.read()          # get the JSON
    parsedjson = json.loads(jsonresult)    # put parsed JSON into dictionary
    return parsedjson

Возможно, вызывающий код в checkIP должен иметь try/ except вместо этого и, например, повторите попытку после сна на некоторое время, если сервер показывает, что вы едете слишком быстро.

(При отсутствии токена авторизации похоже, что вы используете бесплатную версиюэтот сервис, который, вероятно, в любом случае не гарантирован. Также, возможно, посмотрите на использование их рекомендуемой библиотеки - я не смотрел на нее более подробно, но я бы предположил, что он, по крайней мере, лучше знает, как вести себя вслучай ошибки на стороне сервера. Это почти наверняка также более Pythonic, по крайней мере в том смысле, что вы не должны заново изобретать вещи, которые уже существуют.)

...