IP得到天气预报(1)———数据分析存储
- 最近几天,突发奇想,打算自己做个喜欢的天气预报系统,每每浏览网页,可以得到根据IP地址的变化而的到不同城市的天气。经过2天的努力和尝试,总算是小有一点进展。其中涉及到的主要有:
- HTML代码分析,得到所有的网站不提供的全部每个城市的拼音和区位码。
- IP地址计算,并且,从数据库得到拼音和城市名字。
- XML代码的分析和DATA部分的肢解,得到XML中不提供的官方数据的及时显示。
- 制作自己的RSS订阅服务。
- 先看看效果或者预览:地址
- 思路:访问页面--->得到访问者IP--->IP地址计算成整数--->然后从数据库中得到IP对应的城市,城市拼音--->分析HTML提取雅虎天气中的数据--->通过拼音得到CODE地区吗--->然后再分析XML和HTML得到想要的内容。
- 首先,必须找一个能够提供服务的网站。我找到了雅虎天气。简单介绍下,这个天气需要自己输入城市的拼音,然后跳转到相应的页面。比如以我北京为例子,输入Beijing,得到beijing在雅虎天气中规定的代码,CHXX0008。根据我现有的从网上找到的,一个是IP地址和城市的省会的,另一个表格是省会城市和城市拼音的。所以必须得到code才可以得到天气。
- http://weather.yahoo.com/regional/CHXX.html 这个页面中,我们可以看见所有的城市列表是很有规律的。我们可以异步的访问通过HTMLDocument得到每一个字母下面的列表中每一个链接所对行的地址。然后分析地址,就可以提出出来,城市名字的拼音和CHXX后面的那个代码了。
- 这个需要一个WinForm程序。委托一个事件异步的处理发生的事件。
-
Code
private void Form1_Load(object sender, EventArgs e)
{
string aUilA = "http://weather.yahoo.com/regional/CHXX.html";
string aUrl = string.Empty;
aUrl = aUilA;
Uri aUri = new Uri(aUrl);
WebBrowser aBrowser = new WebBrowser();
aBrowser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(OnListCompleted);
aBrowser.Url = aUri;
} - 仔细阅读HTML中的代码,可以发现,所有的href中存储的是我们需要的链接地址,而我们如和能定位到呢?发现li中列出来的是所有的链接,后前面有个ID刚好对应这个li的所有内容。通过HtmlElement中的GetElementById()直接定位到想要的ID。之后再逐步的分析li,循环提取,就可以把所有的名字和链接对应提取到一个数组中了。直接存到自己的数据库中。
-
using (WebBrowser aBrowser = sender as WebBrowser)
{
if (aBrowser != null)
{
HtmlDocument aDoc = aBrowser.Document;
HtmlElement aListE = aDoc.GetElementById("*****");//分析定位位置
HtmlElementCollection aCol = aListE.GetElementsByTagName("li");
foreach (HtmlElement aDataItem in aCol)
{
try
{
//此处用来分析处理对应的HTML代码。
//循环处理得到结果
//
//
string nameCN = aLink.InnerHtml;
CreateNewCode(codeCH, nameCN);
}
catch (Exception ex)
{ }
}
} - 提取的结果就如下了。大概有500条记录吧。
-
总结:基本关于数据的提取就啰嗦这么多吧。关于网上的数据源存储了IP地址和城市的,随便可以找。我找到的是一个Access版本的。那么下面说的是IP地址计算和提取部分。
- 简单加个链接目录,有兴趣的可以一起研究下:)
- IP得到天气预报(1)———数据分析存储
- IP得到天气预报(2)———IP运算和数据处理
- IP得到天气预报(3)———XML中CDATA的提取
- IP得到天气预报(4)———制作自己的RSS订阅
作者:Alexliu(alex dotNet Learning)
出处:http://alexliu.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,转载请注明。并且保留文章链接。否则保留追究法律责任的权利。