How to find location with IP address in Python?

I am developing a project that should store the user's location in my database. I received the public IP address of this user. But I can not get the location of the user. I tried several ways (from StackOverflow), but I did not find a hint. As below

url = urllib.urlopen("http://api.hostip.info/get_html.php?ip=%s&position=true" % ip) data = re.compile('^[^\(]+\(|\)$').sub('', url.read()) print data 

but I get the result as

 Unknown Country?) (XX) City: (Unknown City?) 

differently:

 import urllib response = urllib.urlopen("http://api.hostip.info/get_html.php?ip={}&position=true".format(ip)).read() print(response) 

but the result

 Country: (Unknown Country?) (XX) City: (Unknown City?) Latitude: Longitude: IP: 115.xxx.xxx.xx 

Any help would be appreciated!

+17
python
source share
10 answers

One of the easiest ways to get an IP address, as well as a detailed location, is to use http://ipinfo.io

 import re import json from urllib2 import urlopen url = 'http://ipinfo.io/json' response = urlopen(url) data = json.load(response) IP=data['ip'] org=data['org'] city = data['city'] country=data['country'] region=data['region'] print 'Your IP detail\n ' print 'IP : {4} \nRegion : {1} \nCountry : {2} \nCity : {3} \nOrg : {0}'.format(org,region,country,city,IP) 
+11
source share

Try pygeoip

 ~$ ping stackoverflow.com PING stackoverflow.com (198.252.206.16) 56(84) bytes of data. >>> import pygeoip >>> GEOIP = pygeoip.GeoIP("/absolute_path/GeoIP.dat", pygeoip.MEMORY_CACHE) >>> GEOIP.country_name_by_addr(ip) 'United States' 

GeoIP.data is available here.

+10
source share

Assuming you already got an IP address, you could try using the Python IP2Location library to determine the user's location. Sample code is as follows:

 import os import IP2Location database = IP2Location.IP2Location(os.path.join("data", "IPV4-COUNTRY.BIN")) rec = database.get_all(ip) print(rec.country_short) print(rec.country_long) print(rec.region) print(rec.city) print(rec.isp) print(rec.latitude) print(rec.longitude) print(rec.domain) print(rec.zipcode) print(rec.timezone) print(rec.netspeed) print(rec.idd_code) print(rec.area_code) print(rec.weather_code) print(rec.weather_name) print(rec.mcc) print(rec.mnc) print(rec.mobile_brand) print(rec.elevation) print(rec.usage_type) 

Depending on your requirement, for example, if you want to get the name of the country and region of the user, you can do this:

 import os import IP2Location database = IP2Location.IP2Location(os.path.join("data", "IPV4-COUNTRY.BIN")) rec = database.get_all(ip) user_country = rec.country_long user_region = rec.region 

Learn more about this here: Python IP2Location Library

Github Link: IP2Location Python Github Library

+5
source share

for python-3.x

 def ipInfo(addr=''): from urllib.request import urlopen from json import load if addr == '': url = 'https://ipinfo.io/json' else: url = 'https://ipinfo.io/' + addr + '/json' res = urlopen(url) #response from url(if res==None then check connection) data = load(res) #will load the json response into data for attr in data.keys(): #will print the data line by line print(attr,' '*13+'\t->\t',data[attr]) 
+4
source share

I do the same on my own server. Get the API key from http://ipinfodb.com/register.php and try:

 import requests ipdb = "http://api.ipinfodb.com/v3/ip-city/?key=<your api key>&ip=" ip_address = function_to_get_ip_address() location = " ".join(str(requests.get(ipdb+ip_address).text).split(";")[4:7]) 

The location value will be COUNTRY REGION CITY .

Keep in mind that IP addresses are not exact geolocators. Especially when you access your site from a mobile device, you will see that the location of the IP address should be 100 miles from the user's physical location.

+2
source share

Ultimately, it depends on how you get the IP address of your computers. If you are in a VPN or other private network, just getting a local IP address will not return anything, as you see now. In this case, you should get a public IP address:

 url = 'http://api.hostip.info/get_json.php' info = json.loads(urllib.urlopen(url).read()) ip = info['ip'] 

Here is my complete code to get all the information you are looking for (I used freegeoip.net):

 import urllib import json url = 'http://api.hostip.info/get_json.php' info = json.loads(urllib.urlopen(url).read()) ip = info['ip'] urlFoLaction = "http://www.freegeoip.net/json/{0}".format(ip) locationInfo = json.loads(urllib.urlopen(urlFoLaction).read()) print 'Country: ' + locationInfo['country_name'] print 'City: ' + locationInfo['city'] print '' print 'Latitude: ' + str(locationInfo['latitude']) print 'Longitude: ' + str(locationInfo['longitude']) print 'IP: ' + str(locationInfo['ip']) 
+2
source share

requirements:

 sudo add-apt-repository ppa:maxmind/ppa sudo apt update sudo apt install libmaxminddb0 libmaxminddb-dev mmdb-bin sudo pip install geoip2 

geoip database:

 wget http://geolite.maxmind.com/download/geoip/database/GeoLite2-City.tar.gz tar xvfz GeoLite2-City.tar.gz 

example for nginx access logs:

 python -c 'import geoip2.database reader = geoip2.database.Reader("./GeoLite2-City/GeoLite2-City.mmdb") for line in open("/var/log/nginx/access.log').readlines(): response = reader.city(line.split(" ")[0]) print(dir(response)) ' 

connected with:

+2
source share

You can use the services https://geoip-db.com IPv4 and IPv6 are supported. The callback function of the JSON object or JSONP is returned.

Python 2:

 import urllib import json url = "https://geoip-db.com/json" response = urllib.urlopen(url) data = json.loads(response.read()) print data 

Python 3:

 import urllib.request import json with urllib.request.urlopen("https://geoip-db.com/json") as url: data = json.loads(url.read().decode()) print(data) 

Python 3 jsonp example:

 import urllib.request import json with urllib.request.urlopen("https://geoip-db.com/jsonp/8.8.8.8") as url: data = url.read().decode() data = data.split("(")[1].strip(")") print(data) 
+1
source share

I found that ipinfo offers the best service and provides free use of the API for calls up to 50 thousand per month - see "Speed ​​limits" here :

 import ipinfo access_token = '123456789abc' handler = ipinfo.getHandler(access_token) ip_address = '216.239.36.21' details = handler.getDetails(ip_address) details.city 'Mountain View' details.country 'US' details.loc '37.3861,-122.0840' 
0
source share

https://github.com/airakesh/BeautifulSoupRecipes/blob/master/geoip.py

 # Get Geolocation(Country) and hostname by passing a file having a bunch of IP addresses as the argument from the command line. Example- python GeoIP.py path-to-file-containing-IP addresses: https://github.com/airakesh/BeautifulSoupRecipes/blob/master/sample_ips.txt import re import os import sys import subprocess import socket # Input file argument ips_file = sys.argv[1] # The regular expression for validating an IP-address pattern = '''^(25[0-5]|2[0-4][0-9]|[0-1]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[0-1]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[0-1]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[0-1]?[0-9][0-9]?)''' def getGeoHost(): fp = open(ips_file, 'rb') for line in fp: line = line.strip() addr = line.decode('utf-8') regex = re.compile(pattern) match = regex.match(addr) # Get hostname by IP address try: host = socket.gethostbyaddr(addr) hostname = host[0] # Print Unknown no hostname is available except: hostname = 'Unknown' # Get geolocation by IP address get_geo_cmd = 'geoiplookup ' + addr geo_str = subprocess.check_output(get_geo_cmd, shell=True) geo = geo_str.decode('utf-8') # Match country name pattern geo_pattern = '''^(GeoIP Country Edition: ([AZ]{2})\, (.*))''' geo_regex = re.compile(geo_pattern) country_match = re.match(geo_pattern, geo) # Check country name is available and if not, print 'Unknown' if country_match != '' and geo_pattern: try: country = country_match.group(3) except: country = 'Unknown' # Clubbing together in format 'IP|Country|Hostname' data geo_hostname = addr + ' | ' + country + ' | ' + hostname print geo_hostname if __name__ == "__main__": ips_detail_list = getGeoHost() 
0
source share

All Articles