用Python爬中国银行指定日期九点三十分汇率
需求描述
公司财务需求,需要中国银行每天9点30分以后第一条汇率数据,由于网上汇率接口都是实时汇率没办法定点查询数据,故而从中国银行外汇牌价(https://srh.bankofchina.com/search/whpj/search_cn.jsp) 抓取数据。
环境搭建
项目采用python3.6
依赖安装
pip install requests
pip install lxml
代码实现
import requests
from lxml import etree
import re
import mathdef getRate(dateb):#key 为币种 value为 中国银行外汇牌价 币种代码 可以通过 F12来抓取。pjcodes = [{"key": "美元", "value": 1316},{"key": '港币', "value": 1315},{"key": "日元", "value": 1323},{"key": "欧元", "value": 1326},{"key": '英镑', "value": 1314},{"key": "加拿大元", "value": 1324},{"key": "澳大利亚元", "value": 1325},{"key": "瑞士法郎", "value": 1317},{"key": "新加坡元", "value": 1375},# {"key": "瑞典克朗", "value": 1320},# {"key": "丹麦克朗", "value": 1321},# {"key": "挪威克朗", "value": 1322},# {"key": "德国马克", "value": 1318},# {"key": "法国法郎", "value": 1319},# {"key": "澳门元", "value": 1327},# {"key": "菲律宾比索", "value": 1328},# {"key": "泰国铢", "value": 1329},# {"key": "新西兰元", "value": 1330},# {"key": "韩元", "value": 1331},# {"key": "卢布", "value": 1843},# {"key": "林吉特", "value": 2890},# {"key": "新台币", "value": 2895},# {"key": "西班牙比塞塔", "value": 1370},# {"key": "意大利里拉", "value": 1371},# {"key": "荷兰盾", "value": 1372},# {"key": "比利时法郎", "value": 1373},# {"key": "芬兰马克", "value": 1374},# {"key": "印尼卢比", "value": 3030},# {"key": "巴西里亚尔", "value": 3253},# {"key": "阿联酋迪拉姆", "value": 3899},# {"key": "印度卢比", "value": 3900},# {"key": "南非兰特", "value": 3901},# {"key": "沙特里亚尔", "value": 4418},# {"key": "土耳其里拉", "value": 4560}];lists = [];for pjcode in pjcodes:rate_09 = crow(dateb, dateb, pjcode['key'], None);if (len(rate_09)) != 0:print("正在获取"+rate_09[0]+" 汇率")rate_dic = {};rate_dic['currency'] = rate_09[0];#币种rate_dic['rate_xhr'] = rate_09[1];#现汇买入价rate_dic['rate_xcr'] = rate_09[2];#现钞买入价rate_dic['rate_xhc'] = rate_09[3];#现汇卖出价rate_dic['rate_xcc'] =rate_09[4];#现钞卖出价rate_dic['rate_zs'] = rate_09[5];#中行折算价rate_dic['dateb'] = rate_09[6];#发布时间lists.append(rate_dic);print("---------------------------")return lists;# 返回html对象
def getHtml(erectDate, nothing, pjname, page):# 定义要传的json formdata 内容 通过post 请求 拿到 html代码 erectDate开始时间 nothing结束时间 pjname货币代码 page页数 时间一般 开始和结束为同一天pyload = {"erectDate": erectDate,"nothing": nothing, "pjname": pjname, "page": page, "head": "head_620.js", "bottom": "ottom_591.js"}# 定义浏览器头部 防止被拦截headers = {"Content-Type": "application/x-www-form-urlencoded","Origin": "https://srh.bankofchina.com","Referer": "https://srh.bankofchina.com/search/whpj/search_cn.jsp","Upgrade-Insecure-Requests": "1","Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3","User-Agent": "Mozilla / 5.0(WindowsNT 10.0;WOW64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 68.0.3440.106 Safari / 537.36"}# response = requests.post("http://srh.bankofchina.com/search/whpj/search.jsp", data=pyload, headers=headers)response = requests.post("https://srh.bankofchina.com/search/whpj/search_cn.jsp", data=pyload, headers=headers)# 转化为html对象html = etree.HTML(response.text);return (html, response.text)def crow(erectDate, nothing, pjname, page):coutnt = 0;if (page == None):page = getPageCount(erectDate, nothing, pjname); # 拿到总页数 只需要抓九点30第一条数据 往往出现在最后一页 所以优先抓最后一页数据html = getHtml(erectDate, nothing, pjname, page)[0];# 抓取 class 为 BOC_main publish 的talbel 下 所有trdatas = html.xpath('//div[@class="BOC_main publish"]/table/tr')arr = [];for index in range(1, len(datas) - 1): # 第一个tr 和最后一个tr 无用, 剔除ratelist = datas[index].xpath('td')tds6 = [];for rates in ratelist:tds6.append(rates.xpath('text()')[0] if (len(rates.xpath('text()')) != 0) else 0) # 因为 有些 td里为空, 直接用datas[index].xpath('td/text()') 为空的td 会没有坐标 导致后面数组越界if (len(tds6)) != 0:if (int(tds6[6][11:13]) == 9 and int(tds6[6][14:16]) >= 30): # 只要大于九点30的数据arr.append(tds6)elif (int(tds6[6][11:13]) > 9):arr.append(tds6)rate_09 = [];if (len(arr) != 0):rate_09 = arr[len(arr) - 1]; # 只要大于九点30 最小的一条数据 由于排序为倒序 即最后一条 为最小if (len(rate_09) == 0): # 说明 当页未找到 大于九点的数据 需要往下一页查找if (page - 1 > 0):rate_09 = crow(erectDate, nothing, pjname, page - 1); # 递归 找到便往上抛return rate_09 # 返回九点30最后一条数据 由于排序为倒序,最后一条即为 九点最早的汇率def getPageCount(erectDate, nothing, pjname):html = getHtml(erectDate, nothing, pjname, 1)[1] # 第一次先抓 总页数reg = re.compile(r"(?<=var m_nRecordCount = )\d+")match = reg.search(html);pageAll = 1;if (int(match.group(0)) > 20): # 每页20条数据 算最大页pageAll = math.ceil(int(match.group(0)) / 20); # 向上取整数return pageAllif __name__ == '__main__':obj=getRate('2019-11-18')print(obj)
运行效果
正在获取美元 汇率
正在获取港币 汇率
正在获取日元 汇率
正在获取欧元 汇率
正在获取英镑 汇率
正在获取加拿大元 汇率
正在获取澳大利亚元 汇率
正在获取瑞士法郎 汇率
正在获取新加坡元 汇率
---------------------------
[{'currency': '美元', 'rate_xhr': '700.18', 'rate_xcr': '694.49', 'rate_xhc': '703.15', 'rate_xcc': '703.15', 'rate_zs': '700.37', 'dateb': '2019.11.18 09:31:33'}, {'currency': '港币', 'rate_xhr': '89.41', 'rate_xcr': '88.7', 'rate_xhc': '89.77', 'rate_xcc': '89.77', 'rate_zs': '89.46', 'dateb': '2019.11.18 09:31:33'}, {'currency': '日元', 'rate_xhr': '6.4259', 'rate_xcr': '6.2262', 'rate_xhc': '6.4731', 'rate_xcc': '6.4767', 'rate_zs': '6.443', 'dateb': '2019.11.18 09:31:33'}, {'currency': '欧元', 'rate_xhr': '773.11', 'rate_xcr': '749.08', 'rate_xhc': '778.81', 'rate_xcc': '780.54', 'rate_zs': '774.14', 'dateb': '2019.11.18 09:31:33'}, {'currency': '英镑', 'rate_xhr': '903.37', 'rate_xcr': '875.3', 'rate_xhc': '910.02', 'rate_xcc': '912.23', 'rate_zs': '904.8', 'dateb': '2019.11.18 09:31:33'}, {'currency': '加拿大元', 'rate_xhr': '528.98', 'rate_xcr': '512.28', 'rate_xhc': '532.88', 'rate_xcc': '534.17', 'rate_zs': '529.69', 'dateb': '2019.11.18 09:31:33'}, {'currency': '澳大利亚元', 'rate_xhr': '476.5', 'rate_xcr': '461.7', 'rate_xhc': '480.01', 'rate_xcc': '481.18', 'rate_zs': '477.28', 'dateb': '2019.11.18 09:31:33'}, {'currency': '瑞士法郎', 'rate_xhr': '706.46', 'rate_xcr': '684.66', 'rate_xhc': '711.42', 'rate_xcc': '713.76', 'rate_zs': '708.02', 'dateb': '2019.11.18 09:31:33'}, {'currency': '新加坡元', 'rate_xhr': '513.63', 'rate_xcr': '497.78', 'rate_xhc': '517.23', 'rate_xcc': '518.78', 'rate_zs': '514.87', 'dateb': '2019.11.18 09:31:33'}]
github地址
https://github.com/ygh1483345314/ratebydate/
用Python爬中国银行指定日期九点三十分汇率相关推荐
- python代码判断指定日期是当前年的第多少天
python代码判断指定日期是当前年的第多少天 #python代码判断指定日期是当前年的第多少天 #不适用标准库 def is_leap_year(year):"""判断 ...
- python爬取指定关键字图片
''' 爬取指定关键字图片 ''' import re# 正则表达式,解析网页 import requests# 请求网页 import traceback import osdef dowmload ...
- python爬取指定分辨率模特壁纸
文章目录 一.导入的库 二.页面分析 三.完整代码 四.结果展示 五.Blogger's speech 近些天,别人都是成双成对,单身的我该咋办? 好久没有更新壁纸库,这些天就填充一点壁纸好了! 针对 ...
- 使用python获取股票指定日期交易代码数据
证券宝www.baostock.com是一个免费.开源的证券数据平台. 提供大量准确.完整的证券历史行情数据.上市公司财务数据等. 通过python API获取证券数据信息,满足量化交 ...
- python爬取指定歌曲的MV
目标网站 音悦Tai:http://www.yinyuetai.com/ 爬取结果 根据指定的歌曲爬取十个相关的mv,存在列表里,十个mv对应十个字典,键为mv的名称,值为mv的数据. 当然也可以根据 ...
- python爬取指定时间,指定关键词的微博文本
根据关键词爬取微博文本 首先导入所使用的库 from selenium import webdriver from lxml import html from urllib import parse ...
- 用python爬取指定数据流量是几点_使用python进行微信宜出行人流量数据爬取
写在前面 由于宜出行的登录策略更新,导致无法使用qq登录直接爬取人流量的问题,近期进行了代码升级,已经解决了该问题,并且能顺利爬取数据,示例如下.目前暂不提供源代码,如有需要宜出行数据,可联系:917 ...
- 微博指定日期舆情数据爬虫获取—基于中文金融词典(python)
最近在做一个微博舆情与金融市场分析的课题,需要爬取微博的舆情数据.因此需要根据关键词爬取指定日期的微博.现在代码写完了,实测还行,sleep设置得比较久,但爬取的数据很完整.硕士三年在CSDN学到了很 ...
- python爬虫搜特定内容的论文_python爬取指定微信公众号文章
python怎么抓取微信阅清晨的阳光比不上你的一缕微笑那么动人,傍晚的彩霞比不上你的一声叹息那么心疼,你的一个个举动,一句句话语都给小编带来无尽的幸福. 抓取微信公众号的文章 一.思路分析 目前所知晓 ...
- python爬取贴吧所有帖子-python爬取贴吧帖子
一.介绍 我们常遇到一些很长的贴吧连载帖子想存到本地再看 此文就是运用python爬取指定百度贴吧的帖子并存到本地满足需求 环境:python2.7 目标网页:[长篇连载]剑网3的正史和野史--从头开 ...
最新文章
- 小程序json字符串转 json对象 { name :你好} 转成 { name :你好}
- BFS之三(单向bfs和康托压缩)
- 一文读懂 Nginx
- 云信“欢乐颂活动”中奖名单
- 【暑假训练 7.10】 codevs 2492 上帝造题的七分钟2
- Beetlex官网迁移完成
- sessionStorage与clone方法在项目中的应用
- linux下-bash: ls: command not found
- linux下.so、.ko、.a的区别
- [Ext JS6]编码规范
- stm32寄存器版学习笔记04 定时计数器中断
- python爬取flash数据_爬取flash数据
- linux服务器上svn的log_Linux 下 SVN 常用操作命令详解
- 03、ADS使用记录之DC仿真控制器的使用
- 开关稳压集成电路电源
- gae java,适用于GAE的Java PDF库?
- 拔丝芋头的Java学习日记--Day4
- 手机邮件html样式,iPhone技巧篇 如何添加HTML风格邮件签名
- Photoshop基础学习目录
- 西邮Linux兴趣小组2017纳新免试题揭秘
热门文章
- codeforces_946D_Timetable(分组背包)
- vue-quill-editor超链接bug问题
- 产品需求文档(PRD)
- 乱序整数序列两数之和绝对值最小
- safari查看html代码,iPhone不越狱safari查看网页源代码方法
- justinmind破解方法
- IT大败局----第十章 企业公关的真谛
- 每天老听别人念叨“算法+数据结构=程序”,知道是谁说的么?一起走进Pascal语言之父——图灵奖得主尼古拉斯·沃斯
- wrapper.and的用法
- Borůvka算法学习小记