.net网站数据抓取
最新项目需要抓取人民币汇率中间价的数据,所以就写了个简单的爬虫抓取数据。抓取的网站为: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标签
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网站数据抓取的更多相关文章
- 倔强的网站数据抓取,关键时刻还需Webbrowser显身手
由于最近台风挺多,公司网站上需要挂上台风预报信息,就整了个抓取台风数据(至于抓数据的概念和实践手册我以前写的一篇博客里面有介绍:分享一套抓数据小程序,客户资料.实时新闻.股票数据…随心抓)的服务,做调 ...
- WebScraper for Mac(网站数据抓取软件) 4.10.2
WebScraper Mac版是一款Mac平台上通过使用将数据导出为JSON或CSV的简约应用程序,WebScraper Mac版可以快速提取与某个网页(包括文本内容)相关的信息.WebScraper ...
- java编写网站数据抓取
来公司已经俩月了,每天加班平均工时11个小时的我又想起了老东家温馨舒适安逸的生活.已经有好久没时间读博客写博客了,我觉得我退步了,嗯嗯,我很不开心 今天记录下抓数据的一些东西吧. 数据抓取现在是很普遍 ...
- 吴裕雄--天生自然python学习笔记:WEB数据抓取与分析
Web 数据抓取技术具有非常巨大的应用需求及价值, 用 Python 在网页上收集数据,不仅抓取数据的操作简单, 而且其数据分析功能也十分强大. 通过 Python 的时lib 组件中的 urlpar ...
- C# 从需要登录的网站上抓取数据
[转] C# 从需要登录的网站上抓取数据 背景:昨天一个学金融的同学让我帮她从一个网站上抓取数据,然后导出到excel,粗略看了下有1000+条记录,人工统计的话确实不可能.虽说不会,但作为一个学计算 ...
- Phantomjs+Nodejs+Mysql数据抓取(1.数据抓取)
概要: 这篇博文主要讲一下如何使用Phantomjs进行数据抓取,这里面抓的网站是太平洋电脑网估价的内容.主要是对电脑笔记本以及他们的属性进行抓取,然后在使用nodejs进行下载图片和插入数据库操作. ...
- R语言XML包的数据抓取
htmlParse 函数 htmlParse加抓HTML页面的函数. url1<-"http://www.caixin.com/"url<-htmlParse(url1 ...
- 数据抓取的艺术(一):Selenium+Phantomjs数据抓取环境配置
数据抓取的艺术(一):Selenium+Phantomjs数据抓取环境配置 2013-05-15 15:08:14 分类: Python/Ruby 数据抓取是一门艺术,和其他软件不同,世界上 ...
- python爬虫数据抓取方法汇总
概要:利用python进行web数据抓取方法和实现. 1.python进行网页数据抓取有两种方式:一种是直接依据url链接来拼接使用get方法得到内容,一种是构建post请求改变对应参数来获得web返 ...
随机推荐
- 中小学信息学奥林匹克竞赛-理论知识考点--ASCII
ASCII表说白了就是一张表. 表中记录着:字符 和 数字 的对应关系.比如:字符0对应的ASCII码是48,A对应的是65,a对应的是97. 只要记住这三个,其它的数字,大写,小写字母的ASCII码 ...
- 3.Mysql集群------Mycat分库分表
前言: 分库分表,在本节里是水平切分,就是多个数据库里包含的表是一模一样的. 只是把字段散列的分到不同的库中. 实践: 1.修改schema.xml 这里是在同一台服务器上建立了4个数据库db1,db ...
- LeetCode94. Binary Tree Inorder Traversal
题目 给定一个二叉树,返回它的中序 遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,3,2] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? 考点 stack ...
- Ubuntu 下安装GIMP
1.Add GIMP PPA Open terminal from Unity Dash, App launcher, or via Ctrl+Alt+T shortcut key. When it ...
- 使用CSS隐藏HTML元素的四种常用方法
CSS隐藏HTML元素的四种常用方法 1.opacity:设置opacity: 0可以使一个元素变得完全透明. 设置的透明度会被子元素继承,而且无法取消. 通常可以使用opacity属性来制作元素的淡 ...
- <Docker学习>4. docker容器的使用
简单的说, 容器是独立运行的一个或一组应用, 以及它们的运行态环境. 对应的, 虚拟机可以理解为模拟运行的一整套操作系统( 提供了运行态环境和其他系统环境) 和跑在上面的应用.容器的运行是基于镜像的. ...
- LeetCode summary
https://www.programcreek.com/2013/08/leetcode-problem-classification/ https://medium.com/algorithms- ...
- 牛客暑假多校第一场J-Different Integers
一.题目描述: 链接:https://www.nowcoder.com/acm/contest/139/JGiven a sequence of integers a1, a2, ..., an an ...
- 笔记-python-module-logging.循环日志、多进程日志
笔记-python-module-logging.循环日志.多进程日志 1. logging循环日志 循环日志分为按大小切分和按时间切分,对应实现类如下. 1.1. RotatingFil ...
- hdu1251统计难题(trie)
统计难题 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131070/65535 K (Java/Others)Total Submi ...