苏飞论坛

标题: 抓取hao123手机号码归属地的例子 [打印本页]

作者: 站长苏飞    时间: 2012-9-10 15:28
标题: 抓取hao123手机号码归属地的例子
有段时间不写博客了,最近工作压力比较大,大家在忙什么,新近安装了Win7的操作系统,感觉很不错,还体验了一把IE9,里面的开发人员工具很好用说到这个大家可以用火狐的谷歌的都行,在这个例子中我主要使用IE9自带的分析一下hao123的手机号码归属地查询的问题。
           我们先来看看下面的图片吧

   在hao123的这个界面里我们只要输入一个手机号不管是移动,联通,电信的都可以,单击查询就可以直接查询到归属地,和号码类型,网上这样的
网站很多,我就以这个为例子吧,那我们怎么样把这些信息放到我们自己的网站上呢?
我们先来分析一下,其实很方便,我们在IE9下打开这个界面然后在工具---开发人员工具,或是直接安f12也是一样的效果,我们安界面定位到如下图

我们先单击网络然后单击开始捕获,这个时候我们再单击一下查询按钮看看会出现什么情况


是不是出现两个整个,第一个很明显是加载我们所输入号归属地信息,第一个是加载一个图片,对我们没有任何用处,这里不管它,现在我们
来单击一下第一个方法看看捕获到了什么

URL http://vip.showji.com/locating/?m=13888888888&outfmt=json&callback=phone.callBack 很明显这是一个GEt请求,只要请求这个地址就能得到下面的结果
phone.callBack({"Mobile":"13888888888","QueryResult":"True","Province":"云南","City":"昆明","AreaCode":"0871","PostCode":"650000","Corp":"中国移动","Card":"GSM"});
用手机号,省,市,还有邮编,号码类型等信息。这样看的话是不是我们直接把这个地区复制到地址栏里就行了,那咱们一起来看看效果吧

果然没错就是我们想要的东西,大家别急,其它还可以更简单,我们来看一下这个URL
http://vip.showji.com/locating/?m=13888888888&outfmt=json&callback=phone.callBack
如果现在我把这个RUles号码后面的删除只保留http://vip.showji.com/locating/?m=13888888888这些会出现什么情况呢?
直接放到地址栏里试试效果

呵呵,很神奇吧,居然得到的是一个Xml文件
这就像是我们在调用WebServces一样简单了,我们只要写一个程序请求这个地址就可以得到我们想要的效果了。
随便新建一个项目,一起来看一下
我就不一步一步的分析了大家直接看我的代码
[C#] 纯文本查看 复制代码
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.Security.Cryptography.X509Certificates;
using System.Net.Security;
using System.Security.Cryptography;
using System.Xml;

namespace ccbText
{
    public partial class Form2 : Form
    {

        public Form2()
        {
            InitializeComponent();
        }

        private void Form2_Load(object sender, EventArgs e)
        {
        }
             这个方法在这里没有用到,大家可以做为参考
        /// <summary>
        /// 传入URL返回网页的html代码
        /// </summary>
        /// <param name="Url">URL</param>
        /// <returns></returns>
        public string GetUrltoHtml(string Url)
        {
            StringBuilder content = new StringBuilder();

            try
            {
                // 与指定URL创建HTTP请求
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
                request.KeepAlive = false;
                // 获取对应HTTP请求的响应
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                // 获取响应流
                Stream responseStream = response.GetResponseStream();
                // 对接响应流(以"GBK"字符集)
                StreamReader sReader = new StreamReader(responseStream, Encoding.GetEncoding("utf-8"));
                // 开始读取数据
                Char[] sReaderBuffer = new Char[256];
                int count = sReader.Read(sReaderBuffer, 0, 256);
                while (count > 0)
                {
                    String tempStr = new String(sReaderBuffer, 0, count);
                    content.Append(tempStr);
                    count = sReader.Read(sReaderBuffer, 0, 256);
                }
                // 读取结束
                sReader.Close();
            }
            catch (Exception)
            {
                content = new StringBuilder("Runtime Error");
            }

            return content.ToString();

        }


        /// <summary>
        /// 好123查询,符合下列规则也可使用
        /// 返回xml
        /// 需要顺序的节点:
        /// QueryResult(查询结果状态True,False)
        /// Province(所属省份)
        /// City(所属地区)
        /// Corp(服务商)
        /// Card(卡类型 GSM)
        /// AreaCode(区号)
        /// PostCode(邮编)
        /// </summary>
        /// <param name="url"></param>
        /// <param name="mobileNum"></param>
        /// <returns></returns>
        public static string[] GetInfoByxml(string url, string mobileNum)
        {
            try
            {
                XmlDocument xml = new XmlDocument();
                // xml.LoadXml("<?xml version='1.0' encoding='utf-8' ?><QueryResponse xmlns='http://api.showji.com/Locating/'><Mobile>15890636739</Mobile><QueryResult>True</QueryResult><;Province>河南</Province><City>郑州</City><AreaCode>0371</AreaCode><;PostCode>450000</PostCode><Corp>中国移动</Corp><Card>GSM</Card></QueryResponse>");
                xml.Load(string.Format(url, mobileNum));
                XmlNamespaceManager xmlNm = new XmlNamespaceManager(xml.NameTable);
                xmlNm.AddNamespace("content", "http://api.showji.com/Locating/");
                XmlNodeList nodes = xml.SelectNodes("//content:QueryResult|//content:Mobile|//content:Province|//content:City|//content:Corp|//content:Card|//content:AreaCode|//content:PostCode", xmlNm);
                if (nodes.Count == 8)
                {
                    if ("True".Equals(nodes[1].InnerText))
                    {

                        return new string[] { nodes[0].InnerText, nodes[2].InnerText + nodes[3].InnerText, nodes[6].InnerText + nodes[7].InnerText, nodes[4].InnerText, nodes[5].InnerText };
                    }
                }
                return new string[] { "FALSE" };
            }
            catch
            {
                return new string[] { "FALSE" };
            }
        }

        //调用方法查询数据
        private void button1_Click(object sender, EventArgs e)
        {
            foreach (string item in GetInfoByxml(" http://vip.showji.com/locating/?m={0}", txtMobile.Text.Trim()))
            {
                richTextBox1.Text += "__" + item;
            }
        }
    }
}


运行一下看看效果吧


我是用Winfrom做的测试,大家如果想用Asp。Net也是一样的,把我的方法复制到你的Web页面的Cs代码下就OK了。
好了我们的分析到这里就算是结束了,
在这里我再给大空补充一个关于调用带有证书的网站的调用 方法
因为带证书的都是在要验证证书文件的,我们在这里直接让他在本地回调验证,这样的话就要吧重写方法了,下在看一下回调的方法吧
[C#] 纯文本查看 复制代码
//回调验证证书问题
        public bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
        {   // 总是接受   
            return true;
        }


其它很简单只要在 我们上面的方法GetUrltoHtml()中加入几行代码就行了,修改后的方法
[C#] 纯文本查看 复制代码
/// <summary>
        /// 传入URL返回网页的html代码
        /// </summary>
        /// <param name="Url">URL</param>
        /// <returns></returns>
        public string GetUrltoHtml(string Url)
        {
            StringBuilder content = new StringBuilder();
            try
            {
                // 与指定URL创建HTTP请求
                ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(CheckValidationResult);//验证

                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
                request.KeepAlive = false;
                request.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2; MS-RTC LM 8; .NET4.0C; .NET4.0E)";
                request.Method = "GET";
                request.Accept = "*/*";

                //创建证书文件
                X509Certificate objx509 = new X509Certificate(Application.StartupPath + "\\123.cer");

                //添加到请求里
                request.ClientCertificates.Add(objx509);

                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                // 获取对应HTTP请求的响应
                // 获取响应流
                Stream responseStream = response.GetResponseStream();
                // 对接响应流(以"GBK"字符集)
                StreamReader sReader = new StreamReader(responseStream, Encoding.GetEncoding("GBK"));
                // 开始读取数据
                Char[] sReaderBuffer = new Char[256];
                int count = sReader.Read(sReaderBuffer, 0, 256);
                while (count > 0)
                {
                    String tempStr = new String(sReaderBuffer, 0, count);
                    content.Append(tempStr);
                    count = sReader.Read(sReaderBuffer, 0, 256);
                }
                // 读取结束
                sReader.Close();
            }
            catch (Exception)
            {
                content = new StringBuilder("Runtime Error");
            }
            return content.ToString();
        }


作者: zzahkj    时间: 2013-5-28 16:24
由于运营成本的提升,该接口须付费后后方可使用
现在不能用了?
作者: 站长苏飞    时间: 2013-5-28 16:29
zzahkj 发表于 2013-5-28 16:24
由于运营成本的提升,该接口须付费后后方可使用
现在不能用了?

重要学习技术与实现方式,而不是接口本身。咱们是做技术的

作者: Homeless    时间: 2013-6-23 14:40
受教了,学习中……
作者: gangn    时间: 2013-7-7 13:40
膜拜中……
作者: Monn    时间: 2013-7-27 17:39
http://api.showji.com/Locating/www.showji.com.aspx?m=13888888888  这借口貌似可以把
作者: nsoftboy    时间: 2013-8-8 15:07
Monn 发表于 2013-7-27 17:39
http://api.showji.com/Locating/www.showji.com.aspx?m=13888888888  这借口貌似可以把

差一点,现在地址是这样的(红色标注了):
http://api.showji.com/Locating/www.showji.co.m.aspx?m=18888888888


【今天刚看到这个网站,很好,受教了,资料丰富,第一帖,留记!】





作者: 黄小波    时间: 2014-6-9 15:52
为什么我没捕获出,电话号码的,只捕获出图片的这些
请求        GET /images/track.gif?type=channel_form_submit&level=2&pageId=hao123-life-shfw-sjhmcx&order=1&r=1402299893188 HTTP/1.1
User-Agent        Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; InfoPath.3)
Referer        http://www.hao123.com/sjhmcx/
Host        www.hao123.com
DNT        1
Cookie        BAIDUID=86B7A8E7A3C0A620309FB8D86C627FCD:FG=1; static=1; mtip=0; HUM=; HUN=; loc2=1%7C%E5%9B%9B%E5%B7%9D%7C%E6%88%90%E9%83%BD; toptip=0; FLASHID=86B7A8E7A3C0A620309FB8D86C627FCD:FG=1; Hm_lvt_22661fc940aadd927d385f4a67892bc3=1402299396; Hm_lpvt_22661fc940aadd927d385f4a67892bc3=1402299396; hz=0
Connection        Keep-Alive
Cache-Control        no-cache
Accept-Language        zh-CN
Accept-Encoding        gzip, deflate
Accept        */*
作者: zhulinmails    时间: 2015-1-24 18:06
受教了学习中……
作者: 970443232    时间: 2015-2-19 18:25
[C#] 纯文本查看 复制代码
sadflkasjdlkfja
ajdfasdfk

[C#] 纯文本查看 复制代码
dfsadfadfa

作者: acmluoyong    时间: 2015-3-24 09:28
GOOD Idea.
作者: jollytao    时间: 2015-9-17 21:15
好帖子,似乎接口变了,http://v.showji.com/Locating/sho ... .aspx?m=13888888888

想问楼主 \\123.cer 是自定义的名字吗?然后new一个certificate就本地生成了?
作者: 站长苏飞    时间: 2015-9-17 21:44
jollytao 发表于 2015-9-17 21:15
好帖子,似乎接口变了,http://v.showji.com/Locating/showji.com20150416273007.aspx?m=13888888888

想 ...

这个自己随便找个下载一下就行了,是证书文件
作者: 爱的diy    时间: 2016-12-12 20:43
为什么图片打不开?我想要学习




欢迎光临 苏飞论坛 (http://www.sufeinet.com/) Powered by Discuz! X3.4