0

我需要等效的geoip_isp_by_name。我正在使用Django GeoIP模块。

我搜索了很多,但我找不到该功能。请指教。

4

1 回答 1

3

pygeoip支持使用 GeoIP 数据库进行 ISP 查找。

# Normally found under /usr/share/GeoIP/{GeoIP,GeoIPv6}.dat
gi = pygeoip.GeoIP('/path/to/GeoIPISP.dat')
gi.org_by_name('cnn.com')
'Turner Broadcasting System'

GeoIP 数据库的安装过程取决于您的操作系统和发行版。它通常位于您最喜欢的发行版存储库中,位于geoip-database. 有关更多信息,请查看GeoIP 国家数据库安装说明

可悲的是,我无法让它工作,我的 Ubuntu 12.10 和 Debian 6 安装都出现错误,但我不确定我的 GeoIP 数据库是否损坏或模块损坏。你可能会有更好的运气。

gi.org_by_name("cnn.com")
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/pygeoip/__init__.py", line 548, in org_by_name
    return self.org_by_addr(addr)
  File "/usr/local/lib/python2.7/dist-packages/pygeoip/__init__.py", line 531, in org_by_addr
    raise GeoIPError(message)
GeoIPError: Invalid database type, expected Org, ISP or ASNum

更新:由于 GeoIP 不起作用(请参阅评论),我使用这些跟踪站点进行了一些尝试。得到了一个适用于 IP 和主机名的 hacky 解决方案。可能不应该用作永久解决方案,但它工作得很好。

import html2text
import re
import urllib2

lookup = "thevoid.no" # accepts both hostname and ip

tracer = "http://www.ip-adress.com/ip_tracer/"
pat    = "ISP of this IP \[\?\]:\n\n([a-zA-Z ]+)"
hdr    = {'User-Agent': 'Mozilla/5.0'} # ip-adress.com doesn't accept Python
req    = urllib2.Request(tracer + lookup, headers=hdr)
page   = urllib2.urlopen(req).read()

h = html2text.HTML2Text()
h.ignore_links = True
text = h.handle(page)

try:
    # Hetzner Online AG
    print re.search(pat, text).group(1)
except:
    print "Could not find ISP for", lookup

更新 2:得到了我的问题的答案。有单独的 GeoIP 数据库,可以在这里找到Org 版本,但似乎要花钱。我不确定 Python 中是否有免费的替代品,或者有人共享他们的 API。如果没有,我的 hacky 解决方案可能就是它。

于 2013-04-18T19:56:41.923 回答