效果

描述:此功能是抓取外国的一个检测PM2.5的网站。实时读取网站的数据,然后保存到数据库里面。每隔一小时刷新一次。

地址为:http://beijing.usembassy-china.org.cn/070109air.html

筛选后的地址为:http://utils.usembassy.gov/feed2js/feed2js.php?src=http%3A%2F%2Fwww.stateair.net%2Fweb%2Frss%2F1%2F1.xml&desc=1&num=7&targ=y&utf=y&pc=y&words=40&

思路:先抓取到页面的所有数据,保存到txt里面,再一行一行的读取txt,然后用split,substring截取到自己想要的数据,最后保存到数据库,在进行插入数据库的时候查看一下是否已经存在,如果不存在则插入。

代码

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.IO;
//using System.Linq;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
//using System.Threading.Tasks; /********************************
* 创建人:青苹果
* 创建时间:2015-12-28
* 描述:获取美利坚合众国的 PM2.5
* ******************************/ namespace GetUSAData
{
class Program
{
//public static string GetURL = System.Configuration.ConfigurationSettings.AppSettings["GetURL"];//获取数据的地址
public static string GetURL = "http://utils.usembassy.gov/feed2js/feed2js.php?src=http%3A%2F%2Fwww.stateair.net%2Fweb%2Frss%2F1%2F1.xml&desc=1&num=7&targ=y&utf=y&pc=y&words=40&";
public static string txtURL = System.Configuration.ConfigurationSettings.AppSettings["txtURL"];//保存为txt文件的路径
public static string conn = ConfigurationManager.ConnectionStrings["ConnectionString"].ToString(); static void Main(string[] args)
{ LoadGO();
} public static void LoadGO()
{
GetUSA();
List<string[]> getlist = Read(txtURL);
//删除txt
if (File.Exists(txtURL))
{
//如果存在则删除
File.Delete(txtURL);
}
if (getlist.Count > )
{
for (int i = getlist.Count-; i >-; i--)
{
DateTime dtime = DateTime.Parse(getlist[i][].ToString());
string getTime = dtime.ToString("yyyy-MM-dd HH:mm");
string controlTime = dtime.ToString("yyyy-MM-dd");
float LatestHourdata1 = float.Parse(getlist[i][]);
int LatestHourdata2 = Convert.ToInt32(getlist[i][]);
float Avgdata1 = ;
int Avgdata2 = ;
string Avgdata3 = getlist[i][].ToString(); List<SqlParameter> listWhere = new List<SqlParameter>();
listWhere.Add(new SqlParameter("@strDatetime", controlTime));
string sqlSelect = @"SELECT count(*) as allcount,sum(LatestHourdata1) as LatestHourdata1_avg, sum(LatestHourdata2) as LatestHourdata2_avg
FROM T_twitter where ([LatestHourdata1] is not null
or [LatestHourdata2] is not null or [Avgdata1] is not null
or [AvgData2] is not null) and CONVERT(varchar(100), [datetime], 23)=@strDatetime"; DataTable sumDT = ControlDB(sqlSelect, listWhere, "select"); //查询总和用于计算日均值
if (sumDT.Rows.Count > )
{
foreach (DataRow itemDR in sumDT.Rows)
{
int allcount = Convert.ToInt32(itemDR["allcount"].ToString()); //数据库中当前日期数量总和
if (allcount > )
{
if (itemDR["LatestHourdata1_avg"] != null)
{
Avgdata1 = float.Parse(itemDR["LatestHourdata1_avg"].ToString()); //数据库中LatestHourdata1_avg总和
Avgdata1 = (Avgdata1 + LatestHourdata1) / (allcount + );//(数据库的总和+最新的一条)/(数据库的总和数量+1)=日平均值
}
if (itemDR["LatestHourdata2_avg"] != null)
{
Avgdata2 = Convert.ToInt32(itemDR["LatestHourdata2_avg"].ToString()); //数据库中LatestHourdata2_avg总和
Avgdata2 = (Avgdata2 + LatestHourdata2) / (allcount + );//(数据库的总和+最新的一条)/(数据库的总和数量+1)=日平均值
}
//根据网站规则判断PM2.5的平均严重性 if (Avgdata2 >= && Avgdata2 <= )
{
Avgdata3 = " Good (at 24-hour exposure at this level)";
}
else if (Avgdata2 >= && Avgdata2 <= )
{
Avgdata3 = " Moderate (at 24-hour exposure at this level)";
}
else if (Avgdata2 >= && Avgdata2 <= )
{
Avgdata3 = " Unhealthy for Sensitive Groups (at 24-hour exposure at this level)";
}
else if (Avgdata2 >= && Avgdata2 <= )
{
Avgdata3 = " Unhealthy (at 24-hour exposure at this level)";
}
else if (Avgdata2 >= && Avgdata2 <= )
{
Avgdata3 = " Very Unhealthy (at 24-hour exposure at this level)";
}
else
{
Avgdata3 = " Hazardous (at 24-hour exposure at this level)";
}
}
else
{
Avgdata1 = LatestHourdata1;
Avgdata2 = LatestHourdata2;
}
}
} List<SqlParameter> pars = new List<SqlParameter>();
pars.Add(new SqlParameter("@whereDatetime", getTime));
pars.Add(new SqlParameter("@datetime", getTime));
pars.Add(new SqlParameter("@LatestHourdata1", LatestHourdata1));
pars.Add(new SqlParameter("@LatestHourdata2", LatestHourdata2));
pars.Add(new SqlParameter("@LatestHourdata3", getlist[i][].ToString()));
pars.Add(new SqlParameter("@Avgdata1", Avgdata1));
pars.Add(new SqlParameter("@Avgdata2", Avgdata2));
pars.Add(new SqlParameter("@Avgdata3", Avgdata3)); string sql = @"if not exists(select * from dbo.T_twitter where datetime=@whereDatetime) begin
insert T_twitter (datetime,LatestHourdata1,LatestHourdata2,LatestHourdata3,Avgdata1,AvgData2,AvgData3)
VALUES(@datetime,@LatestHourdata1,@LatestHourdata2,@LatestHourdata3,@Avgdata1,@Avgdata2,@Avgdata3) end";
ControlDB(sql, pars, "");//插入数据
}
}
} /// <summary>
/// 获取页面数据保存至txt
/// </summary>
public static void GetUSA()
{
WebRequest request = WebRequest.Create(GetURL);
WebResponse response = request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding("gb2312"));
//reader.ReadToEnd() 表示取得网页的源码 FileStream fs = new FileStream(txtURL, FileMode.Create);
byte[] data = System.Text.Encoding.Default.GetBytes(reader.ReadToEnd());
//开始写入
fs.Write(data, , data.Length);
//清空缓冲区、关闭流
fs.Flush();
fs.Close();
} /// <summary>
/// 根据路径读取txt文件
/// </summary>
/// <param name="path">txt路径</param>
/// <returns></returns>
public static List<string[]> Read(string path)
{
List<string[]> list = new List<string[]>();
StreamReader sr = new StreamReader(path, Encoding.Default);
String line;
while ((line = sr.ReadLine()) != null)
{
int i = line.ToString().IndexOf("title");
if (i > )
{
string titleStr = line.ToString().Substring(i + ); //截取到title后面的值
string[] titlelist = titleStr.Split('"'); //以" 截取
string titledata = titlelist[];
string[] datalist = titledata.Split('&'); //以& 截取
string data = datalist[];
string[] datastrlist = data.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries);//以; 截取
list.Add(datastrlist);
}
}
sr.Close();
return list;
} /// <summary>
/// 增查表
/// </summary>
/// <returns></returns>
public static DataTable ControlDB(string sql, List<SqlParameter> par, string type)
{
DataAccess controData = new DataAccess();
DataTable resultDT = new DataTable();
if (type == "select")
{
resultDT = controData.GetDataTable(sql, par.ToArray());
}
else
{
int result = controData.ExecuteSql(sql, par.ToArray());
}
return resultDT;
}
}
}

Demo下载:

http://files.cnblogs.com/files/xinchun/GetUSAData.zip

点滴积累【C#】---抓取页面中想要的数据的更多相关文章

  1. 使用PHP的正则抓取页面中的网址

    最近有一个任务,从页面中抓取页面中所有的链接,当然使用PHP正则表达式是最方便的办法.要写出正则表达式,就要先总结出模式,那么页面中的链接会有几种形式呢?   链接也就是超级链接,是从一个元素(文字. ...

  2. Python抓取页面中超链接(URL)的三中方法比较(HTMLParser、pyquery、正则表达式) <转>

    Python抓取页面中超链接(URL)的3中方法比较(HTMLParser.pyquery.正则表达式) HTMLParser版: #!/usr/bin/python # -*- coding: UT ...

  3. 通过CURL抓取页面中的图片路径并下载到本地

    1.首页是图片处理页面downpic.php <?phpfunction getImage($url,$filename="") { if($url=="" ...

  4. java使用htmlunit工具抓取js中加载的数据

    htmlunit 是一款开源的java 页面分析工具,读取页面后,可以有效的使用htmlunit分析页面上的内容.项目可以模拟浏览器运行,被誉为java浏览器的开源实现.这个没有界面的浏览器,运行速度 ...

  5. Fiddler中如何抓取app中https(443端口)数据

    Fiddler不但能截获各种浏览器发出的HTTP请求, 也可以截获手机发出的HTTP/HTTPS请求,总结下Fiddler截获IPhone和Android发出的HTTP/HTTPS包,前提条件是:安装 ...

  6. PHP抓取页面中的邮箱

    <?php $url='http://www.cnblogs.com/tinyphp/p/3234926.html'; //当页已留邮箱 $content=file_get_contents($ ...

  7. 浅谈如何使用python抓取网页中的动态数据

    我们经常会发现网页中的许多数据并不是写死在HTML中的,而是通过js动态载入的.所以也就引出了什么是动态数据的概念, 动态数据在这里指的是网页中由Javascript动态生成的页面内容,是在页面加载到 ...

  8. 用正则表达式抓取网页中的ul 和 li标签中最终的值!

                获取你要抓取的页面 const string URL = "http://www.hn3ddf.gov.cn/price/GetList.html?pageno=1& ...

  9. Heritrix源码分析(九) Heritrix的二次抓取以及如何让Heritrix抓取你不想抓取的URL

    本博客属原创文章,欢迎转载!转载请务必注明出处:http://guoyunsky.iteye.com/blog/644396       本博客已迁移到本人独立博客: http://www.yun5u ...

随机推荐

  1. 使MySQL对表名不区分大小写

    今天郁闷死了,在LINUX下调一个程序老说找不到表,但是我明明是建了表的,在MYSQL的命令行下也可以查到,为什么程序就找不到表呢? 后来请教了一个老师才搞定,原来是LINUX下的MYSQL默认是要区 ...

  2. 【spring boot】spring boot中使用@RestController不起作用,不返回json,依旧去找访问接口的请求地址对应的页面

    问题描述: spring boot中使用@RestController不起作用,不返回json,依旧去找访问接口的请求地址对应的页面 表现结果: 1>使用postman测试接口,表现为返回是40 ...

  3. java_Collection_详细介绍

    转自:http://blog.sina.com.cn/s/blog_3fb3625f0101aref.html 1.类集框架 java.util 包中包含了一些在 Java 2 中新增加的最令人兴奋的 ...

  4. MVC4 过滤器(转)

    先来看看一个例子演示过滤器有什么用: public class AdminController : Controller { // ... instance variables and constru ...

  5. 一次Dapper高并发测试报告记录. 结果....

    一直听说dapper的数据处理能力很强. 我也一直很喜欢. 不过最近的一次压力测试却出乎我的意料.... 好久没写东西,感觉自己都不知道怎么表达自己的意思了.   另外 这次的测试也是自己才开始的 . ...

  6. C++中 使用数组作为map容器VAlue值的解决方法

    1)是用Vector容器代替数组 2)使用数组指针(需要注意局部变量的问题,指针是否需要用new创建) int red [ 3 ]   = { 1 , 0 , 0 }; int green [ 3 ] ...

  7. django基础复习

    Django - 路由系统 url.py - 视图函数 views.py - 数据库操作 models.py - 模板引擎渲染 - HttpReponse(字符串) - render(request, ...

  8. 图结构练习——BFS——从起始点到目标点的最短步数(邻接表+BFS)

    图练习-BFS-从起点到目标点的最短步数 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描写叙述 在古老的魔兽传说中.有两个军团,一个 ...

  9. Android多点触控技术,实现对图片的放大缩小平移,惯性滑动等功能

    首先推荐一下鸿洋大大的打造个性的图片预览与多点触控视频教程,这套教程教我们一步一步实现了多点触控实现对图片的平移和缩放的功能.这篇文章我将在鸿洋大大的基础之上做了一些扩展功能: 1.图片的惯性滑动 2 ...

  10. iOS 状态栏和导航条配置

    iOS 状态栏和导航条配置 一:隐藏: [self.navigationController setNavigationBarHidden:YES animated:YES]; [[UIApplica ...