Как получить информацию WhoIs по IP в Python 3?

Примечание. Это не рекомендательный вопрос о библиотеке. Речь скорее о возможных подходах к проблеме.

Вопрос. Какие подходы возможны для получения информации WhoIs с заданного IP-адреса в Python 3? Результат должен содержать как минимум:

  • Страна регистрации
  • Имя интернет-провайдера, адрес, адрес электронной почты для злоупотреблений
  • Если зарегистрирован, доменное имя
  • Сроки регистрации и истечения срока действия
  • Бонусные баллы, если результат не является простым текстом и приведенная выше информация структурирована.

Я не ищу обертки вокруг команды whois оболочки, так как программа должна работать под Windows.

Прежде чем задать этот вопрос, google дал мне следующие библиотеки:

При установке через pip или при импорте вылетают следующие ошибки:

  • BulkWhois
  • WhoisClient
  • cymruwhois
  • dwhois
  • ipwhois
  • pyiptools
  • python-whois
  • pywhois
  • uwhoisd
  • whois
  • whoislookup
  • whoispy

Следующие библиотеки работают в Python 3, однако они делают обратное тому, что я хочу — они ищут по доменному имени, а не по IP-адресу:

  • nicnames
  • pythonwhois

Прежде чем задать вопрос, я изучил следующие вопросы:


person Babken Vardanyan    schedule 04.07.2014    source источник
comment
Эм. Да это так. Я не понимаю, что вы здесь просите, если не библиотеку или сервис. Погуглив на мгновение, нашел несколько сервисов RESTy/JSONy.   -  person Michael Petrotta    schedule 05.07.2014
comment
Итак, вы в основном хотите воспроизвести то, что делает команда whois? исходный код не слишком длинный, поэтому вы можете начать с него: whois.c. Вот пример на Python: ссылка   -  person user3557327    schedule 05.07.2014
comment
@user3557327 user3557327 Ну, для этого файла C требуется Unix/другое? заголовки. Добавьте сложность импорта функций C в python.   -  person Babken Vardanyan    schedule 05.07.2014
comment
@MichaelPetrotta Позвольте мне посмотреть, что это за услуги.   -  person Babken Vardanyan    schedule 05.07.2014
comment
вы можете использовать socket.gethostbyaddr и передать его whois.whois   -  person Padraic Cunningham    schedule 05.07.2014
comment
@PadraicCunningham Модуль whois выдает эту ошибку при импорте в Python 3: ...ImportError: cannot import name 'WhoisEntry'   -  person Babken Vardanyan    schedule 05.07.2014
comment
@MichaelPetrotta Точно! Вот о чем вопрос - (другой) подход, который вы описали, заключается в ручном анализе ответа от онлайн-сервиса. Теперь, если вы напишете здесь свою команду в качестве ответа и предложите какой-нибудь бесплатный сервис JSON/REST, я приму ваш ответ. (Я просмотрел первые 10 результатов поиска Google для whois json, и все они либо платные, либо поиск только по доменному имени)   -  person Babken Vardanyan    schedule 05.07.2014
comment
uwhoisd в настоящее время не поддерживает поиск IP, хотя я хотел бы добавить это. Какие ошибки были у вас при установке? В настоящее время документация не такая, какой могла бы быть, хотя я надеюсь исправить это в ближайшее время.   -  person Keith Gaughan    schedule 03.05.2016
comment
@KeithGaughan pastie.org/10823660   -  person Babken Vardanyan    schedule 04.05.2016
comment
@BabkenVardanyan Спасибо! Я вижу проблему. К сожалению, Diesel застрял на Python 2 и использует неквалифицированный относительный импорт. Я надеюсь вскоре избавиться от Diesel и заменить его чем-то, что работает на Python 2 и Python 3.   -  person Keith Gaughan    schedule 04.05.2016


Ответы (2)


Установите стабильную версию dnspython с здесь

Затем pip3 install ipwhois.

In [37]: from ipwhois import IPWhois

In [38]: obj = IPWhois('74.125.225.229')

In [39]: res=obj.lookup()

In [40]: res["nets"][0]['country']
Out[40]: 'US'

In [41]: res["nets"][0]['abuse_emails']
Out[41]: '[email protected]'

In [42]: from pprint import pprint

In [43]: pprint(res)
{'asn': '15169',
 'asn_cidr': '74.125.225.0/24',
 'asn_country_code': 'US',
 'asn_date': '2007-03-13',
 'asn_registry': 'arin',
 'nets': [{'abuse_emails': '[email protected]',
           'address': '1600 Amphitheatre Parkway',
           'cidr': '74.125.0.0/16',
           'city': 'Mountain View',
           'country': 'US',
           'created': '2007-03-13T00:00:00',
           'description': 'Google Inc.',
           'misc_emails': None,
           'name': 'GOOGLE',
           'postal_code': '94043',
           'state': 'CA',
           'tech_emails': '[email protected]',
           'updated': '2012-02-24T00:00:00'}],
 'query': '74.125.225.229',
 'raw': None}

HTTP:

In [44]: res=obj.lookup_rws()

In [45]: pprint(res)
{'asn': '15169',
 'asn_cidr': '74.125.225.0/24',
 'asn_country_code': 'US',
 'asn_date': '2007-03-13',
 'asn_registry': 'arin',
 'nets': [{'abuse_emails': '[email protected]',
           'address': '1600 Amphitheatre Parkway',
           'cidr': '74.125.0.0/16',
           'city': 'Mountain View',
           'country': 'US',
           'created': '2007-03-13T12:09:54-04:00',
           'description': 'Google Inc.',
           'misc_emails': None,
           'name': 'GOOGLE',
           'postal_code': '94043',
           'state': 'CA',
           'tech_emails': '[email protected]',
           'updated': '2012-02-24T09:44:34-05:00'}],
 'query': '74.125.225.229',
 'raw': None}

Изменился API для устаревшего ipwhois IPWhois .lookup() устарела с версии 0.12.0 и будет удалена. Устаревшие поисковые запросы whois были перемещены в IPWhois.lookup_whois()..

Вы можете получить доступ к этому методу, я отключил предупреждения, чтобы увидеть вывод, есть устаревшие предупреждения, которые следует учитывать в реальных случаях использования:

In [30]: from warnings import filterwarnings

In [31]: filterwarnings( action="ignore")

In [32]: from ipwhois import IPWhois

In [33]: obj = IPWhois('74.125.225.229')

In [34]: obj.lookup_whois()
Out[34]: 
{'asn': '15169',
 'asn_cidr': '74.125.225.0/24',
 'asn_country_code': 'US',
 'asn_date': '2007-03-13',
 'asn_description': 'GOOGLE - Google Inc., US',
 'asn_registry': 'arin',
 'nets': [{'address': '1600 Amphitheatre Parkway',
   'cidr': '74.125.0.0/16',
   'city': 'Mountain View',
   'country': 'US',
   'created': '2007-03-13',
   'description': 'Google Inc.',
   'emails': ['[email protected]', '[email protected]'],
   'handle': 'NET-74-125-0-0-1',
   'name': 'GOOGLE',
   'postal_code': '94043',
   'range': '74.125.0.0 - 74.125.255.255',
   'state': 'CA',
   'updated': '2012-02-24'}],
 'nir': None,
 'query': '74.125.225.229',
 'raw': None,
 'raw_referral': None,
 'referral': None}

Согласно документации, IPWhois.lookup_rdap() теперь является рекомендуемым методом поиска. RDAP обеспечивает гораздо лучшую структуру данных, чем устаревшие методы поиска whois и REST (предыдущая реализация). Запросы RDAP позволяют анализировать контактную информацию и сведения о пользователях, организациях и группах. RDAP также предоставляет более подробную информацию о сети.

Но следуя примеру использования дословно или добавляя asn_methods=["whois"]), кадры выдает предупреждения об устаревании, поэтому, опять же, это то, что необходимо учитывать в реальных случаях использования.

In [31]: from ipwhois import IPWhois

In [32]: obj = IPWhois('74.125.225.229')
/usr/local/lib/python3.6/site-packages/ipwhois/net.py:138: UserWarning: allow_permutations has been deprecated and will be removed. It is no longer needed, due to the deprecation of asn_alts, and the addition of the asn_methods argument.
  warn('allow_permutations has been deprecated and will be removed. '

In [33]:  obj.lookup_rdap(asn_methods=["whois"])
/usr/local/lib/python3.6/site-packages/ipwhois/asn.py:302: UserWarning: IPASN._parse_fields_whois() has been deprecated and will be removed. You should now use IPASN.parse_fields_whois().
  warn('IPASN._parse_fields_whois() has been deprecated and will be '
Out[33]: 
{'asn': '15169',
 'asn_cidr': '74.125.225.0/24',
 'asn_country_code': 'US',
 'asn_date': '2007-03-13',
 'asn_description': 'GOOGLE - Google Inc., US',
 'asn_registry': 'arin',
 'entities': ['GOGL'],
 'network': {'cidr': '74.125.0.0/16',
  'country': None,
  'end_address': '74.125.255.255',
  'events': [{'action': 'last changed',
    'actor': None,
    'timestamp': '2012-02-24T09:44:34-05:00'},
   {'action': 'registration',
    'actor': None,
    'timestamp': '2007-03-13T12:09:54-04:00'}],
  'handle': 'NET-74-125-0-0-1',
  'ip_version': 'v4',
  'links': ['https://rdap.arin.net/registry/ip/074.125.000.000',
   'https://whois.arin.net/rest/net/NET-74-125-0-0-1'],
  'name': 'GOOGLE',
  'notices': [{'description': 'By using the ARIN RDAP/Whois service, you are agreeing to the RDAP/Whois Terms of Use',
    'links': ['https://www.arin.net/whois_tou.html'],
    'title': 'Terms of Service'}],
  'parent_handle': 'NET-74-0-0-0-0',
  'raw': None,
  'remarks': None,
  'start_address': '74.125.0.0',
  'status': None,
  'type': None},
 'nir': None,
 'objects': {'GOGL': {'contact': {'address': [{'type': None,
      'value': '1600 Amphitheatre Parkway\nMountain View\nCA\n94043\nUNITED STATES'}],
    'email': None,
    'kind': 'org',
    'name': 'Google Inc.',
    'phone': None,
    'role': None,
    'title': None},
   'entities': ['ABUSE5250-ARIN', 'ZG39-ARIN'],
   'events': [{'action': 'last changed',
     'actor': None,
     'timestamp': '2017-01-28T08:32:29-05:00'},
    {'action': 'registration',
     'actor': None,
     'timestamp': '2000-03-30T00:00:00-05:00'}],
   'events_actor': None,
   'handle': 'GOGL',
   'links': ['https://rdap.arin.net/registry/entity/GOGL',
    'https://whois.arin.net/rest/org/GOGL'],
   'notices': None,
   'raw': None,
   'remarks': None,
   'roles': ['registrant'],
   'status': None}},
 'query': '74.125.225.229',
 'raw': None}
person Padraic Cunningham    schedule 05.07.2014
comment
Я могу просто pip3 install dnspython3 кстати :) - person Babken Vardanyan; 05.07.2014
comment
AttributeError: 'IPWhois' object has no attribute 'lookup'. Вместо этого используйте ipwhois_obj.lookup_whois() или ipwhois_obj.lookup_rdap() - person gies0r; 06.09.2017
comment
@ gies0r, вы можете использовать lookup_whois(), поиск некоторое время назад устарел и был удален в более поздних версиях, даже с использованием последних примеров все еще есть предупреждения, поэтому, возможно, стоит открыть проблему на github. - person Padraic Cunningham; 06.09.2017

Альтернативное простое решение, которое теперь работает с Python 3:

Сначала импортируйте следующий пакет:

pip install python-whois

Затем выполните код:

import whois
w = whois.whois('74.125.225.229')
person Rene B.    schedule 30.07.2020
comment
я получаю AttributeError: module 'whois' has no attribute 'whois' - person 400 the Cat; 29.04.2021