python 通过ip获取城市_python中通过客户端IP拿到所在城市和当地天气信息—附带项目案例...
首先,需求分析:
1、拿到客戶端IP
2、通過IP拿到客戶端所在地區(qū)
3、通過地區(qū)拿到當(dāng)?shù)靥鞖?/p>
4、整合功能,展示給用戶
第一步,如何拿到用戶IP
我們以Django環(huán)境為例
# 客戶端的請(qǐng)求,IP信息會(huì)在請(qǐng)求頭中
request.META['REMOTE_ADDR']
# 或
request.META.get('HTTP_X_FORWARDED_FOR')
里面
為什么是或呢?
這是因?yàn)橛行┓?wù)器做了代理或者使用nginx等,在REMOTE_ADDR中會(huì)拿到本地回環(huán)地址:127.0.0.1
這時(shí)候真實(shí)的客戶端IP在HTTP_X_FORWARDER_FOR中。
如果你是測試環(huán)境,項(xiàng)目跑在內(nèi)網(wǎng),又想拿到本地公網(wǎng)IP做測試,那怎么做呢?誒,這里也有辦法
import re,requests
url = 'http://txt.go.sohu.com/ip/soip'
response = requests.get(url)
text = response.text
ip = re.findall(r'\d+.\d+.\d+.\d+', text)[0]
print("默認(rèn)訪客ip:%s"%ip)
通過requests模塊和re模塊向這個(gè)網(wǎng)址發(fā)送請(qǐng)求和解析匹配,你就可以拿到你的公網(wǎng)IP
第二步、找到對(duì)應(yīng)城市
好了,IP解決了,那么接下來就是通過IP解析所在城市
python中有一個(gè)第三方庫,專門來干這件事請(qǐng),解析國家、城市、地區(qū)等等
它就是 geoip2 模塊,它依賴服務(wù)供應(yīng)商的數(shù)據(jù)庫文件,這里我用city數(shù)據(jù)庫來實(shí)現(xiàn)
據(jù)說這兩種都可以解壓出城市的數(shù)據(jù)庫文件,我這里已城市的為例
下載解壓后
這就是我們需要的數(shù)據(jù)庫文件
我們把它放到項(xiàng)目中的一個(gè)文件夾中,在settings中配置好它的路徑,這樣我們就可使用它了
使用也是十分簡單
read = geoip2.database.Reader(settings.CITY_DB) # mmdb文件路徑,提前在settings文件中配置好
c = read.city(ip) # 放入需要檢測的IP
target_city = c.city.names.get("ja")
這樣我們就拿到IP對(duì)應(yīng)的城市信息了 target_city
有興趣你可以打印下c、c.city、c.city.name 各自是什么東西
在這里由于這是人家給你免費(fèi)用的版本,比起商業(yè)付費(fèi)版本,在精確度和覆蓋面上會(huì)有差別,不過平常用用足夠了
第三步、爬取當(dāng)?shù)靥鞖庑畔?/p>
用于爬取天氣信息的網(wǎng)站比較多,百度一下都可以找到
現(xiàn)在我們以其中一個(gè)為例:
path = 'http://wthrcdn.etouch.cn/weather_mini?city=上海'
response = requests.get(path) # 對(duì)該地址和參數(shù)進(jìn)行g(shù)et請(qǐng)求
result = response.json() # 將返回的結(jié)果轉(zhuǎn)成json串
我們拿到的result是一個(gè)大字典,如下:
a ={
'data':
{
'yesterday':
{
'date': '10日星期三', 'high': '高溫 28℃', 'fx': '東風(fēng)', 'low': '低溫 19℃', 'fl': '', 'type': '雷陣雨'
},
'city': '北京',
'forecast':
[{'date': '11日星期四', 'high': '高溫 30℃', 'fengli': '', 'low': '低溫 21℃', 'fengxiang': '東南風(fēng)', 'type': '多云'},
{'date': '12日星期五', 'high': '高溫 32℃', 'fengli': '', 'low': '低溫 22℃', 'fengxiang': '西南風(fēng)', 'type': '多云'},
{'date': '13日星期六', 'high': '高溫 33℃', 'fengli': '', 'low': '低溫 23℃', 'fengxiang': '北風(fēng)', 'type': '多云'},
{'date': '14日星期天', 'high': '高溫 33℃', 'fengli': '', 'low': '低溫 23℃', 'fengxiang': '北風(fēng)', 'type': '晴'},
{'date': '15日星期一', 'high': '高溫 35℃', 'fengli': '', 'low': '低溫 24℃', 'fengxiang': '東南風(fēng)', 'type': '晴'}
],
'ganmao': '各項(xiàng)氣象條件適宜,發(fā)生感冒機(jī)率較低。但請(qǐng)避免長期處于空調(diào)房間中,以防感冒。', 'wendu': '29'
},
'status': 1000,
'desc': 'OK'
}
這么一看是不是非常爽呢,這不就是字典呢,你想干嘛干嘛了
第四步、渲染到項(xiàng)目中
這里以我寫的一個(gè)小項(xiàng)目為例
# 第一步拿到客戶端IP
if request.META['REMOTE_ADDR'] != '127.0.0.1': # if拿到IP
ip = request.META['REMOTE_ADDR']
print("REMOTE_ADDR 訪客ip:%s" % ip)
elif request.META.get('HTTP_X_FORWARDED_FOR'):
ip = request.META['HTTP_X_FORWARDED_FOR']
print("HTTP_X_FORWARDED_FOR訪客ip:%s" % ip)
else: #如果沒有符合的IP,默認(rèn)本地
path = 'http://txt.go.sohu.com/ip/soip'
response = requests.get(path)
text = response.text
ip = re.findall(r'\d+.\d+.\d+.\d+', text)[0]
print("默認(rèn)訪客ip:%s"%ip)
# 第二步、拿到IP對(duì)應(yīng)城市
read = geoip2.database.Reader(settings.CITY_DB) # mmdb文件路徑
c = read.city(ip)
target_city = c.city.names.get("ja") # 拿到城市,可能存在匹配不到
if not target_city:
target_city = '上海'
# 第三步、爬取當(dāng)?shù)靥鞖?/p>
path = 'http://wthrcdn.etouch.cn/weather_mini?city=%s' % target_city
# url = path % location
response = requests.get(path) # 對(duì)該地址和參數(shù)進(jìn)行g(shù)et請(qǐng)求
result = response.json() # 將返回的結(jié)果轉(zhuǎn)成json串
if result.get("status") != 1000:
wea = ''
else:
wea = result.get('data').get("forecast")[0].get("type")
# ganmao = result.get("ganmao")
print(target_city,wea)
前端展示:
好了,這篇就到這里了,更多好玩的功能,歡迎留言~
總結(jié)
以上是生活随笔為你收集整理的python 通过ip获取城市_python中通过客户端IP拿到所在城市和当地天气信息—附带项目案例...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php html转成数组,PHP_php
- 下一篇: Git 的工作区、暂存区、版本库—— G