返回
多御红包活动

场景编程集锦 - 世界那么大,我想去看看

发布时间:2023-01-17 13:13:43 70
# html# 爬虫# 数据# 货币# 信息

场景描述

image.png

  “世界那么大,我想去看看”。这句话出自于一位中学老师的辞职申请,整个辞职信只有短短10个字,它被喻为史上最具情怀的辞职信。如此任性的辞职信,领导最后真批准了。随着辞职信内容爆光,“世界那么大,我想去看看”迅速爆红网络,形成现象级传播,引发无数网友共鸣和传颂。或许人生就是为了领略更多的精彩,在中国古时候就有读万卷书,不如行万里路的名言,明代旅行家徐霞客更是穷尽一生,游历华夏大好河山。   现在,随着物质生活水平的不断提高,人们追求美好生活的向往正在变为现实。“世界那么大,我想去看看”,走出国门,环游世界成为许多国人心中的梦想和美好愿景。那些闻名于世的旅游圣地:科罗拉多大峡谷、浪漫爱情海、澳洲大堡礁、薰衣草故乡普罗旺斯、万种风情的巴厘岛、印度泰姬陵、埃及胡夫金字塔、法国埃菲尔铁塔、俄罗斯的贝加尔湖和莫斯科红场等等,每年都吸引着数以千万游客前来观光旅游。如果你将来有计划出境旅游,那么兑换外币一定是旅游攻略中必不可少的重要内容。下面我们选取出国旅行中的外币兑换场景,使用Python语言编写一个兑换外币的程序。千万不要认为这是一件简单的编程工作,事实上这也是一件具有挑战性的编程任务。

编程思路

2.1 获取外汇牌价

  本程序的难点在于如何实时地获取到外汇牌价信息,其实有许多银行的门户网站均提供实时外汇牌价信息。本案例中我们可以编写一个爬虫程序,从中国银行外汇牌价网站(http://m.waihuipaijia.cn)获取实时的汇率牌价,这是解决问题的关键所在。 image.png

  以上图片是中国银行外汇牌价网主页的部分截图。有几个关于外汇的概念,我们有必要简单了解一下,这是正确编写程序的基础。根据我国现行的外汇管理条例,中国公民购买卖外汇只能去具有外汇业务资质的银行办理。中国银行外汇牌价表中卖出价是指银行将外币卖给个人的报价,反之买入价是指银行出价购买个人持有外币的报价。外币分为现钞和现汇两种。如果你需要出国留学,从国内转账汇款到境外,那么你就必须购买现汇;如果你是要出境旅游,则可购买现钞随身携带,需要注意的是携带现钞数量是有限制的,而且存在安全隐患。通常现钞比现汇的卖出价更高,这是因为现钞有管理成本,例如押运、金库存放等成本。好了,有了以上概念之后,针对出国旅游的应用场景,爬虫程序需要爬取现钞卖出价一栏的数据。

2.2 货币表示

  一般来说我们要使用整数表示货币,以避免运算误差。在本案例中,为了简化编程工作,我们暂时使用浮点数表示汇率参与运算。要彻底解决好这个问题,我们将此留待程序优化一节中考虑。

2.3 外汇兑换币种

  本版程序暂时支持人民币与美元,英镑,欧元,日元,澳元兑换。

程序代码

  程序由两个模块构成。一是exchange_rate.py,它实际上是一个爬虫程序,用于从中国银行外汇牌价网站获取汇率信息;另一个是exchange.py是外汇兑换的主程序。其程序代码如下: 爬虫程序:exchange_rate.py 程序代码如下:

"""
  exchange_rate.py : 从中国银行外汇牌价网站获取汇率
"""
import sys
import requests
import bs4

url = 'http://m.waihuipaijia.cn'
headers = {
        'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) '
                      'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Mobile Safari/537.36'}

currency = {
    '美元': 'm_meiyuan.htm',
    '英镑': 'm_yingbang.htm',
    '欧元': 'm_ouyuan.htm',
    '日元': 'm_riyuan.htm',
    '澳元': 'm_aodaliyayuan.htm'
}

def exchange_rate(name):
    """
    实时获取汇率表的中行折算价
    name: 货币名称
    """
    # 下载网页
    res = requests.get(url, headers=headers)
    try:
        res.raise_for_status()
    except Exception as exc:
        print('错误:{0}'.format(exc))
        sys.exit(1)
    
    res.encoding = 'utf8'   # ①
    soup = bs4.BeautifulSoup(res.text, 'html.parser')   # ②
    sel_str = 'a[href="'+url+'/'+currency[name]+'"]'   # ③
    elements = soup.select(sel_str)[0].parent.next_siblings   # ④
    elements = [e for e in elements if e != '\n']  # ⑤
    price = float(elements[3].getText())   # ⑥ 
    return price

主要语句说明如下: 语句①处理中文网页,这个设置可以处理网页中的中文字符。 语句②使用html.parser解析器对下载的网页内容进行解析。 语句③构造选择器字符串。 语句④筛选指定a标签的父节点其后的所有兄弟节点。 语句⑤过滤换行字符。 语句⑥获取现钞卖出价。 外汇兑换程序:exchange.py 代码如下所示:

"""
  exchange.py : 世界那么大我想去看看 -人民币外汇兑换
"""
from common.exchange_rate import *
from datetime import datetime

def menu():   # ①
    while True:
        for name in currency.keys():   # ②
            print(name, end=',')
        print('\b:')
        name = input('选择币种:')
        if name in currency.keys():   # ③
            break
    return name

def main():
    name = menu()
    while True:   # ④
        try:
            money = float(input('兑换金额:'))
            break
        except ValueError:
            print('输入数据有误!')

    price = exchange_rate(name) / 100.00
    today = datetime.now()
    print('今天日期:', today.strftime('%Y-%m-%d %H:%M:%S'))   # ⑤
    print('现钞卖出:', round(price * 100, 2))
    rmb_money = money * price
    print('兑换 {0} ({1}) = {2:.2f} 元 (人民币)'.format(money, name, rmb_money))   # ⑥

if __name__ == '__main__':
    main()

重要语句如下所示: 语句①定义具有容错机制的币种显示菜单函数。 语句②循环显示币种菜单项。 语句③判断输入币种的有效性。 语句④带容错功能的数据输入,这里输入兑换外币的金额。 语句⑤格式化打印今天的日期和时间,因为汇率实时在变更。 语句⑥格式化打印兑换结果。

执行效果

  本程序是由两个部分组成。一个是存放在Python包common中的程序模块exchange_rate.py,它是用于实时从中国银行外汇牌价网上获取汇率信息;另一个则是主程序exchange.py进行外币兑换计算和打印结果。

4.1 程序目录

D:\cases\世界那么大,我想去看看>dir
2022/12/15  13:29              common
2022/12/15  13:29               958 exchange.py

D:\cases\世界那么大,我想去看看>

其中common是Python的包文件

D:\cases\世界那么大,我想去看看>cd common
D:\cases\世界那么大,我想去看看\common>dir
2022/12/15  13:29             1,361 exchange_rate.py
2022/04/01  07:34               106 __init__.py

D:\cases\世界那么大,我想去看看\common>

4.2 环境安装

因本程序需要安装第三方库requests, beautifulsoup4支持,所以我们需要单独安装这两个库。

pip3 install requests -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
pip3 install Beautifulsoup4 -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

4.3 运行效果

下面演示了两种情况,分别兑换5000美元和5000英镑的程序执行过程。 兑换5000美元:

D:\cases\世界那么大,我想去看看>python exchange.py
美元,英镑,欧元,日元,澳元:
选择币种:美元
兑换金额:5000
今天日期: 2022-12-15 13:26:10
现钞卖出: 697.84
兑换 5000.0 (美元) = 34892.00 元 (人民币)

兑换5000英镑:

D:\cases\世界那么大,我想去看看>python exchange.py
美元,英镑,欧元,日元,澳元:
选择币种:英镑
兑换金额:5000
今天日期: 2022-12-15 13:26:31
现钞卖出: 869.23
兑换 5000.0 (英镑) = 43461.50 元 (人民币)

(cases) D:\cases\世界那么大,我想去看看>

  另外在此特别需要说明的情况,如果你执行程序出错,不能获取外汇牌价网信息的话,最有可能的原因是这个网站对通过无线网络的访问请求有所限制,你需要通过有线网络接入互联网,才能正确访问中国银行外汇牌价网站。这也是我在调试本案例程序时发现的这个问题。

程序优化

  从一般意义上讲,这一版本程序能够满足外币兑换的需求,但是程序还是有一些优化的空间。例如你可以使用整数来表示货币,以避免货币兑换中的误差,如果这样的话,这个程序就更加完美了。另外,我们可以增加更多的外汇兑换的币种,可以进一步增强程序的实用性。有兴趣的读者可以自行完成这个具有挑战性的任务,祝你好运!  

特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报
评论区(0)
按点赞数排序
用户头像
精选文章
thumb 中国研究员首次曝光美国国安局顶级后门—“方程式组织”
thumb 俄乌线上战争,网络攻击弥漫着数字硝烟
thumb 从网络安全角度了解俄罗斯入侵乌克兰的相关事件时间线