您的位置:首页 > 其它

根据访问用户IP地址自动获取天气预报

2009-08-25 12:01 1126 查看
根据访问用户IP地址自动获取天气预报,使用了纯真IP数据库,但是由于纯真IP数据库的信息不满足sina查询页面需要的信息,所以整理了下,里面的IP记录还剩下30w左右,原来的是36w的。

================更新================

已经增加asp版本,php版本,需要的可以下载示例代码或者查看这篇文章http://www.coding123.net/article/20090825/automatic-get-weather-report-by-visitor-ip.aspx

完整示例下载点击这里

根据访问用户IP地址自动获取天气预报

上面的代码是未使用ajax来获取,只含有一个ashx文件获取和分析数据用的。

数据库文件太大,压缩文件中只放了一个压缩过的txt文本文件数据【已经对ip地址数字化】。

如何改写为ajax版本的和导入文本文件到acc或者mssql,参考下面的文章

简易天气预报查询【此为ajax版本的,不过没用使用ip数据库】

如何将QQWry.Dat导出为access数据,导入mssql及查询纯真导入后的ip数据【数据库导入的】

返回的数据格式大概如下

{

success:true//指示抓取数据是否成功

,addr:'城市'//访问的用户的IP对应的城市地址

,weathers:[//天气数组,从今天到后两天

{d:'日期',weather:'天气',tmp:'温度',dir:'风向',strong:'风力'}//注意只有今天才有“风向”属性

,{d:'日期',weather:'天气',tmp:'温度',strong:'风力'}//明天

,{d:'日期',weather:'天气',tmp:'温度',strong:'风力'}//后天

]

}

下面就列出weather.ashx中代码

<%@ WebHandler Language="C#" Class="weather" %>

using System;
using System.Web;
using System.Text;
using System.Text.RegularExpressions;
using System.IO;
using System.Net;
public class weather : IHttpHandler {
/// <summary>
/// 获取客户ip地址
/// </summary>
/// <returns></returns>
private string GetIP()
{
string ip = HttpContext.Current.Request.ServerVariables["http_x_forwarded_for"];
if (!UserCheck.IsNotNull(ip)) ip = HttpContext.Current.Request.ServerVariables["remote_addr"];
return ip;
}
/// <summary>
/// 从字符串中获取天气,温度和风力
/// </summary>
/// <param name="str">内容字符串</param>
/// <param name="IsToday">是否为今天</param>
/// <returns></returns>
private string[] Split(string str, bool IsToday)
{
string s1 = ""//风向,只有今天才有
, s2 = ""//天气,非今天
, s3 = ""//温度,非今天
, s4 = "";//风力
Regex r;
Match m;
if (IsToday)
{
r = new Regex("风向:([//s//S]+?)</li>", RegexOptions.Compiled | RegexOptions.IgnoreCase);
m = r.Match(str);
s1 = m.Groups[1].Value.Trim();
}
else
{
r = new Regex("天气:([//s//S]+?)</p>", RegexOptions.Compiled | RegexOptions.IgnoreCase);
m = r.Match(str);
s2 = m.Groups[1].Value.Trim();
r = new Regex("温度:([//s//S]+?)</p>", RegexOptions.Compiled | RegexOptions.IgnoreCase);
m = r.Match(str);
s3 = RemoveHTML(m.Groups[1].Value).Trim();
}
r = new Regex("风力:([//s//S]+?)" + (IsToday ? "</li>" : "</p>"), RegexOptions.Compiled |

RegexOptions.IgnoreCase);
m = r.Match(str);
s4 = m.Groups[1].Value.Trim();
return new string[] { s1, s2, s3, s4 };
}
/// <summary>
/// 移除字符串中指定的html标记,如果未传递标记名称则全部移除html标记
/// </summary>
/// <param name="str">字符串对象</param>
/// <param name="Tags">标记名称</param>
/// <returns></returns>
public string RemoveHTML(string str, params string[] Tags)
{
string Pattern = "";
if (Tags.Length == 0) Pattern = "<[^>]+>";
else
{
for (int i = 0; i < Tags.Length; i++)
{
Pattern += "<" + Tags[i] + "[^>]*>|</" + Tags[i] + ">|";
}
Pattern = Pattern.Substring(0, Pattern.Length - 1);
}
return Regex.Replace(str, Pattern, "", RegexOptions.IgnoreCase);
}
public void ProcessRequest(HttpContext context)
{
string Ip = GetIP(), area = "", json = "var weather={success:false};";

if (Ip != null && !string.IsNullOrEmpty(Ip))
{
string[] arr = Ip.Split('.');
double ipNum = 0, pow = 256;
ipNum = double.Parse(arr[0]) * Math.Pow(pow, 3) + double.Parse(arr[1]) * Math.Pow(pow, 2)
+ double.Parse(arr[2]) * pow + double.Parse(arr[3]);
//这里这块代码要改成你读数据库获取表的列名信息的代码
DBHelper db = new DBHelper();
object addr = DBHelper.ExecScalar("select 城市名 from 数据库 where ip开始字段>=" + ipNum.ToString() +

" and ip结束字段<=" + ipNum.ToString(), db.CN);
db.CloseDB();
//===================================
if (addr != null)
{
try
{
HttpWebRequest wr = (HttpWebRequest)HttpWebRequest.Create

("http://php.weather.sina.com.cn/search.php?city=" + addr.ToString());
string htmlBody = "";
using (StreamReader sr = new StreamReader(wr.GetResponse().GetResponseStream(),

Encoding.GetEncoding(936)))
{
htmlBody = sr.ReadToEnd();
}
Regex r = new Regex("<div//s+class=/"box-s1-l/">([//s//S])+?<h2>([^>]+)</h2>",

RegexOptions.IgnoreCase | RegexOptions.Compiled);
if (r.IsMatch(htmlBody))
{
json = "{success:true,addr:'"+addr.ToString()+"',weathers:[{d:'" +

DateTime.Now.ToString("yyyy-MM-dd") + "'";
Match m = r.Match(htmlBody);
json += ",weather:'" + m.Groups[2].Value + "'";
r = new Regex("<div//s+class=/"w-number/">([//s//S]+?)</div>", RegexOptions.IgnoreCase |

RegexOptions.Compiled);
m = r.Match(htmlBody);
json += ",tmp:'" + RemoveHTML(m.Groups[1].Value).Trim() + "'";
r = new Regex("<ul//s+class=/"list-s1/">([//s//S]+?)</ul>", RegexOptions.IgnoreCase |

RegexOptions.Compiled);
m = r.Match(htmlBody);
string[] tmp = Split(m.Groups[1].Value, true);
json += ",dir:'" + tmp[0] + "',strong:'" + tmp[3] + "'}";
if (context.Request.QueryString["all"] == "1"||context.Request.Form["all"] == "1")
{//这里是判断是否需要取后连天的数据
r = new Regex("<div//s+class=/"info-area/">([//s//S]+?)</div>",

RegexOptions.IgnoreCase | RegexOptions.Compiled);
MatchCollection mc = r.Matches(htmlBody);
for (int i = 1; i < 3 && i < mc.Count; i++)
{
tmp = Split(mc[i].Groups[1].Value, false);
json += ",{d:'" + DateTime.Now.AddDays(i).ToString("yyyy-MM-dd") + "',weather:'"

+ tmp[1]
+ "',tmp:'" + tmp[2] + "',strong:'" + tmp[3] + "'}";
}
}
json += "]}";
}
}
catch { }
}
}
context.Response.Write(json);
}

public bool IsReusable {
get {
return false;
}
}

}


本文来自http://www.coding123.net/article/20090825/automatic-get-weather-report-by-visitor-ip.aspx
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: