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