Python抓取中国银行外汇牌价并生成折线图实战

南乔
南乔
发布时间:2026-10-14 | 5人浏览过
原创

本文详解如何使用Python的requests、BeautifulSoup和xlwings库,从中国银行外汇牌价官网抓取实时数据。通过解析HTML表格提取关键信息,利用xlwings将数据写入Excel,并自动生成包含货币对价格的折线图,实现数据抓取、存储与可视化的完整流程。

Python抓取中国银行外汇牌价并生成折线图实战

本文介绍如何利用requests、BeautifulSoup以及xlwings这三个Python库,完成对中国银行外汇牌价首页数据的抓取任务。

具体实现步骤如下:首先使用requests和BeautifulSoup获取网页内容,接着通过xlwings将提取的数据写入Excel文件,最后基于这些数据生成相应的图表。

第一步是确定目标网址,即中国银行外汇牌价的官方展示页面。

目标URL为:https://www.bankofrochina.com/sourcedb/whpj/

访问目标网址与获取响应

接下来,调用requests模块中的get方法访问上述网址,从而获取HTTP Response对象。


url = "https://www.bankofchina.com/sourcedb/whpj/"
web=re.get(url)

解析网页与提取表格数据

获取响应后,使用BeautifulSoup类对网页内容进行解析,以便后续提取结构化数据。


#BeautifulSoup将字节流转换为utf-8编码
bs_obj=BeautifulSoup(web.text,'lxml')

在解析后的DOM树中,利用find_all方法查找包含数据的table、tr以及td等HTML标签对象。

代码注释说明:查找数据所在的表格区域。


table=bs_obj.find_all('table')[1]
all_th=all_tr.find_all('th')
#print(all_th)
all_td=all_tr.find_all('td')
#print(all_td)

随后,将找到的相应标签内的文本内容依次提取并添加到数据列表中。


if len(all_th)>0:
        dataRow=[]
        for item in all_th:
            dataRow.append(item.text)
        dataAll.extend([dataRow])
    if len(all_td)>0:
        dataRow=[]
        for item in all_td:
            dataRow.append(item.text)
        dataAll.extend([dataRow])

数据写入Excel与生成图表

使用xlwings库,将之前收集好的列表数据写入到Excel文件中,以便进行本地存储或进一步分析。


wb=xw.Book()
sht=wb.sheets('Sheet1')
sht.range('a1').value=dataAll#将数据添加到表格中

利用写入Excel后的这部分数据,进一步构建折线图以直观展示汇率变化趋势。


chart=sht.charts.add(500,50,700,400)
chart.set_source_data(sht.range('A1:A28,C1:C28,E1:E28'))#设置数据画图
chart.chart_type='line_markers'

chart.name='line_markersd'
#chart.api[1].ChartTitle.Text='中国银行外汇牌价'

完整代码实现如下:


import requests as re
from bs4 import BeautifulSoup
import xlwings as xw
url = "https://www.bankofchina.com/sourcedb/whpj/"
web=re.get(url)
web.encoding=web.apparent_encoding
#BeautifulSoup将字节流转换为utf-8编码
bs_obj=BeautifulSoup(web.text,'lxml')
#查找数据所在表格
table=bs_obj.find_all('table')[1]
#print(table)
dataAll=[]
for all_tr in table.find_all('tr'):#找到所有tr,返回一个列表
    all_th=all_tr.find_all('th')
    #print(all_th)
    all_td=all_tr.find_all('td')
    #print(all_td)
    if len(all_th)>0:
        dataRow=[]
        for item in all_th:
            dataRow.append(item.text)
        dataAll.extend([dataRow])
    if len(all_td)>0:
        dataRow=[]
        for item in all_td:
            dataRow.append(item.text)
        dataAll.extend([dataRow])
wb=xw.Book()
sht=wb.sheets('Sheet1')
sht.range('a1').value=dataAll#将数据添加到表格中
chart=sht.charts.add(500,50,700,400)
chart.set_source_data(sht.range('A1:A28,C1:C28,E1:E28'))#设置数据画图
chart.chart_type='line_markers'
chart.name='line_markersd'
#chart.api[1].ChartTitle.Text='中国银行外汇牌价'

以上即为使用Python抓取中国银行外汇牌价首页数据的完整实现过程。如需了解更多关于Python抓取外汇牌价的资料,建议关注本站发布的其他相关文章。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表