日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python 通过ip获取城市_python中通过客户端IP拿到所在城市和当地天气信息—附带项目案例...

發布時間:2025/3/15 python 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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拿到所在城市和当地天气信息—附带项目案例...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。