对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的更多相关文章

  1. C#+HtmlAgilityPack+XPath带你采集数据(以采集天气数据为例子)

    第一次接触HtmlAgilityPack是在5年前,一些意外,让我从技术部门临时调到销售部门,负责建立一些流程和寻找潜在客户,最后在阿里巴巴找到了很多客户信息,非常全面,刚开始是手动复制到Excel, ...

  2. 使用POI导出百万级数据到excel的解决方案

    1.HSSFWorkbook 和SXSSFWorkbook区别 HSSFWorkbook:是操作Excel2003以前(包括2003)的版本,扩展名是.xls,一张表最大支持65536行数据,256列 ...

  3. ASP.NET MVC5下载数据到Excel文件

    项目中的一个功能是将数据导入到Excel文件中,这里使用NPOI操作Excel,代码如下: public class Excel : IDataTransfer { public Stream Exp ...

  4. 1.ASP.NET MVC使用EPPlus,导出数据到Excel中

    好久没写博客了,今天特地来更新一下,今天我们要学习的是如何导出数据到Excel文件中,这里我使用的是免费开源的Epplus组件. 源代码下载:https://github.com/caofangshe ...

  5. 导出数据到Excel --使用ExcelReport有感

    先看图,这是几个月前用NPOI写的导出数据到Excel,用了上百行代码,而且难控制,导出来也比较难看 excel打开的效果 下面是我用ExcelReport类库导出到Excel的操作 1.首先引用Ex ...

  6. 将Oracle数据库中的数据写入Excel

    将Oracle数据库中的数据写入Excel 1.准备工作 Oracle数据库"TBYZB_FIELD_PRESSURE"表中数据如图: Excel模板(201512.xls): 2 ...

  7. [Asp.net]常见数据导入Excel,Excel数据导入数据库解决方案,总有一款适合你!

    引言 项目中常用到将数据导入Excel,将Excel中的数据导入数据库的功能,曾经也查找过相关的内容,将曾经用过的方案总结一下. 方案一 NPOI NPOI 是 POI 项目的 .NET 版本.POI ...

  8. 使用Open xml 操作Excel系列之二--从data table导出数据到Excel

    由于Excel中提供了透视表PivotTable,许多项目都使用它来作为数据分析报表. 在有些情况下,我们需要在Excel中设计好模板,包括数据源表,透视表等, 当数据导入到数据源表时,自动更新透视表 ...

  9. Dynamics CRM导出数据到Excel

    原创地址:http://www.cnblogs.com/jfzhu/p/4276212.html 转载请注明出处 Pivot Table是微软BI的一个重要工具,所以这里讲一下Dynamics CRM ...

随机推荐

  1. 1059. [ZJOI2007]矩阵游戏【二分图】

    Description 小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏——矩阵游戏.矩阵游戏在一个N *N黑白方阵进行(如同国际象棋一般,只是颜色是随意的).每次可以对该矩阵进行 ...

  2. virtualbox+vagrant学习-3-Vagrant Share-5-Security

    Security 可以理解,分享你vagrant环境引发了一些安全问题. vagrant share的主要安全机制是通过隐藏的安全性以及SSH的加密密钥.此外,还有几个配置选项可用来帮助控制访问和管理 ...

  3. head头的设计:rfcn light-head rfcn

    faster缺点:1.不是全卷积,roi出来后是两个fc层,这样会丧失平移变性.   2.每个roi都要单独经过两个fc层,也就是分别进行分类和回归,耗时 也有种说法是roi-pooling后导致平移 ...

  4. Kafka设计解析(六)Kafka高性能架构之道

    转载自 技术世界,原文链接 Kafka设计解析(六)- Kafka高性能架构之道 本文从宏观架构层面和微观实现层面分析了Kafka如何实现高性能.包含Kafka如何利用Partition实现并行处理和 ...

  5. caffe 安装记录

    为了使用caffe,特地装了linux系统,版本:Ubuntu14.04 X64 可参照 http://www.cnblogs.com/platero/p/3993877.html 这个博客写的更好h ...

  6. C#反射使用时注意BindingFlags的用法(转载)

    最近刚刚开始用反射做项目,遇到一个小的知识点,记录一下. c#反射查找方法时,默认只能查到public方法.如果想要查找private方法,需要设定BindingFlags.    即: Bindin ...

  7. 【CSS3】特殊的属性归纳(一)

    CSS3手册地址速查表 -webkit- 最终要用兼容性写法 (一)-webkit-tap-highlight-color    (mobile移动设备私有属性) 案列: 问题:遇到a链接和butto ...

  8. KVM虚拟机IO处理过程(二) ----QEMU/KVM I/O 处理过程

    接着KVM虚拟机IO处理过程中Guest Vm IO处理过程(http://blog.csdn.net/dashulu/article/details/16820281),本篇文章主要描述IO从gue ...

  9. 【js】走近小程序

    一.什么是小程序? 基于微信的可以为用户提供一些服务的web项目,利用微信提供的接口可以让所有开发者使用到微信的原生能力,去完成一些之前做不到或者难以做到的事情. 二.小程序开发工具以及语言? 小程序 ...

  10. PHP操作xml学习笔记之增删改查(1)—增加

    xml文件 <?xml version="1.0" encoding="utf-8"?><班级>    <学生>       ...