Because my website needs to query the source IP address to query its geographical location information. Therefore, I used some things to query geographical location information based on IP addresses, and now I have shared some accumulated things in this area.
First of all, when I first learned Python a few years ago, I have already written a similar blog (but it is not comprehensive enough). For details, see Python to get local IP addresses and locations.
Some APIs for querying the location and operator information based on the IP address are as follows (based on my limited experience ):
1. Taobao API (recommended): http://ip.taobao.com/service/getIpInfo.php? Ip = 110.84.0.129
2. freegeoip.net (recommended): http://freegeoip.net/json/110.84.0.129, which also provides latitude and longitude information (but not necessarily accurate)
3. Sina API: http://int.dpool.sina.com.cn/iplookup/iplookup.php? Format = json & ip = 110.84.0.129
4. Tencent web page query: http://ip.qq.com/cgi-bin/searchip? Searchip1 = 110.84.0.129
5. ip.cn webpage: http://www.ip.cn/index.php? Ip = 110.84.0.129
6. Ip-api.com: http://ip-api.com/json/110.84.0.129 (looks pretty good, it looks like a direct return of Chinese city information, documentation in ip-api.com/docs/api:json)
7. Http://www.locatorhq.com/ip-to-location-api/documentation.php (this need to register to use, haven't used it)
(2nd freegeoip.net website and IP data generation, code in: https://github.com/fiorix/freegeoip)
Why are two of them recommended for Web queries? The two reasons are as follows: first, they provide relatively accurate information, and second, they use automatic page information capture (may use PhantomJS I have previously written) it is also easy to write it into the program as an API.
Based on the IP address to query the geographic location information, I wrote it into a more common Python library (provides the APIs for the preceding four query methods: 1, 2, 4, and 5 ), you can query the region and ISP information based on the IP address. For the specific code, see:
Https://github.com/smilejay/python/blob/master/py2013/iplocation.py
Note that webdriver and PhantomJS are used for parsing ip.cn web pages.
The code is as follows: |
Copy code |
#! /Usr/bin/python #-*-Coding: UTF-8 -*- ''' Created on Oct 20,201 3 @ Summary: geography info about an IP address @ Author: Jay <smile665@gmail.com> http://smilejay.com/ ''' Import json, urllib2 Import re From selenium import webdriver From selenium. webdriver. common. desired_capabilities import DesiredCapabilities Class location_freegeoip (): ''' Build the mapping of the ip address and its location. The geo info is from <freegeoip.net> ''' Def _ init _ (self, ip ): ''' Constructor of location_freegeoip class ''' Self. ip = ip Self. api_format = 'json' Self. api_url = 'http: // freegeoip.net/%s/%s' % (self. api_format, self. ip) Def get_geoinfo (self ): "Get the geo info from the remote API. Return a dict about the location. """ Urlobj = urllib2.urlopen (self. api_url) Data = urlobj. read () Datadict = json. loads (data, encoding = 'utf-8 ') # Print datadict Return datadict Def get_country (self ): Key = 'country _ name' Datadict = self. get_geoinfo () Return datadict [key] Def get_region (self ): Key = 'region _ name' Datadict = self. get_geoinfo () Return datadict [key] Def get_city (self ): Key = 'city' Datadict = self. get_geoinfo () Return datadict [key] Class location_taobao (): ''' Build the mapping of the ip address and its location The geo info is from Taobao E.g. Http://ip.taobao.com/service/getIpInfo.php? Ip = 112.111.184.63 The getIpInfo API from Taobao returns a JSON object. ''' Def _ init _ (self, ip ): Self. ip = ip Self. api_url = 'http: // ip.taobao.com/service/getIpInfo.php? Ip = % s' % self. ip Def get_geoinfo (self ): "Get the geo info from the remote API. Return a dict about the location. """ Urlobj = urllib2.urlopen (self. api_url) Data = urlobj. read () Datadict = json. loads (data, encoding = 'utf-8 ') # Print datadict Return datadict ['data'] Def get_country (self ): Key = u'country' Datadict = self. get_geoinfo () Return datadict [key] Def get_region (self ): Key = 'region' Datadict = self. get_geoinfo () Return datadict [key] Def get_city (self ): Key = 'city' Datadict = self. get_geoinfo () Return datadict [key] Def get_isp (self ): Key = 'isp' Datadict = self. get_geoinfo () Return datadict [key] Class location_qq (): ''' Build the mapping of the ip address and its location. The geo info is from Tencent. Note: the content of the Tencent's API return page is encoded by 'gb2312 '. E.g. Http://ip.qq.com/cgi-bin/searchip? Searchip1 = 112.111.184.64 ''' Def _ init _ (self, ip ): ''' Construction of location_ipdotcn class. ''' Self. ip = ip Self. api_url = 'http: // ip.qq.com/cgi-bin/searchip? Searchip1 = % s' % ip Def get_geoinfo (self ): Urlobj = urllib2.urlopen (self. api_url) Data = urlobj. read (). decode ('gb2312'). encode ('utf8 ') Pattern = re. compile (r'ip address location: <span> (. +) </span> ') M = re. search (pattern, data) If m! = None: Return m. group (1). split ('& nbsp ;') Else: Return None Def get_region (self ): Return self. get_geoinfo () [0] Def get_isp (self ): Return self. get_geoinfo () [1] Class location_ipdotcn (): ''' Build the mapping of the ip address and its location. The geo info is from www.ip.cn Need to use PhantomJS to open the URL to render its JS ''' Def _ init _ (self, ip ): ''' Construction of location_ipdotcn class. ''' Self. ip = ip Self. api_url = 'http: // www.ip.cn/s' % ip Def get_geoinfo (self ): Dcap = dict (DesiredCapabilities. PHANTOMJS) Dcap ["phantomjs. page. settings. userAgent"] = ( "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv: 25.0) Gecko/20100101 Firefox/29.0 ") Driver = webdriver. PhantomJS (executable_path = '/usr/local/bin/phantomjs', desired_capabilities = dcap) Driver. get (self. api_url) Text = driver. find_element_by_xpath ('// div [@ id = "result"]/div/P'). text Res = text. split ('From:') [1]. split ('') Driver. quit () Return res Def get_region (self ): Return self. get_geoinfo () [0] Def get_isp (self ): Return self. get_geoinfo () [1] If _ name _ = '_ main __': Ip = '1970. 84.0.129' # Iploc = location_taobao (ip) # Print iploc. get_geoinfo () # Print iploc. get_country () # Print iploc. get_region () # Print iploc. get_city () # Print iploc. get_isp () # Iploc = location_qq (ip) Iploc = location_ipdotcn (ip) # Iploc. get_geoinfo () Print iploc. get_region () Print iploc. get_isp () |