python中通过客户端IP拿到所在城市和当地天气信息—附带项目案例
熟悉老一代QQ的小伙伴可能都知道,很早以前的QQ,鼠标滑到头像的位置,你的位置和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数据库来实现
数据库文件下载地址:http://dev.maxmind.com/geoip/geoip2/geolite2/
据说这两种都可以解压出城市的数据库文件,我这里已城市的为例
下载解压后
这就是我们需要的数据库文件
我们把它放到项目中的一个文件夹中,在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': '<![CDATA[<3级]]>', 'type': '雷阵雨'
},
'city': '北京',
'forecast':
[{'date': '11日星期四', 'high': '高温 30℃', 'fengli': '<![CDATA[<3级]]>', 'low': '低温 21℃', 'fengxiang': '东南风', 'type': '多云'},
{'date': '12日星期五', 'high': '高温 32℃', 'fengli': '<![CDATA[<3级]]>', 'low': '低温 22℃', 'fengxiang': '西南风', 'type': '多云'},
{'date': '13日星期六', 'high': '高温 33℃', 'fengli': '<![CDATA[<3级]]>', 'low': '低温 23℃', 'fengxiang': '北风', 'type': '多云'},
{'date': '14日星期天', 'high': '高温 33℃', 'fengli': '<![CDATA[<3级]]>', 'low': '低温 23℃', 'fengxiang': '北风', 'type': '晴'},
{'date': '15日星期一', 'high': '高温 35℃', 'fengli': '<![CDATA[<3级]]>', 'low': '低温 24℃', 'fengxiang': '东南风', 'type': '晴'}
],
'ganmao': '各项气象条件适宜,发生感冒机率较低。但请避免长期处于空调房间中,以防感冒。', 'wendu': ''
},
'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拿到所在城市和当地天气信息—附带项目案例的更多相关文章
- php 获取客户端IP地址经纬度所在城市
1. [代码]获取客户端IP地址经纬度所在城市 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 <?php $getIp=$_SERVER["REMOTE_ADDR ...
- 获取客户端IP地址经纬度所在城市
<?php $getIp=$_SERVER["REMOTE_ADDR"]; echo 'IP:',$getIp; echo '<br/>'; $content = ...
- 在ASP.NET Core中获取客户端IP地址
随着ASP.NET的发展,有不同的方式从请求中访问客户端IP地址.WebForms和MVC Web应用程序只是访问当前HTTP上下文的请求. var ip = HttpContext.Current. ...
- ELK应用之二:Kibana显示Nginx中来访客户端IP地域分布
在Kibana的visualize中显示Nginx访问日志客户端IP地域分布图 官网介绍: https://www.elastic.co/guide/en/beats/packetbeat/curre ...
- PHP:根据IP地址获取所在城市
文件目录: ipLocation -----qqwry ----------QQWry.Dat -----ipCity.class.php ipCity.class.php文件代码: <?php ...
- python获取网站http://www.weather.com.cn 城市 8-15天天气
参考一个前辈的代码,修改了一个案例开始学习beautifulsoup做爬虫获取天气信息,前辈获取的是7日内天气, 我看旁边还有8-15日就模仿修改了下.其实其他都没有变化,只变换了获取标签的部分.但是 ...
- 在ASP.NET Core 2.x中获取客户端IP地址
一.前言 大家也知道服务端请求时我们获取的IP地址是包含在请求头中,因此这也大大便利了IP的获取. 在ASP.NET中,可以通过以下方式获取客户端的IP地址. HttpContext.Current. ...
- 再论 ASP.NET 中获取客户端IP地址
说到IP获取无非是我们常见的以下几种方式,但是具体获取的值具体区别在哪?网上不乏相关文章,说的也是很详细,但是真正使用起来,还有很多不太对的地方.IP在不同系统中,应用相当广泛,常见的日志记录.广告分 ...
- PHP中根据IP地址判断所在城市等信息
本篇文章由:http://xinpure.com/php-based-on-information-such-as-the-ip-address-in-your-city/ 获得IP地址 在 PHP ...
随机推荐
- NetworkX系列教程(10)-算法之一:最短路径问题
小书匠Graph图论 重头戏部分来了,写到这里我感觉得仔细认真点了,可能在NetworkX中,实现某些算法就一句话的事,但是这个算法是做什么的,用在什么地方,原理是怎么样的,不清除,所以,我决定先把图 ...
- 我的公众号 - Old Artist
如果可以,我希望大家关注我的公众号,没有技术,没有华丽的文笔,只有简简单单的语句. 分享一些小的事情,大家好,我是老艺术家. Thanks~
- Shadows 使用说明
1:下载最新版 Windows地址:点击下载 Mac地址:点击下载 2:Windows安装插件(点击下方插件名即可下载) .NET Framework 4.7.2和 Microsoft Visual ...
- 10月清北学堂培训 Day 2
今天是杨溢鑫老师的讲授~ T1 物理题,不多说(其实是我物理不好qwq),注意考虑所有的情况,再就是公式要推对! #include<bits/stdc++.h> using namespa ...
- python2和python3区别
字符编码: py3中默认字符编码是unicode:py2中默认字符编码是 ASCII,如果文件中出现了中文,需要在顶部加入coding声明#coding:utf8 让用户输入:py3中直接使用inpu ...
- linux环境下完成jenkins的环境搭建
环境搭建部署: 请完成jenkins的环境搭建,需安装tomcat,mysql. Jenkins 地址: https://jenkins.io/download/ 步骤分析: 1.全部操作使用普通用 ...
- kafka 45个题目介绍
>1.Kafka面试问答 Apache Kafka的受欢迎程度很高,Kafka拥有充足的就业机会和职业前景.此外,在这个时代拥有kafka知识是一条快速增长的道路.所以,在这篇文章中,我们收集了 ...
- Java知识体系思维导图
Java知识体系,为方便预览,将思维导图上传至印象笔记,博客园直接上传图片受限于图片大小,暂时接触这么多,待以后丰富 https://app.yinxiang.com/shard/s24/nl/272 ...
- Thingsboard学习之二安装Docker和Docker-Compose
安装系统更新系统,参考<Thingsboard学习之一CentOS安装系统更新> 尝试更新系统 yum update 增加一个用户并设置密码,并将用户增加到管理员 # 添加用户(可选) s ...
- (三)OpenCV-Python学习—图像平滑
由于种种原因,图像中难免会存在噪声,需要对其去除.噪声可以理解为灰度值的随机变化,即拍照过程中引入的一些不想要的像素点.噪声可分为椒盐噪声,高斯噪声,加性噪声和乘性噪声等,参见:https://zhu ...