从网站抓取天气预报的内容(找webservice没有找到免费的好使的)

来源:互联网 发布:批量下载网页源码 编辑:程序博客网 时间:2024/04/29 01:05
前两天用c#写了一个从新浪网站上抓取天气预报的小程序,可以取得新浪网页上三天的天气预报,并存放在文本中。
开始取得网页老是乱码,后来折驣了好久才弄好,全部代码如下:
htmlagilitypack,在这里是用来处理HTML文档的,可以到http://www.codeplex.com/htmlagilitypack去下.
using System;using System.Collections.Generic;using System.Text;using HtmlAgilityPack;using System.IO;using System.Net;using System.Xml;using System.Data;namespace TestGet{    class Program    {        static void Main(string[] args)        {            string filetail = DateTime.Now.Year.ToString() + DateTime.Now.Month.ToString()                + DateTime.Now.Day.ToString();            string city = "北京";            string result = ReadTxtFile(city, filetail);            //Console.Read();                       }        public static string ReadTxtFile(string city, string filetail)        {            if (File.Exists(@"d:/weather/weather_" + city + "_" + filetail + ".txt"))            {                StreamReader sr = File.OpenText(@"d:/weather/weather_" + city + "_" + filetail + ".txt");                string str = sr.ReadToEnd();                return str;            }            else            {                GetFile(city, filetail);                CreatTxtFile(city, filetail);                StreamReader sr = File.OpenText(@"d:/weather/weather_" + city + "_" + filetail + ".txt");                string str = sr.ReadToEnd();                return str;            }        }        public static void CreatTxtFile(string city, string filetail)        {                       FileStream fss = File.OpenRead(@"d:/weather/weather_" + city + "_" + filetail + ".html");            HtmlDocument doc = new HtmlDocument();            doc.Load(fss, Encoding.GetEncoding("gb2312"));            HtmlNodeCollection nodes = doc.DocumentNode.SelectNodes                ("//div//div[@class='City_Data']|//div//div[@class='Weather_TP']|//div[@class='Weather_SM']");            string weatherString = null;            foreach (HtmlNode node in nodes)            {                weatherString += node.InnerHtml.ToString();            }            string w2 = weatherString.Replace("<p><span>", "/r");            string w3 = w2.Replace("</p>", "");            string w4 = w3.Replace("</span>", "");            string w5 = w4.Replace(" ", "");            string w6 = w5.Replace("<h3>", "");            string w7 = w6.Replace("</h3>", "");            string w8 = w7.Replace("<p>", "");            Console.WriteLine(w8);            FileStream fs = File.Create(@"d:/weather/weather_" + city + "_" + filetail + ".txt");            StreamWriter sw = new StreamWriter(fs, Encoding.GetEncoding("GB2312"));            //sw.Encoding = Encoding.Unicode;            sw.WriteLine(w8);            sw.Flush();            fs.Flush();            sw.Close();            fs.Close();        }        public static void GetFile(string city ,string filetail)        {            WebClient client= new WebClient();            //client.DownloadFile("", "");            // 要提交表单的URI字符串。            string uriString = "http://php.weather.sina.com.cn/search.php";            // 要提交的字符串数据。            string postString = "city="+city;            // 初始化WebClient            WebClient webClient = new WebClient();            webClient.Headers.Add("Content-Type", "application/x-www-form-urlencoded");            // 将字符串转换成字节数组            //得到"北京"这两个字的的GB2312编码            byte[] postData = Encoding.GetEncoding("gb2312").GetBytes(postString);            for (int i = 0; i < postData.Length; i++)            {                Console.WriteLine(postData[i].ToString());            }            // 上传数据,返回页面的字节数组            byte[] responseData = webClient.UploadData(uriString, "POST", postData);            // 返回的将字节数组转换成字符串(HTML)            //按照GB2312格式读取字符节流转换成Unicode放在字符串中,因为string是Unicode类型的            string srcString = Encoding.GetEncoding("GB2312").GetString(responseData);            FileStream fs=File.OpenWrite(@"d:/weather/weather_" + city + "_" + filetail + ".html");            //StreamWriter读出UNICODE的字符串后按GB2312写入HTML中            //StreamWriter tw = new StreamWriter(fs, Encoding.GetEncoding("GB2312"));            for (int i = 0; i < responseData.Length; i++)            {                fs.WriteByte(responseData[i]);            }            fs.Flush();            fs.Close();                                   //TextWriter tw = File.AppendText(@"d:/weather/weather_"+city +"_"+filetail+".html");            //tw.Flush();            //tw.Close();           // Console.Read();            //        }    }}
 
//运行结果,会在文本里显示以下内容:
   今日 北京   08年07月02日-03日;星期三  多云转晴 23℃~35℃  污染指数:4,较差。气象条件较不利于空气污染物稀释、扩散和清除,请适当减少室外活动时间。  紫外线指数:5,很强。紫外线辐射极强,建议涂擦SPF20以上、PA++的防晒护肤品,尽量避免暴露于日光下。  舒适度指数:3,很不舒适。白天天气晴好,但烈日炎炎会使您会感到很热,很不舒适。  体感指数:最低温度23&deg;C,最高温度35&deg;C  防晒指数:5,极强。紫外辐射极强,外出时应特别加强防护,建议涂擦SPF20以上,PA++的防晒护肤品,并随时补涂。  中暑指数:2,较易。气温较高,较易中暑,体质较弱的朋友请注意防暑降温,避免长时间在日光下暴晒或在高温环境中工作。  穿衣指数:1,炎热。天气炎热,建议着短衫、短裙、短裤、薄型T恤衫、敞领短袖棉衫等清凉夏季服装。  空调指数:2,部分时间开启。您将感到些燥热,建议您在适当的时候开启制冷空调来降低温度,以免中暑。  洗车指数:2,较适宜。较适宜洗车,未来一天无雨,风力较小,擦洗一新的汽车至少能保持一天。  钓鱼指数:3,不宜。天气太热,不适合垂钓。    明日 北京   08年07月03日-04日;星期四  晴转雷阵雨 24℃~31℃  污染指数:2,良。气象条件有利于空气污染物稀释、扩散和清除,可在室外正常活动。  紫外线指数:2,弱。紫外线强度较弱,建议出门前涂擦SPF在12-15之间、PA+的防晒护肤品。  舒适度指数:2,较不舒适。白天天气较热,虽然有雨,但仍然无法削弱较高气温给人们带来的暑意,这种天气会让您感到不很舒适。  体感指数:最低温度25&deg;C,最高温度28&deg;C  防晒指数:2,较弱。紫外线强度较弱,建议涂擦SPF在12-15之间,PA+的防晒护肤品。  中暑指数:0,无。温度不高,其他各项气象条件适宜,中暑机率极低。  穿衣指数:1,炎热。天气炎热,建议着短衫、短裙、短裤、薄型T恤衫、敞领短袖棉衫等清凉夏季服装。  空调指数:3,部分时间开启。天气热,到中午的时候您将会感到有点热,因此建议在午后较热时开启制冷空调。  洗车指数:4,不宜。不宜洗车,未来24小时内有雨,如果在此期间洗车,雨水和路上的泥水可能会再次弄脏您的爱车。  钓鱼指数:2,较适宜。较适合垂钓,但天气稍热,会对垂钓产生一定的影响。    后天 北京   08年07月04日-05日;星期五  中雨转阵雨 22℃~29℃  污染指数:2,良。气象条件有利于空气污染物稀释、扩散和清除,可在室外正常活动。  紫外线指数:2,弱。紫外线强度较弱,建议出门前涂擦SPF在12-15之间、PA+的防晒护肤品。  舒适度指数:1,较舒适。白天有降雨,但会使人们感觉有些热,不过大部分人仍会有比较舒适的感觉。  体感指数:最低温度20&deg;C,最高温度28&deg;C  防晒指数:2,较弱。紫外线强度较弱,建议涂擦SPF在12-15之间,PA+的防晒护肤品。  中暑指数:0,无。温度不高,其他各项气象条件适宜,中暑机率极低。  穿衣指数:2,热。天气较热,建议着短裙、短裤、短套装、T恤等夏季服装。年老体弱者宜着长袖衬衫和单裤。  空调指数:4,较少开启。您将感到很舒适,一般不需要开启空调。  洗车指数:4,不宜。不宜洗车,未来24小时内有雨,如果在此期间洗车,雨水和路上的泥水可能会再次弄脏您的爱车。  钓鱼指数:2,较适宜。较适合垂钓,但天气稍热,会对垂钓产生一定的影响。 
 
原创粉丝点击