使用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 ...
随机推荐
- Golang包管理工具glide简介
Golang包管理工具glide简介 前言 Golang是一个十分有趣,简洁而有力的开发语言,用来开发并发/并行程序是一件很愉快的事情.在这里我感受到了其中一些好处: 没有少了许多代码格式风格的争论, ...
- 最易懂的layui分页
该篇文章是在layui前端框架之分页基础上简洁化和详细化. 首先该示例采用的是Spring+MyBatis Plus+SpringMVC(常规的SSM框架),持久层换成MyBatis也行. 至于lay ...
- Bootloader的结构和启动过程
CPU上电后,会在某个地址开始执行,比如MIPS结构的CPU会从0xBFC00000取第一条指令,而ARM结构的CPU则从0x00000000开始,嵌入式开发板中,需要把存储器件ROM或Flash等映 ...
- 根据location地址,在导航栏高亮显示当前页面
获取当前页面的地址栏.与导航栏中所有<a> 标签的href属性 进行比较.如果相等则高亮显示 此<a>标签. 注意点:a 标签的href 属性在浏览器解析时 是绝对路径. a ...
- Mongodb基础知识笔记
MongoDB介绍 MongoDB是一个基于分布式文件存储的开源文档数据库.由C++语言编写.旨在为WEB应用提供高性能.高可用性和高伸缩数据存储解决方案. MongoDB优点 MongoDB使用场景 ...
- Linux 和 ubuntu安装redis
Linux 下安装reids 下载地址:http://redis.io/download,下载最新稳定版本. 本教程使用的最新文档版本为 2.8.17,下载并安装: $ wget http://dow ...
- 【数据结构与算法】001—栈与队列(Python)
栈与队列 1.栈(stacks)是一种只能通过访问其一端来实现数据存储与检索的线性数据结构,具有后进先出(last in first out,LIFO)的特征 2.队列(queue)是一种具有先进先出 ...
- Scala模式匹配常用
今天在工作中遇到的几个小问题,总结一下: 1.因为业务需要调用PHP的接口,获取到的返回体需要做一段逻辑处理,然而某个字段接收到的参数是io.serializable类型,字段的类型不是预期的stri ...
- 【转】使用nginx搭建高可用,高并发的wcf集群
原文:http://www.cnblogs.com/huangxincheng/p/7707830.html 很多情况下基于wcf的复杂均衡都首选zookeeper,这样可以拥有更好的控制粒度,但zk ...
- JS获取对象“属性”的方法
var testObj= new Object(); testObj.name = "shangguan"; testObj.age= ; testObj.action = fun ...