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

歡迎訪問 生活随笔!

生活随笔

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

python

【练习/Python】监测汇率脚本

發布時間:2024/1/8 python 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【练习/Python】监测汇率脚本 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 1 背景
  • 2 環境
  • 3 代碼
    • 3.1 Yahoo匯率(內地IP可以跳過)
    • 3.2 中銀匯率
    • 3.3 監測
    • 3.4 運行
    • 3.5 整體代碼
  • 4 運行效果

1 背景

作者現在在香港,最近半年因為美國加息,港幣暴漲,非常痛苦。在網上找了找也沒有找到能夠實時更新的API來調用。為了能在偶爾出現匯率下降的時候及時購匯,寫了一個監測Yahoo和中銀匯率的Python腳本。

結尾有整個Python代碼。

2 環境

  • 建議可以跑在服務器上可以一直運行
  • Python3

要引入的包:

import random import sysimport requests from lxml import etree from hyper.contrib import HTTP20Adapter import smtplib from email.mime.text import MIMEText from email.header import Header import datetime import time

哪個沒有直接pip install一下就行了。

3 代碼

本質上就是給相應頁面的服務器發送Http請求獲取html頁面內容之后再Xpath來解析。不過先用瀏覽器進入F12檢查一下攜帶的headers和參數,再用requests工具發送就可以模擬瀏覽器而不被拒絕了。

至于怎么獲取請求頭和參數,在瀏覽器進入檢查界面后,進入帶有匯率的頁面,查看網絡一欄下哪一個請求到了想要的數據,把url,headers和參數都記下來就行了(你也可以直接使用我的headers試試),在Python中用字典的形式來保存。

如果你需要其他貨幣的匯率,更換一下下面代碼中的url就可以了。下面的url中都帶了一個時間戳的參數防止緩存。

3.1 Yahoo匯率(內地IP可以跳過)

def get_yahoo_hk_currency():url = 'https://finance.yahoo.com/quote/HKDCNY=X?p=HKDCNY=X&.tsrc=fin-srch&timestamp=' + str(time.time())headers = {':method': 'GET', ':scheme': 'https', ':authority': 'finance.yahoo.com',':path': '/quote/HKDCNY=X?p=HKDCNY=X&.tsrc=fin-srch','Cookie': 'A1=d=AQABBDHvM2MCECI2mmBLq9Wjg_CpwqrHHxgFEgEBBwE2WmODY1iia3sB_eMBAAcIMe8zY6rHHxg&S=AQAAAkClup8wRI-xsJF1yi6vqII; A1S=d=AQABBDHvM2MCECI2mmBLq9Wjg_CpwqrHHxgFEgEBBwE2WmODY1iia3sB_eMBAAcIMe8zY6rHHxg&S=AQAAAkClup8wRI-xsJF1yi6vqII&j=WORLD; A3=d=AQABBDHvM2MCECI2mmBLq9Wjg_CpwqrHHxgFEgEBBwE2WmODY1iia3sB_eMBAAcIMe8zY6rHHxg&S=AQAAAkClup8wRI-xsJF1yi6vqII; B=1g7u7l9hj7rph&b=3&s=sc; PRF=t%3DCNY%253DX; maex=%7B%22v2%22%3A%7B%7D%7D; __gpi=UID=00000894058aa89c:T=1666772728:RT=1666772728:S=ALNI_Mbzrr-RS-qdoaBtUlK4qMHoR4fTOw; GUC=AQEBBwFjWjZjg0IdJwR0; cmp=t=1666772723&j=0&u=1---; GUCS=ATweDAh7','Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8','Host': 'finance.yahoo.com','User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.1 Safari/605.1.15','Accept-Language': 'zh-CN,zh-Hans;q=0.9', 'Accept-Encoding': 'gzip, deflate, br','Connection': 'keep-alive'}params = {'p': 'HKDCNY=X', '.tsrc': 'fin-srch'}sessions = requests.session()sessions.mount(url, HTTP20Adapter())res = sessions.get(url, headers=headers, params=params)dom = etree.HTML(res.text)cur = dom.xpath('/html/body//div[@class="D(ib) Mend(20px)"]/fin-streamer')return float(cur[0].text) if len(cur) > 0 else -1

下面是Yahoo帶有匯率的html,藍色部分是我們想要的匯率信息。

函數中用到的Xpath語法照著這張圖估計也就差不多能明白了(//表示的是無視層級的查找)。

3.2 中銀匯率

跟上面的原理類似,但是中銀這個頁面(居然還是jsp)請求更加簡單,不需要請求頭就行。

def get_boc_hk_currency():url = 'https://srh.bankofchina.com/search/whpj/search_cn.jsp'params = {'erectDate': None, 'nothing': None, 'pjname': '港幣', 'head': 'head_620.js', 'bottom': 'bottom_591.js','t': random.random()}sessions = requests.session()sessions.mount(url, HTTP20Adapter())res = sessions.get(url, params=params)dom = etree.HTML(res.text)tds = dom.xpath('/html/body//div[@class="BOC_main publish"]//tr[2]/td')# 購匯buy_currency = round(float(tds[3].text) / 100, 4)# 結匯sale_currency = round(float(tds[1].text) / 100, 4)return buy_currency, sale_currency

3.3 監測

匯率能夠獲取到了,剩下的邏輯就可以按照自己的需求來寫了。

我這里是監測到和上次記錄的值不相等就發送一封電子郵件給自己。使用到了email包,要注意的是,使用QQ郵箱這種進行發送的時候,密碼不是你的QQ密碼,要去QQ郵箱頁面開啟SMTP服務(不清楚的可以百度查),使用提供的授權碼作為密碼。

開頭部分這里接收郵箱通過命令行參數的形式來接收(第一個命令行參數是腳本的文件名,所以收集完刪掉第一個元素del(to_addrs[0])),也可以直接寫死。剩下的代碼就很好理解了。死循環結尾是讓線程睡眠一段時間,給個隨機值降低被檢測出來是腳本的可能。

if __name__ == '__main__':# sys.stdout.flush()to_addrs = []from_addr = "?@163.com"for email in sys.argv:to_addrs.append(email)del (to_addrs[0])# 記錄上一次yahoo購匯發送的匯率和時間last_yahoo_currency = -1last_boc_buy_currency = -1last_boc_sale_currency = -1last_time = '初始化運行無數據,已記錄本次'while True:try:yahoo_currency = get_yahoo_hk_currency()boc_buy_currency, boc_sale_currency = get_boc_hk_currency()print(str(datetime.datetime.now()) + ' ' + str(yahoo_currency) + ' ' + str(boc_buy_currency) + ' ' + str(boc_sale_currency))if last_boc_buy_currency == -1 or (last_yahoo_currency != -1 and last_yahoo_currency != yahoo_currency) \or last_boc_buy_currency != boc_buy_currency:print("監測到變化。")cur_time = str(datetime.datetime.now())msg_str = f'''{cur_time}[yahoo]\t\t{yahoo_currency}[boc購匯]\t{boc_buy_currency}[boc結匯]\t{boc_sale_currency}-------------------(上一次中銀購匯匯率){last_time}{last_boc_buy_currency}'''# 創建 SMTP 對象mail_server = "smtp.163.com"smtp = smtplib.SMTP_SSL(mail_server)smtp.connect(mail_server, port=465)# 登錄,需要:登錄郵箱和授權碼smtp.login(user=from_addr, password="?")msg = MIMEText(msg_str, 'plain', 'utf-8')msg['From'] = Header('URAC')msg['Subject'] = Header('港幣匯率更新提醒', 'utf-8')smtp.sendmail(from_addr=from_addr,to_addrs=to_addrs, msg=msg.as_string())smtp.quit()smtp.close()last_yahoo_currency = yahoo_currencylast_boc_buy_currency = boc_buy_currencylast_boc_sale_currency = boc_sale_currencylast_time = str(cur_time)except BaseException as e:traceback.print_exc()finally:sys.stdout.flush()time.sleep(30 - random.randint(-9, 9))

3.4 運行

在服務器(或者自己電腦上)上執行nohup python3 currency.py 1@qq.com 2@qq.com &就能夠在后臺持續執行了。

3.5 整體代碼

import random import sysimport requests from lxml import etree from hyper.contrib import HTTP20Adapter import smtplib from email.mime.text import MIMEText from email.header import Header import datetime import time import tracebackdef get_yahoo_hk_currency():url = 'https://finance.yahoo.com/quote/HKDCNY=X?p=HKDCNY=X&.tsrc=fin-srch&timestamp=' + str(time.time())headers = {':method': 'GET', ':scheme': 'https', ':authority': 'finance.yahoo.com',':path': '/quote/HKDCNY=X?p=HKDCNY=X&.tsrc=fin-srch','Cookie': 'A1=d=AQABBDHvM2MCECI2mmBLq9Wjg_CpwqrHHxgFEgEBBwE2WmODY1iia3sB_eMBAAcIMe8zY6rHHxg&S=AQAAAkClup8wRI-xsJF1yi6vqII; A1S=d=AQABBDHvM2MCECI2mmBLq9Wjg_CpwqrHHxgFEgEBBwE2WmODY1iia3sB_eMBAAcIMe8zY6rHHxg&S=AQAAAkClup8wRI-xsJF1yi6vqII&j=WORLD; A3=d=AQABBDHvM2MCECI2mmBLq9Wjg_CpwqrHHxgFEgEBBwE2WmODY1iia3sB_eMBAAcIMe8zY6rHHxg&S=AQAAAkClup8wRI-xsJF1yi6vqII; B=1g7u7l9hj7rph&b=3&s=sc; PRF=t%3DCNY%253DX; maex=%7B%22v2%22%3A%7B%7D%7D; __gpi=UID=00000894058aa89c:T=1666772728:RT=1666772728:S=ALNI_Mbzrr-RS-qdoaBtUlK4qMHoR4fTOw; GUC=AQEBBwFjWjZjg0IdJwR0; cmp=t=1666772723&j=0&u=1---; GUCS=ATweDAh7','Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8','Host': 'finance.yahoo.com','User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.1 Safari/605.1.15','Accept-Language': 'zh-CN,zh-Hans;q=0.9', 'Accept-Encoding': 'gzip, deflate, br','Connection': 'keep-alive'}params = {'p': 'HKDCNY=X', '.tsrc': 'fin-srch'}sessions = requests.session()sessions.mount(url, HTTP20Adapter())res = sessions.get(url, headers=headers, params=params)dom = etree.HTML(res.text)cur = dom.xpath('/html/body//div[@class="D(ib) Mend(20px)"]/fin-streamer')return float(cur[0].text) if len(cur) > 0 else -1def get_boc_hk_currency():url = 'https://srh.bankofchina.com/search/whpj/search_cn.jsp'params = {'erectDate': None, 'nothing': None, 'pjname': '港幣', 'head': 'head_620.js', 'bottom': 'bottom_591.js','t': random.random()}sessions = requests.session()sessions.mount(url, HTTP20Adapter())res = sessions.get(url, params=params)dom = etree.HTML(res.text)tds = dom.xpath('/html/body//div[@class="BOC_main publish"]//tr[2]/td')# 購匯buy_currency = round(float(tds[3].text) / 100, 4)# 結匯sale_currency = round(float(tds[1].text) / 100, 4)return buy_currency, sale_currencyif __name__ == '__main__':# sys.stdout.flush()to_addrs = []from_addr = "?@163.com"for email in sys.argv:to_addrs.append(email)del (to_addrs[0])# 記錄上一次yahoo購匯發送的匯率和時間last_yahoo_currency = -1last_boc_buy_currency = -1last_boc_sale_currency = -1last_time = '初始化運行無數據,已記錄本次'while True:try:yahoo_currency = get_yahoo_hk_currency()boc_buy_currency, boc_sale_currency = get_boc_hk_currency()print(str(datetime.datetime.now()) + ' ' + str(yahoo_currency) + ' ' + str(boc_buy_currency) + ' ' + str(boc_sale_currency))if last_boc_buy_currency == -1 or (last_yahoo_currency != -1 and last_yahoo_currency != yahoo_currency) \or last_boc_buy_currency != boc_buy_currency:print("監測到變化。")cur_time = str(datetime.datetime.now())msg_str = f'''{cur_time}[yahoo]\t\t{yahoo_currency}[boc購匯]\t{boc_buy_currency}[boc結匯]\t{boc_sale_currency}-------------------(上一次中銀購匯匯率){last_time}{last_boc_buy_currency}'''# 創建 SMTP 對象mail_server = "smtp.163.com"smtp = smtplib.SMTP_SSL(mail_server)smtp.connect(mail_server, port=465)# 登錄,需要:登錄郵箱和授權碼smtp.login(user=from_addr, password="?")msg = MIMEText(msg_str, 'plain', 'utf-8')msg['From'] = Header('URAC')msg['Subject'] = Header('港幣匯率更新提醒', 'utf-8')smtp.sendmail(from_addr=from_addr,to_addrs=to_addrs, msg=msg.as_string())smtp.quit()smtp.close()last_yahoo_currency = yahoo_currencylast_boc_buy_currency = boc_buy_currencylast_boc_sale_currency = boc_sale_currencylast_time = str(cur_time)except BaseException as e:traceback.print_exc()finally:sys.stdout.flush()time.sleep(30 - random.randint(-9, 9))

4 運行效果

問題1 在CentOS上運行,發不出郵件也不報錯
解決 這個問題困擾我很久,網上說是沒有使用SMTP_SSL來連接,但是剛開始使用的時候 是能發出來的。然后還有一個情況是發送一陣之后就又不發送了,網上查到是需要定期quit()重新登錄才行,不然會自動退出。

總結

以上是生活随笔為你收集整理的【练习/Python】监测汇率脚本的全部內容,希望文章能夠幫你解決所遇到的問題。

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