最新项目需要抓取人民币汇率中间价的数据,所以就写了个简单的爬虫抓取数据。抓取的网站为:http://www.safe.gov.cn/wps/portal/sy/tjsj_hlzjj_inquire

#region 执行数据抓取(人民币汇率中间价)
/// <summary>
/// 执行数据抓取(人民币汇率中间价)
/// </summary>
public void CaptureData()
{
isExecuting = true;
StringBuilder msg = new StringBuilder();
msg.AppendFormat("执行时间:{0}\r\n", DateTime.Now);
msg.Append("开始抓取人民币汇率中间价...\r\n\r\n");
SetLogging(msg.ToString()); var db = new dbContext();
var trans = db.Database.BeginTransaction();
string title = "";
DateTime dt = DateTime.Now;
if (executeType == "true")
{
title += dt.ToString("yyyy-MM-dd") + "的数据抓取";
}
else
{
title += "时间范围为:开始时间为" + startTime + ",结束时间为" + endTime + "的数据抓取";
} try
{
string url = "";
string basePath = "http://www.safe.gov.cn/AppStructured/view/project_RMBQuery.action";
if(executeType == "true")
{
var date = DateTime.Now.ToString("yyyy-MM-dd");
url = basePath + "?projectBean.startDate=" + date + "&projectBean.endDate=" + date + "&queryYN=true";
}
else
{
url = basePath + "?projectBean.startDate=" + startTime + "&projectBean.endDate=" + endTime + "&queryYN=true";
} //string url = "http://www.safe.gov.cn/AppStructured/view/project_RMBQuery.action?projectBean.startDate=2017-03-15&projectBean.endDate=2017-03-15&queryYN=true";
//发送请求
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
request.Method = "GET";
request.ProtocolVersion = HttpVersion.Version11;
request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36";
request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8";
request.Timeout = ;
request.Headers.Add("Accept-Encoding", "gzip, deflate");
request.Headers.Add("Accept-Language", "zh-CN,zh;q=0.8");
request.Headers.Add("Accept-Charset", "GBK,utf-8;q=0.7,*;q=0.3");
request.CookieContainer = new CookieContainer();
//接收请求
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream stream = response.GetResponseStream();
string resultStr = ""; //返回字符串,若翻译失败则返回空字符串
using (StreamReader reader = new StreamReader(stream, Encoding.GetEncoding("utf-8")))
{
//开始解释结果
string result = reader.ReadToEnd();
if(!string.IsNullOrEmpty(result))
{
result = result.Replace("\n",""); //过滤\n转换为空
result = result.Replace("\r", ""); //过滤\r转换为空
result = result.Replace("\t", ""); //过滤\t转换为空
result = result.Replace("\\", ""); //过滤\转换为空
result = Regex.Replace(result, @"<!--(?s).*?-->", "", RegexOptions.IgnoreCase); //过滤注释
result = result.Replace("&nbsp;", ""); //过滤nbsp标签
string tableHtml = Regex.Match(result, "<table class=\"list\" id=\"InfoTable\".*>.*</table>").ToString();
MatchCollection trHtmls = Regex.Matches(tableHtml, "<tr class=\"first\".*?>(.*?)</tr>");
foreach (Match tr in trHtmls)
{
#region 插入一条信息
Regex reg2 = new Regex("<td.*?>(.*?)</td>");
MatchCollection mc2 = reg2.Matches(tr.Value);
List<string> dataList = new List<string>(); Match[] marr = mc2.OfType<Match>().ToArray();
for(int i=;i<marr.Length;i++)
{
var value = marr[i].Groups[].Value;
dataList.Add(value);
} var dateTime = Convert.ToDateTime(dataList[]);
var item = db.RMB_EXCHANGERATE.Where(p => p.TIME == dateTime).FirstOrDefault();
if(item == null)
{
RMB_EXCHANGERATE obj = new RMB_EXCHANGERATE();
obj.ID = Guid.NewGuid().ToString();
obj.TIME = Convert.ToDateTime(dataList[]);
obj.USD = Convert.ToDecimal(dataList[]);
obj.EUR = Convert.ToDecimal(dataList[]);
obj.JPY = Convert.ToDecimal(dataList[]);
obj.HKD = Convert.ToDecimal(dataList[]);
obj.GBP = Convert.ToDecimal(dataList[]);
obj.MYR = Convert.ToDecimal(dataList[]);
obj.SUR = Convert.ToDecimal(dataList[]);
obj.ZAR = Convert.ToDecimal(dataList[]);
obj.KRW = Convert.ToDecimal(dataList[]);
obj.AED = Convert.ToDecimal(dataList[]);
obj.SR = Convert.ToDecimal(dataList[]);
obj.HUF = Convert.ToDecimal(dataList[]);
obj.PLN = Convert.ToDecimal(dataList[]);
obj.DKK = Convert.ToDecimal(dataList[]);
obj.SEK = Convert.ToDecimal(dataList[]);
obj.NOK = Convert.ToDecimal(dataList[]);
obj.ITL = Convert.ToDecimal(dataList[]);
obj.PHP = Convert.ToDecimal(dataList[]);
obj.AUD = Convert.ToDecimal(dataList[]);
obj.CAD = Convert.ToDecimal(dataList[]);
obj.NZD = Convert.ToDecimal(dataList[]);
obj.SGD = Convert.ToDecimal(dataList[]);
obj.CHF = Convert.ToDecimal(dataList[]);
obj.CREATETIME = DateTime.Now;
db.RMB_EXCHANGERATE.Add(obj);
}
#endregion
} db.SaveChanges();
trans.Commit(); StringBuilder msg2 = new StringBuilder();
msg2.AppendFormat("执行时间:{0}\r\n", DateTime.Now);
msg2.AppendFormat("{0}成功\r\n\r\n",title);
SetLogging(msg2.ToString());
}
else
{
StringBuilder msg2 = new StringBuilder();
msg2.AppendFormat("执行时间:{0}\r\n", DateTime.Now);
msg2.AppendFormat("{0}为空\r\n\r\n\r\n",title);
SetLogging(msg2.ToString());
}
} isExecuting = false; //无论执行成功还是失败,完成后都要恢复状态
}
catch (Exception ex)
{
trans.Rollback();
var message = logTemplate2(ex, title+"失败");
SetLogging(message);
if (ex.Message == "请求超时")
{
//循环抓取
CaptureData();
} isExecuting = false; //无论执行成功还是失败,完成后都要恢复状态
}
}
#endregion

.net网站数据抓取的更多相关文章

  1. 倔强的网站数据抓取,关键时刻还需Webbrowser显身手

    由于最近台风挺多,公司网站上需要挂上台风预报信息,就整了个抓取台风数据(至于抓数据的概念和实践手册我以前写的一篇博客里面有介绍:分享一套抓数据小程序,客户资料.实时新闻.股票数据…随心抓)的服务,做调 ...

  2. WebScraper for Mac(网站数据抓取软件) 4.10.2

    WebScraper Mac版是一款Mac平台上通过使用将数据导出为JSON或CSV的简约应用程序,WebScraper Mac版可以快速提取与某个网页(包括文本内容)相关的信息.WebScraper ...

  3. java编写网站数据抓取

    来公司已经俩月了,每天加班平均工时11个小时的我又想起了老东家温馨舒适安逸的生活.已经有好久没时间读博客写博客了,我觉得我退步了,嗯嗯,我很不开心 今天记录下抓数据的一些东西吧. 数据抓取现在是很普遍 ...

  4. 吴裕雄--天生自然python学习笔记:WEB数据抓取与分析

    Web 数据抓取技术具有非常巨大的应用需求及价值, 用 Python 在网页上收集数据,不仅抓取数据的操作简单, 而且其数据分析功能也十分强大. 通过 Python 的时lib 组件中的 urlpar ...

  5. C# 从需要登录的网站上抓取数据

    [转] C# 从需要登录的网站上抓取数据 背景:昨天一个学金融的同学让我帮她从一个网站上抓取数据,然后导出到excel,粗略看了下有1000+条记录,人工统计的话确实不可能.虽说不会,但作为一个学计算 ...

  6. Phantomjs+Nodejs+Mysql数据抓取(1.数据抓取)

    概要: 这篇博文主要讲一下如何使用Phantomjs进行数据抓取,这里面抓的网站是太平洋电脑网估价的内容.主要是对电脑笔记本以及他们的属性进行抓取,然后在使用nodejs进行下载图片和插入数据库操作. ...

  7. R语言XML包的数据抓取

    htmlParse 函数 htmlParse加抓HTML页面的函数. url1<-"http://www.caixin.com/"url<-htmlParse(url1 ...

  8. 数据抓取的艺术(一):Selenium+Phantomjs数据抓取环境配置

     数据抓取的艺术(一):Selenium+Phantomjs数据抓取环境配置 2013-05-15 15:08:14 分类: Python/Ruby     数据抓取是一门艺术,和其他软件不同,世界上 ...

  9. python爬虫数据抓取方法汇总

    概要:利用python进行web数据抓取方法和实现. 1.python进行网页数据抓取有两种方式:一种是直接依据url链接来拼接使用get方法得到内容,一种是构建post请求改变对应参数来获得web返 ...

随机推荐

  1. JAVAWEB开发中过滤器的概述及使用

    1.什么是过滤器? 过滤器是向WEB应用程序的请求和响应添加功能的WEB服务组件 2.过滤器的作用 1)可以统一的集中处理请求和响应 2)可以实现对请求数据的过滤 3.过滤器的工作方式 4.使用场合 ...

  2. java基础 final 修饰成员变量 只能赋值一次问题

    final int a; public Fu(){ a=1; }

  3. 可复用 React 的 HOC 以及的 Render Props

    重复是不可能的,这辈子都不可能写重复的代码 当然,这句话分分钟都要被产品(领导)打脸,真的最后一次改需求,我们烦恼于频繁修改的需求 虽然我们不能改变别人,但我们却可以尝试去做的更好,我们需要抽象,封装 ...

  4. django+xadmin在线教育平台(十三)

    这个6-8对应对应6-11,6-12 拷入forgetpassword页面 书写处理忘记密码的view users/views.py # 用户忘记密码的处理view class ForgetPwdVi ...

  5. Go单元测试与基准测试

    Go单元测试 Go单元测试框架,遵循规则整理如下: 1.文件命名规则: 含有单元测试代码的go文件必须以_test.go结尾,Go语言测试工具只认符合这个规则的文件 单元测试文件名_test.go前面 ...

  6. 将 cmd 中命令输出内容保存为 TXT 文本文件

    如果执行的命令输出内容较多,那么 cmd 控制台将会自动清除前面的内容,那么如何将屏幕的所有内容导出到文本文件? 下面给出简单的演示例子 ping百度,不会自动结束,按 Ctrl+C 强制结束,pin ...

  7. windows系统下用VScode配置远程编辑服务器文件的环境!通过Rmate方法

    虽然公司电脑win可以通过Xshell通过SSH远程连接家中内网linux服务器了,但是只能用vim编辑文件有点不爽. 于是上网查询,windows下使用vscode远程编辑服务器文件的办法.参照博文 ...

  8. Fruits【水果】

    Fruits Many of us love July because it's the month when nature's berries and stone fruits are in abu ...

  9. A Country on Wheels【车轮上的国家】

    A Country on Wheels As cultural symbols go, the American  car is quite young. 作为文化象征的美国汽车还相当年轻. The ...

  10. 在ddms 里面查看data/data里面的东西 不显示data/data

    今天我要查看data/anr/tarces.txt,没办法,我只有root手机. 可是root之后,我发现还是不能查看或者导出traces.txt. 后来我才知道,root之后,文件夹权限没有变,所以 ...