输入正确的手机号码,查询该号码的归属地和其他相关信息。
01、本地数据库存储信息,查询本地库
02、调用WebService查询
03、通过Http请求Get方式从服务器上获取数据
01、采用本地数据库存储,可以断网查询,无需付费,但信息量较大占用本地资源
02、调用WebService必须连接网络,不占用本地资源,但公开的WebService大多数需要付费。
03、通过Http请求Get方式从服务器上获取数据的方式必须连接网络,不占用本地资源,无需付费。
通过以上分析,决定采用第3种方式实现
寻找免费的手机号码归属地查询网址
通过一番寻找和对比,决定使用“手机号码归属地数据库API”这个网站上的查询接口。
首页地址:http://vip.showji.com/locating/help.htm
查询地址(返回结果页面):http://api.showji.com/Locating/query.aspx?m=手机号码
查询地址(返回xml数据):http://vip.showji.com/locating/?m=手机号码
通过跟踪调试网站的JS代码,发现返回结果页面是使用$("txtMobile").innerHTML=obj["Mobile"];的方式赋值的,这样的话页面是有值的,但查看源代码发现结果为空,所以无法通过抓取网页源码来提取结果值。
经过分析和反复试验发现,查询结果可以直接发回xml格式的数据,哈哈,亲,要的就是你。
有了xml数据就好办了,通过抓取网页Html代码,用一个string变量存储xml格式的数据,然后通过分析xml数据得到手机号码归属地信息。
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Net; using System.IO; using System.Xml; namespace QueryLocating { public partial class formQueryLocating : Form { //Html网页代码 private string htmlCode = string.Empty; //运营商 private string corp = string.Empty; //手机卡类型 private string card = string.Empty; public formQueryLocating() { InitializeComponent(); } /// <summary> /// 查询 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnQuery_Click(object sender, EventArgs e) { if (txtm.Text.Trim().ToString() != "") { //抓取网页html代码 htmlCode = GetStringByUrl("http://vip.showji.com/locating/?m=" + txtm.Text.Trim().ToString()); //查询手机号码归属地 QueryLocating(htmlCode); } else { txtMobile.Text = ""; txtProvince.Text = ""; txtCity.Text = ""; txtAreaCode.Text = ""; txtPostCode.Text = ""; txtCard.Text = ""; MessageBox.Show("请输入手机号码!", "错误提示", MessageBoxButtons.OK, MessageBoxIcon.Information); } } /// <summary> /// 查询手机号码归属地 /// </summary> /// <param name="htmlCode">网页Html代码</param> private void QueryLocating(string htmlCode) { //创建Xml实例 XmlDocument xmldoc = new XmlDocument(); //加载Xml文档 xmldoc.LoadXml(htmlCode); //获取Xml文档的根元素 XmlElement root = xmldoc.DocumentElement; //获取Xml文档的根元素下的所有子节点 XmlNodeList topNode = xmldoc.DocumentElement.ChildNodes; //子节点集合 XmlNodeList elemList; //遍历根元素下所有子节点 foreach (XmlElement element in topNode) { //根据节点名称获取节点元素值 elemList = root.GetElementsByTagName(element.Name); switch (element.Name) { //判断手机号码格式是否正确 case "QueryResult": if (elemList[0].InnerText.ToString() == "False") MessageBox.Show("您输入的手机号码格式有误,请重新输入!", "错误提示", MessageBoxButtons.OK, MessageBoxIcon.Information); continue; //手机号码 case "Mobile": txtMobile.Text = elemList[0].InnerText; break; //所属省份 case "Province": txtProvince.Text = elemList[0].InnerText; break; //所属城市 case "City": txtCity.Text = elemList[0].InnerText; break; //区号 case "AreaCode": txtAreaCode.Text = elemList[0].InnerText; break; //邮编 case "PostCode": txtPostCode.Text = elemList[0].InnerText; break; //运营商 case "Corp": corp = elemList[0].InnerText; break; //卡类型 case "Card": card = elemList[0].InnerText; //拼接字符串(运营商+卡类型) txtCard.Text = corp + card; break; } } } /// <summary> /// 抓取网页html代码 /// </summary> /// <param name="strUrl">URL</param> /// <returns></returns> private static string GetStringByUrl(string strUrl) { //与指定URL创建HTTP请求 WebRequest wrt = WebRequest.Create(strUrl); //获取对应HTTP请求的响应 WebResponse wrse = wrt.GetResponse(); //获取响应流 Stream strM = wrse.GetResponseStream(); //对接响应流(以"GBK"字符集) StreamReader SR = new StreamReader(strM, Encoding.GetEncoding("UTF-8")); //获取响应流的全部字符串 string strallstrm = SR.ReadToEnd(); //关闭读取流 SR.Close(); //返回网页html代码 return strallstrm; } } }
源代码:http://files.cnblogs.com/jara/QueryLocating.rar
网友 2015/1/16 10:57:45 发表
这个网站也收费了