Python每日一谈|No.22.实例.3-Life.1-每日一句名人名言+天气预报

2021-03-22 14:52:03 浏览数 (1)

简介

今天我们来写一个每日一句

可能会有点难

就当作提前预热

也当作放松一下

也当作综合以前的内容

先看效果

代码语言:javascript复制
??⭐???
python every day
 生活的道路一旦选定,就要勇敢地走到底,决不回头。
————————————
?|日期:2021-03-20
?|坐标:北京
?|天气:晴
?|温度:低温 2℃~高温 15℃
?|风力:3级

分析

先来简单分析下

1.emoji

web: https://www.emojiall.com/zh-hans

简介:绘文字(日语:絵文字/えもじemoji)是日本在无线通信中所使用的视觉情感符号,绘指图画,文字指的则是字符,可用来代表多种表情,如笑脸表示笑、蛋糕表示食物等。在NTTDoCoMo的i-mode系统电话系统中,绘文字的尺寸是12x12像素,在传送时,一个图形有2个字节。Unicode编码为E63E到E757,而在Shift-JIS编码则是从F89F到F9FC。基本的绘文字共有176个符号,在C-HTML4.0的编程语言中,则另增添了76个情感符号。最早由栗田穰崇(Shigetaka Kurita)创作,并在日本网络及手机用户中流行。自苹果公司发布的iOS 5输入法中加入了emoji后,这种表情符号开始席卷全球,目前emoji已被大多数现代计算机系统所兼容的Unicode编码采纳,普遍应用于各种手机短信和社交网络中。

来源于--知乎

然后,使用一个python包来调用

web:https://pypi.org/project/emoji/

安装:pip install emoji

先看一下关键字和表情的对应表:https://www.webfx.com/tools/emoji-cheat-sheet/

使用:

代码语言:javascript复制
In [29]:import emoji
In [30]: print(emoji.emojize(':smile:',use_aliases=True))
?

2.python every day

欢迎关注我的微信公众号(FindKey),知乎(ZeroDesigner),b站(ZeroDesigner)什么的,没了,这就是一个字符串

3.名人名言

我们先来找碗鸡汤

地址:

代码语言:javascript复制
https://gitee.com/luskyqi/python-every-day/tree/master/Python每日一谈|No.22.实例.3-Life-每天一句名人名言 天气预报/soup-master

我这里准备了一份,在当前目录下,为tsv格式,分割符为table键,名称为名人名言.tsv

先来看下

代码语言:javascript复制
名言           出处
君子赠人以言,庶人赠人以财。荀况
使意志获得自由的唯一途径,就是让意志摆脱任性。黑尔
如烟往事俱忘却,心底无私天地宽。陶铸
执着追求并从中得到最大快乐的人,才是成功者。梭罗
有百折不挠的信念的所支持的人的意志,比那些似乎是无敌的物质力量有更强大的威力。爱因斯坦
生活在我们这个世界里,不读书就完全不可能了解人。高尔基
一个人即使已登上顶峰,也仍要自强不息。罗素·贝克
对具有高度自觉与深邃透彻的心灵的人来说,痛苦与烦恼是他必备的气质。陀思妥耶夫斯基
先相信你自己,然后别人才会相信你。屠格涅夫
上天赋予的生命,就是要为人类的繁荣和平和幸福而奉献。松下幸之助

安装pandas:

代码语言:javascript复制
 pip install pandas

使用:

代码语言:javascript复制
 In [5]: import pandas as pd
   ...: data = pd.read_csv('./soup-master/名人名言.tsv',sep='t')

In [6]: data
Out[6]:
                                         名言          出处
0                            君子赠人以言,庶人赠人以财。荀况
1                   使意志获得自由的唯一途径,就是让意志摆脱任性。黑尔
2                          如烟往事俱忘却,心底无私天地宽。陶铸
3                    执着追求并从中得到最大快乐的人,才是成功者。梭罗
4   有百折不挠的信念的所支持的人的意志,比那些似乎是无敌的物质力量有更强大的威力。爱因斯坦
..                                      ...         ...
95                           节制使快乐增加并使享受加强。德谟克利特
96               书不仅是生活,而且是现在、过去和未来文化生活的源泉。库法耶夫
97                          奢侈是舒适的,否则就不是奢侈。CocoChanel
98                       命运压不垮一个人,只会使人坚强起来。伯尔
99                            沉沉的黑夜都是白天的前奏。郭小川

[100 rows x 2 columns]

4.获取日期

使用python自带的datatime模块

例如:

代码语言:javascript复制
In [39]: # 导入
    ...: import datetime
    ...: # 获取当前时间,并且格式化为年-月-日形式
    ...: t = datetime.datetime.now().strftime('%Y-%m-%d')
    ...: print(t)
2021-03-20

5.获取地址,定位到城市

a. 首先查询本机ip地址

代码语言:javascript复制
 In [100]: #导入python自带的包
     ...: import requests
     ...: url = 'http://txt.go.sohu.com/ip/soip'
     ...: web = requests.get(url)
     ...: web.text
Out[100]: 'String.prototype.getQueryString=function(v){var reg=new RegExp("(^|&|\\?)"   v   "=([^&]*)(&|$)"), r;if(r=this.match(reg)){return unescape(r[2]);}return null;};var sohu_IP_Loc="unknown",LocUrl=document.location.href;if((LocUrl.indexOf("sohusce.com") >= 0)||(LocUrl.indexOf("sohu.com") >= 0)||(LocUrl.indexOf("chinaren.com") >= 0)||(LocUrl.indexOf("17173.com") >= 0)||(LocUrl.indexOf("focus.cn") >= 0)){window.sohu_user_ip="111.201.148.162";sohu_IP_Loc="CN110000";sohu_IP_Loc_V="CN110000";}var AdLoc2=sohu_IP_Loc.substr(0,2),AdLoc4=sohu_IP_Loc.substr(0,4),AdLoc6=sohu_IP_Loc.substr(0,6);if(window.location.href.getQueryString("ip"))sohu_IP_Loc=AdLoc2=AdLoc4=AdLoc6=window.location.href.getQueryString("ip");'
# 可以看到ip地址为111.201.148.162
#先分割,取1号,再分割,取0,当然,你喜欢用正则,我也不拦着
In [103]: web.text.split('{window.sohu_user_ip="')[1].split('";sohu_IP_Loc=')[0]
Out[103]: '111.201.148.162'

b. 根据ip地址获取城市信息

一般分为两种方式

1.一种是使用api通过网页

2.一种是离线:https://blog.csdn.net/qf0129/article/details/83145765

我现在使用网页api

地址:https://www.ip138.com

申请一个token

https://user.ip138.com/ip/

选择在线API申请,注册完成之后,校验信息那边有token

ip查询接口文档为:

https://user.ip138.com/ip/doc

查询:

http://api.ip138.com/ip/?ip=填入你的ip地址&datatype=text&token=填入你的token

代码语言:javascript复制
In [98]: import requests
    ...: url = 'http://api.ip138.com/ip/?ip=111.200.157.165&datatype=text&token=abbbcccddd123456789'
    ...: web = requests.get(url)
    ...: web.text
Out[98]: '111.200.157.165t中国 北京 北京  联通 100000 010'
In [99]: # 很明显的可以看到是国家省份城市
    ...: # 我们再来看一个
In [97]: import requests
    ...: url = 'http://api.ip138.com/ip/?ip=27.128.190.0&datatype=text&token=aaaaaaabbbbbbccccdddd12345'
    ...: web = requests.get(url)
    ...: web.text
Out[97]: '27.128.190.0t中国 河北 石家庄  电信 050000 0311'
In [97]: # 获取城市信息
In [74]: city = web.text.split()[3]
In [75]: city
Out[75]: '石家庄' 

6.查询本市的天气

使用中华万年历API接口,获取天气信息,json格式

http://wthrcdn.etouch.cn/weather_mini?city=北京

代码语言:javascript复制
 In [96]: import requests
    ...: url = 'http://wthrcdn.etouch.cn/weather_mini?city=北京'
    ...: web = requests.get(url)
    ...: web.text
Out[96]: '{"data":{"yesterday":{"date":"19日星期五","high":"高温 10℃","fx":"西南风","low":"低温 3℃","fl":"","type":"小雨"},"city":"北京","forecast":[{"date":"20日星期六","high":"高温 15℃","fengli":"","low":"低温 3℃","fengxiang":"西北风","type":"晴"},{"date":"21日星期天","high":"高温 13℃","fengli":"","low":"低温 0℃","fengxiang":"西北风","type":"晴"},{"date":"22日星期一","high":"高温 18℃","fengli":"","low":"低温 3℃","fengxiang":"西南风","type":"晴"},{"date":"23日星期二","high":"高温 19℃","fengli":"","low":"低温 7℃","fengxiang":"南风","type":"晴"},{"date":"24日星期三","high":"高温 20℃","fengli":"","low":"低温 4℃","fengxiang":"北风","type":"晴"}],"ganmao":"感冒易发期,外出请适当调整衣物,注意补充水分。","wendu":"12"},"status":1000,"desc":"OK"}'
In [97]: # 解析json
In [104]: import json
In [131]: wea_dict=json.loads(web.text)
In [132]: wea_dict
Out[132]:
{'data': {'yesterday': {'date': '19日星期五',
   'high': '高温 10℃',
   'fx': '西南风',
   'low': '低温 3℃',
   'fl': '',
   'type': '小雨'},
  'city': '北京',
  'forecast': [{'date': '20日星期六',
    'high': '高温 15℃',
    'fengli': '',
    'low': '低温 3℃',
    'fengxiang': '西北风',
    'type': '晴'},
   {'date': '21日星期天',
    'high': '高温 13℃',
    'fengli': '',
    'low': '低温 0℃',
    'fengxiang': '西北风',
    'type': '晴'},
   {'date': '22日星期一',
    'high': '高温 18℃',
    'fengli': '',
    'low': '低温 3℃',
    'fengxiang': '西南风',
    'type': '晴'},
   {'date': '23日星期二',
    'high': '高温 19℃',
    'fengli': '',
    'low': '低温 7℃',
    'fengxiang': '南风',
    'type': '晴'},
   {'date': '24日星期三',
    'high': '高温 20℃',
    'fengli': '',
    'low': '低温 4℃',
    'fengxiang': '北风',
    'type': '晴'}],
  'ganmao': '感冒易发期,外出请适当调整衣物,注意补充水分。',
  'wendu': '12'},
 'status': 1000,
 'desc': 'OK'}

In [135]: # 所以今天的天气为
In [136]: wea_dict['data']['forecast'][0]
Out[136]:
{'date': '20日星期六',
 'high': '高温 15℃',
 'fengli': '',
 'low': '低温 3℃',
 'fengxiang': '西北风',
 'type': '晴'}
 

整体代码

代码语言:javascript复制
# -*- coding: utf-8 -*-
# 导入所需包
import json
import emoji
import random
import datetime
import requests
import pandas as pd

# 随机形成几个emoji字符
def random_emoji(num):
    # 挑选几个比较优质的emoji
    emoji_list = [':thumbs_up:',':collision:',':star:',':sparkles:',':alien:',':fire:',':whale:',   ':mount_fuji:',':ghost:']
    # 将其随机组合成几个字符
    emoji_str = ''
    for i in range(num):
      emoji_str = emoji_str   random.choice(emoji_list)
    return emoji_str

# 读取名人名言并随机选择一条
def get_saying(file):
    df = pd.read_csv(file,sep='t')
    return random.choice(df['名言'])

# 定义获取ip的函数
def get_host_ip():
    url = 'http://txt.go.sohu.com/ip/soip'
    web = requests.get(url)
    return web.text.split('{window.sohu_user_ip="')[1].split('";sohu_IP_Loc=')[0]

# 定义通过ip获取城市的函数
def get_city(ip,token):
    url = 'http://api.ip138.com/ip/?ip=' ip '&datatype=text&token=' token
    web = requests.get(url)
    return web.text.split()[3]

# 定义通过城市获取天气信息的函数
def get_weather(city):
    url = 'http://wthrcdn.etouch.cn/weather_mini?city=' city
    web = requests.get(url)
    wea_dict = json.loads(web.text)
    return wea_dict['data']['forecast'][0]

# 填入我们的格式化字符串中
def output_str(emoji_str,saying,city,wea_dict):
    # 获取日期
    date = datetime.datetime.now().strftime('%Y-%m-%d')
    # 格式化字符串
    format_str = "%s npython every dayn %s n————————————  n?|日期:%s n?|坐标:%sn?|天气:%sn?|温度:%sn?|风力:%s"
    # 解析天气信息
    wea_type = wea_dict['type']
    wind = wea_dict['fengli'].split('CDATA[')[1][:2]
    temp = wea_dict['low']   '~'   wea_dict['high']
    out = format_str % (emoji_str, saying, date, city, wea_type, temp,wind)
    return out

def simply_get_everyday(num = 6, file = './soup-master/名人名言.tsv', token = 'get_by_yourself'):
    # 注释:因为无复杂函数,所以只是为此函数作说明
    """
    描述:
        自动获取当前地理位置,天气,以及名人名言
        输出每日一句
    参数:
        num: 需要emoji 的数目,默认为 6,类型:int
        file: 名人名言文件存放目录,默认为 ./soup-master/名人名言.tsv,类型:str
        token: 申请的http://api.ip138.com/ip 的token,默认为 get_by_yourself,类型:str
    返回:
        out,含有emoji的字符串,类型:str
    使用:
        >>> out = simply_get_everyday(6,'./soup-master/名人名言.tsv','aaaaaaaabbbbbbcccccddddd123454')
        >>> print(out)
            ??⭐???
            python every day
            生活的道路一旦选定,就要勇敢地走到底,决不回头。
            ————————————
            ?|日期:2021-03-20
            ?|坐标:北京
            ?|天气:晴
            ?|温度:低温 2℃~高温 15℃
            ?|风力:3级
    异常:
        TypeError: emoji的数目类型输入错误
        IndexError: token输入错误,或者已经失效
        FileNotFoundError: 名人名言文件位置输入错误
    """
    emoji_str = random_emoji(num)
    saying = get_saying(file)
    ip = get_host_ip()
    city = get_city(ip,token)
    wea_dict = get_weather(city)
    out = output_str(emoji_str,saying,city,wea_dict)
    return emoji.emojize(out)
# 进入主函数
if __name__ == "__main__":
    print(simply_get_everyday(num = 6, file = './soup-master/名人名言.tsv', token = 'aaaaaabbbbbcccccddddd1234'))

0 人点赞