需求描述

公司财务需求,需要中国银行每天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爬中国银行指定日期九点三十分汇率相关推荐

  1. python代码判断指定日期是当前年的第多少天

    python代码判断指定日期是当前年的第多少天 #python代码判断指定日期是当前年的第多少天 #不适用标准库 def is_leap_year(year):"""判断 ...

  2. python爬取指定关键字图片

    ''' 爬取指定关键字图片 ''' import re# 正则表达式,解析网页 import requests# 请求网页 import traceback import osdef dowmload ...

  3. python爬取指定分辨率模特壁纸

    文章目录 一.导入的库 二.页面分析 三.完整代码 四.结果展示 五.Blogger's speech 近些天,别人都是成双成对,单身的我该咋办? 好久没有更新壁纸库,这些天就填充一点壁纸好了! 针对 ...

  4. 使用python获取股票指定日期交易代码数据

    证券宝www.baostock.com是一个免费.开源的证券数据平台. 提供大量准确.完整的证券历史行情数据.上市公司财务数据等.         通过python API获取证券数据信息,满足量化交 ...

  5. python爬取指定歌曲的MV

    目标网站 音悦Tai:http://www.yinyuetai.com/ 爬取结果 根据指定的歌曲爬取十个相关的mv,存在列表里,十个mv对应十个字典,键为mv的名称,值为mv的数据. 当然也可以根据 ...

  6. python爬取指定时间,指定关键词的微博文本

    根据关键词爬取微博文本 首先导入所使用的库 from selenium import webdriver from lxml import html from urllib import parse ...

  7. 用python爬取指定数据流量是几点_使用python进行微信宜出行人流量数据爬取

    写在前面 由于宜出行的登录策略更新,导致无法使用qq登录直接爬取人流量的问题,近期进行了代码升级,已经解决了该问题,并且能顺利爬取数据,示例如下.目前暂不提供源代码,如有需要宜出行数据,可联系:917 ...

  8. 微博指定日期舆情数据爬虫获取—基于中文金融词典(python)

    最近在做一个微博舆情与金融市场分析的课题,需要爬取微博的舆情数据.因此需要根据关键词爬取指定日期的微博.现在代码写完了,实测还行,sleep设置得比较久,但爬取的数据很完整.硕士三年在CSDN学到了很 ...

  9. python爬虫搜特定内容的论文_python爬取指定微信公众号文章

    python怎么抓取微信阅清晨的阳光比不上你的一缕微笑那么动人,傍晚的彩霞比不上你的一声叹息那么心疼,你的一个个举动,一句句话语都给小编带来无尽的幸福. 抓取微信公众号的文章 一.思路分析 目前所知晓 ...

  10. python爬取贴吧所有帖子-python爬取贴吧帖子

    一.介绍 我们常遇到一些很长的贴吧连载帖子想存到本地再看 此文就是运用python爬取指定百度贴吧的帖子并存到本地满足需求 环境:python2.7 目标网页:[长篇连载]剑网3的正史和野史--从头开 ...

最新文章

  1. 小程序json字符串转 json对象 { name :你好} 转成 { name :你好}
  2. BFS之三(单向bfs和康托压缩)
  3. 一文读懂 Nginx
  4. 云信“欢乐颂活动”中奖名单
  5. 【暑假训练 7.10】 codevs 2492 上帝造题的七分钟2
  6. Beetlex官网迁移完成
  7. sessionStorage与clone方法在项目中的应用
  8. linux下-bash: ls: command not found
  9. linux下.so、.ko、.a的区别
  10. [Ext JS6]编码规范
  11. stm32寄存器版学习笔记04 定时计数器中断
  12. python爬取flash数据_爬取flash数据
  13. linux服务器上svn的log_Linux 下 SVN 常用操作命令详解
  14. 03、ADS使用记录之DC仿真控制器的使用
  15. 开关稳压集成电路电源
  16. gae java,适用于GAE的Java PDF库?
  17. 拔丝芋头的Java学习日记--Day4
  18. 手机邮件html样式,iPhone技巧篇 如何添加HTML风格邮件签名
  19. Photoshop基础学习目录
  20. 西邮Linux兴趣小组2017纳新免试题揭秘

热门文章

  1. codeforces_946D_Timetable(分组背包)
  2. vue-quill-editor超链接bug问题
  3. 产品需求文档(PRD)
  4. 乱序整数序列两数之和绝对值最小
  5. safari查看html代码,iPhone不越狱safari查看网页源代码方法
  6. justinmind破解方法
  7. IT大败局----第十章 企业公关的真谛
  8. 每天老听别人念叨“算法+数据结构=程序”,知道是谁说的么?一起走进Pascal语言之父——图灵奖得主尼古拉斯·沃斯
  9. wrapper.and的用法
  10. Borůvka算法学习小记