使用C#采集Shibor数据到Excel
对Shibor的变化一直以来比较关注,正好最近学习了对html数据处理的一些知识,就打算拿来采集一些我需要的Shibor数据。
使用到的库
HttpAgilityPack 一个非常不错的html解析工具库
NPOI 一个非常好的office文档生成和读取的库。
整个过程如下:
分析网页内容结构
Shibor的网站开发的比较早了,所以网页布局采用的大量的Table和iFrame,利用浏览器的F12工具,可以很方便的分析出来需要数据的位置。

从上面截图可以看出,我需要的数据区域是一个iFrame加载出来的,所以其实这个src的内容就是我要的,即/shibor/Shibor.do?date=2018-04-25,结合域名知道实际请求url是http://www.shibor.org/shibor/Shibor.do?date=2018-04-25 参数是日期,格式是yyyy-MM-dd,也就是说只需要构造这个参数,就可以得到不同日期的shibor数据了。
将这个新url输入到浏览器里查看

确实是我需要的内容。
下载和解析网页内容
下载该网页的内容就简单了,可以使用很多种方法,我这里直接使用了Http Agility Pack里的HttpWeb类里的Load方法。
涉及到的页面分析这里不罗嗦了,并不难理解,直接贴代码了。
public List<ShiborModel> Download(DateTime shiborDate)
{
string new_url = $"{url}{shiborDate.ToString("yyyy-MM-dd")}";
List<ShiborModel> shibors = new List<ShiborModel>();
try
{
var web = new HtmlWeb();
var doc = web.Load(new_url);
var results = doc.DocumentNode.SelectSingleNode("//table[@class='shiborquxian']");
foreach (var item in results.Descendants("tr"))
{
var tds = item.Descendants("td").ToList();
var name = tds[1].InnerText;
var shibor = tds[2].InnerText;
var bp = tds[4].InnerText;
shibors.Add(new ShiborModel
{
Name = name,
Shibor = double.Parse(shibor),
BP = double.Parse(bp)
});
}
}
catch (Exception)
{
Console.WriteLine($"处理{shiborDate.ToString("yyyyMMdd")}");
}
return shibors;
}
处理解析得到的数据
上面方法返回的是需要数据的集合,而我需要将这些数据输出为excel格式的文件,而.net输出excel的库也有很多,我使用的是国人自己基于openxmlsdk开发的NPOI库,很优秀的库,同样贴出处理的代码。
关于NPOI的使用,可以参考其他人写的文章。
public void BatchDownLoad(DateTime startDate, DateTime endDate)
{
try
{
XSSFWorkbook workbook2007 = new XSSFWorkbook();
workbook2007.CreateSheet("Shibor");
if (File.Exists(excel))
{
File.Delete(excel);
}
FileStream fs = new FileStream(excel, FileMode.CreateNew);
XSSFSheet sheet = (XSSFSheet)workbook2007.GetSheet("Shibor");
XSSFRow first_row = (XSSFRow)sheet.CreateRow(0);
((XSSFCell)first_row.CreateCell(0)).SetCellValue("日期");
((XSSFCell)first_row.CreateCell(1)).SetCellValue("O/N");
((XSSFCell)first_row.CreateCell(2)).SetCellValue("1W");
((XSSFCell)first_row.CreateCell(3)).SetCellValue("2W");
((XSSFCell)first_row.CreateCell(4)).SetCellValue("1M");
((XSSFCell)first_row.CreateCell(5)).SetCellValue("3M");
((XSSFCell)first_row.CreateCell(6)).SetCellValue("6M");
((XSSFCell)first_row.CreateCell(7)).SetCellValue("9M");
((XSSFCell)first_row.CreateCell(8)).SetCellValue("1Y");
var dataformat = workbook2007.CreateDataFormat();
var style = workbook2007.CreateCellStyle();
style.DataFormat = dataformat.GetFormat("yyyy-MM-dd");
int rowNumber = 1;
DateTime currentDate = startDate;
while (currentDate < endDate)
{
var shibors = Download(currentDate);
if (shibors.Count == 0)
continue;
XSSFRow temp_row = (XSSFRow)sheet.CreateRow(rowNumber);
((XSSFCell)temp_row.CreateCell(0)).SetCellValue(currentDate.Date);
temp_row.GetCell(0).CellStyle = style;
((XSSFCell)temp_row.CreateCell(1)).SetCellValue(shibors[0].Shibor);
((XSSFCell)temp_row.CreateCell(2)).SetCellValue(shibors[1].Shibor);
((XSSFCell)temp_row.CreateCell(3)).SetCellValue(shibors[2].Shibor);
((XSSFCell)temp_row.CreateCell(4)).SetCellValue(shibors[3].Shibor);
((XSSFCell)temp_row.CreateCell(5)).SetCellValue(shibors[4].Shibor);
((XSSFCell)temp_row.CreateCell(6)).SetCellValue(shibors[5].Shibor);
((XSSFCell)temp_row.CreateCell(7)).SetCellValue(shibors[6].Shibor);
((XSSFCell)temp_row.CreateCell(8)).SetCellValue(shibors[7].Shibor);
Console.WriteLine($"{currentDate.Date}处理OK");
currentDate = currentDate.AddDays(1);
rowNumber++;
}
workbook2007.Write(fs);
fs.Close();
workbook2007.Close();
}
catch (Exception)
{
throw;
}
}
得到结果

图形不是程序生成的,是我用excel的图表功能附加上去的。
因为不是正式项目,所以没有考虑太多开发的规范性,代码只是要求能运行出结果即可。
使用C#采集Shibor数据到Excel的更多相关文章
- C#+HtmlAgilityPack+XPath带你采集数据(以采集天气数据为例子)
第一次接触HtmlAgilityPack是在5年前,一些意外,让我从技术部门临时调到销售部门,负责建立一些流程和寻找潜在客户,最后在阿里巴巴找到了很多客户信息,非常全面,刚开始是手动复制到Excel, ...
- 使用POI导出百万级数据到excel的解决方案
1.HSSFWorkbook 和SXSSFWorkbook区别 HSSFWorkbook:是操作Excel2003以前(包括2003)的版本,扩展名是.xls,一张表最大支持65536行数据,256列 ...
- ASP.NET MVC5下载数据到Excel文件
项目中的一个功能是将数据导入到Excel文件中,这里使用NPOI操作Excel,代码如下: public class Excel : IDataTransfer { public Stream Exp ...
- 1.ASP.NET MVC使用EPPlus,导出数据到Excel中
好久没写博客了,今天特地来更新一下,今天我们要学习的是如何导出数据到Excel文件中,这里我使用的是免费开源的Epplus组件. 源代码下载:https://github.com/caofangshe ...
- 导出数据到Excel --使用ExcelReport有感
先看图,这是几个月前用NPOI写的导出数据到Excel,用了上百行代码,而且难控制,导出来也比较难看 excel打开的效果 下面是我用ExcelReport类库导出到Excel的操作 1.首先引用Ex ...
- 将Oracle数据库中的数据写入Excel
将Oracle数据库中的数据写入Excel 1.准备工作 Oracle数据库"TBYZB_FIELD_PRESSURE"表中数据如图: Excel模板(201512.xls): 2 ...
- [Asp.net]常见数据导入Excel,Excel数据导入数据库解决方案,总有一款适合你!
引言 项目中常用到将数据导入Excel,将Excel中的数据导入数据库的功能,曾经也查找过相关的内容,将曾经用过的方案总结一下. 方案一 NPOI NPOI 是 POI 项目的 .NET 版本.POI ...
- 使用Open xml 操作Excel系列之二--从data table导出数据到Excel
由于Excel中提供了透视表PivotTable,许多项目都使用它来作为数据分析报表. 在有些情况下,我们需要在Excel中设计好模板,包括数据源表,透视表等, 当数据导入到数据源表时,自动更新透视表 ...
- Dynamics CRM导出数据到Excel
原创地址:http://www.cnblogs.com/jfzhu/p/4276212.html 转载请注明出处 Pivot Table是微软BI的一个重要工具,所以这里讲一下Dynamics CRM ...
随机推荐
- 【bzoj 4589】Hard Nim
题目 根据我为数不多的博弈知识我发现需要求多少种方案使得异或和为\(0\) 非常显然就是构造出那个质数多项式\(F\),答案就是\(F^n(0)\),当然这里是异或卷积 于是美滋滋的敲上去一个多项式快 ...
- chrome的uget扩展程序红色 Unable to connect with uget-integrator问题
我们根据网上的教程在ubuntu16.04中安装下载工具uget+aria2并配置chrome时,最后重新打开chrome浏览器,发现uget扩展程序是红色的,点开看到”Unable to conne ...
- Hive学习之路 (十七)Hive分析窗口函数(五) GROUPING SETS、GROUPING__ID、CUBE和ROLLUP
概述 GROUPING SETS,GROUPING__ID,CUBE,ROLLUP 这几个分析函数通常用于OLAP中,不能累加,而且需要根据不同维度上钻和下钻的指标统计,比如,分小时.天.月的UV数. ...
- Spring源码分析(九)解析默认标签中的自定义标签元素
摘要:本文结合<Spring源码深度解析>来分析Spring 5.0.6版本的源代码.若有描述错误之处,欢迎指正. 到这里我们已经完成了分析默认标签的解析与提取过程,或许涉及的内容太多,我 ...
- C语言程序设计I—第六周教学
第六周教学总结(8/10-14/10) 教学内容 第二章 用C语言编写程序 2.4 输出华氏-摄氏温度转换表 课前准备 在蓝墨云班课发布资源: PTA:2018秋第六周作业 分享码:88C28D89E ...
- 简单部署iRedMail-0.9.8 - 邮件服务器架构和错误代码
1.去官网下载最新稳定版软件 https://www.iredmail.com/index.html 2.https://docs.iredmail.org/install.iredmail.on.r ...
- 【绝密】为什么现在的CAN收发器通信距离越来越短?
[绝密]为什么现在的CAN收发器通信距离越来越短? CAN收发器的改良和隔离器件引入,大大提高了通信的可靠性,但同时也引入了额外的延时,导致通信距离变短,或总线错误帧增加,本文以1Mbps波特率下 ...
- 【git2】git+码云+webStrom
在[git1]中介绍了Git的安装.webstrom配置Git和GitHub.GitHub项目上传下载的方法. 这篇将一下在[git1]步骤(一)基础上webstorm配置码云 实现项目的上传下载. ...
- 文本处理三剑客之 grep/egrep
grep:文本过滤工具 支持BRE egrep: 支持ERE fgrep: 不支持正则 作用:根据用户指定的“模式”,对目标文本逐行进行匹配检查,打印匹配到的行 模式:由正则表达式字符及文本字符所编写 ...
- jQuery----获取兄弟元素的方法
① $(this).next(): 获取的是当前元素的下一个兄弟元素 ②$(this).nextAll(); 获取的是当前元素的后面的所有的兄弟元素 ③$(this).pre ...