前两天用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,较适宜。较适合垂钓,但天气稍热,会对垂钓产生一定的影响。