从网站抓取天气预报的内容(找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°C,最高温度35°C 防晒指数:5,极强。紫外辐射极强,外出时应特别加强防护,建议涂擦SPF20以上,PA++的防晒护肤品,并随时补涂。 中暑指数:2,较易。气温较高,较易中暑,体质较弱的朋友请注意防暑降温,避免长时间在日光下暴晒或在高温环境中工作。 穿衣指数:1,炎热。天气炎热,建议着短衫、短裙、短裤、薄型T恤衫、敞领短袖棉衫等清凉夏季服装。 空调指数:2,部分时间开启。您将感到些燥热,建议您在适当的时候开启制冷空调来降低温度,以免中暑。 洗车指数:2,较适宜。较适宜洗车,未来一天无雨,风力较小,擦洗一新的汽车至少能保持一天。 钓鱼指数:3,不宜。天气太热,不适合垂钓。 明日 北京 08年07月03日-04日;星期四 晴转雷阵雨 24℃~31℃ 污染指数:2,良。气象条件有利于空气污染物稀释、扩散和清除,可在室外正常活动。 紫外线指数:2,弱。紫外线强度较弱,建议出门前涂擦SPF在12-15之间、PA+的防晒护肤品。 舒适度指数:2,较不舒适。白天天气较热,虽然有雨,但仍然无法削弱较高气温给人们带来的暑意,这种天气会让您感到不很舒适。 体感指数:最低温度25°C,最高温度28°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°C,最高温度28°C 防晒指数:2,较弱。紫外线强度较弱,建议涂擦SPF在12-15之间,PA+的防晒护肤品。 中暑指数:0,无。温度不高,其他各项气象条件适宜,中暑机率极低。 穿衣指数:2,热。天气较热,建议着短裙、短裤、短套装、T恤等夏季服装。年老体弱者宜着长袖衬衫和单裤。 空调指数:4,较少开启。您将感到很舒适,一般不需要开启空调。 洗车指数:4,不宜。不宜洗车,未来24小时内有雨,如果在此期间洗车,雨水和路上的泥水可能会再次弄脏您的爱车。 钓鱼指数:2,较适宜。较适合垂钓,但天气稍热,会对垂钓产生一定的影响。