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

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

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

已经增加asp版本,php版本,需要的可以下载示例代码或者查看这篇文章https://wwwdev.cn/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; } } }  

本文来自https://wwwdev.cn/article/20090825/automatic-get-weather-report-by-visitor-ip.aspx

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Go 旅城通票

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值