个人原创、欢迎转载、转载请注明出处、http://www.cnblogs.com/zetee/articles/3482085.html

  采集器概貌,如下:

  

  最近做一个项目,功能类似于CNZZ站长统计功能,要求显示Ip所在的省份市区/提供商等信息。网上的Ip纯真数据库,下载下来一看,发现没提供商内容,省市区都很少,居然有XXX网吧,哥瞬间倒了。没标准化、并且杂乱、还不连续的IP段、总体说来没达到要求。

  在百度上找啊找,找到淘宝Ip地址库,官方介绍的相当诱人,准确率高,数据质量有保障,提供国家、省、市、县、运营商全方位信息,信息维度广,格式规范,但是限制每秒10次的访问(这个比较无语)。

  淘宝IP地址库,提供API    http://ip.taobao.com/

接口说明

  1. 请求接口(GET): 
      http://ip.taobao.com/service/getIpInfo.php?ip=[ip地址字串] 
  2. 响应信息: 
      (json格式的)国家 、省(自治区或直辖市)、市(县)、运营商 
  3. 返回数据格式: 
      {"code":0,"data":{"ip":"210.75.225.254","country":"\u4e2d\u56fd","area":"\u534e\u5317", 
        "region":"\u5317\u4eac\u5e02","city":"\u5317\u4eac\u5e02","county":"","isp":"\u7535\u4fe1", 
        "country_id":"86","area_id":"100000","region_id":"110000","city_id":"110000", 
        "county_id":"-1","isp_id":"100017"}}

      其中code的值的含义为,0:成功,1:失败。

1 IP转换

  准备好工具,后面就好弄啦, IPHelper提供了各种,IP<->byte[]<->Long 转换

 

 public class IPHelper
{
/// <summary>
/// ip转成long
/// </summary>
/// <param name="ip"></param>
/// <returns></returns>
public static long Ip2Long(string ip)
{
byte[] bytes = Ip2Bytes(ip);
return Bytes2Long(bytes);
}
/// <summary>
/// long转成ip
/// </summary>
/// <param name="ipLong"></param>
/// <returns></returns>
public static string Long2Ip(long ipLong)
{
byte[] bytes = Long2Bytes(ipLong);
return Bytes2Ip(bytes);
}
/// <summary>
/// long转成byte[]
/// </summary>
/// <param name="ipvalue"></param>
/// <returns></returns>
public static byte[] Long2Bytes(long ipvalue)
{
byte[] b = new byte[];
for (int i = ; i < ; i++)
{
b[ - i] = (byte)(ipvalue >> * i & );
}
return b;
}
/// <summary>
/// byte[]转成long
/// </summary>
/// <param name="bt"></param>
/// <returns></returns>
public static long Bytes2Long(byte[] bt)
{
int x = ;
long o = ;
foreach (byte f in bt)
{
o += (long)f << * x--;
}
return o;
}
/// <summary>
/// ip转成byte[]
/// </summary>
/// <param name="ip"></param>
/// <returns></returns>
public static byte[] Ip2Bytes(string ip)
{
string[] sp = ip.Split('.');
return new byte[] { Convert.ToByte(sp[]), Convert.ToByte(sp[]), Convert.ToByte(sp[]), Convert.ToByte(sp[]) };
}
/// <summary>
/// byte[]转成ip
/// </summary>
/// <param name="bytes"></param>
/// <returns></returns>
public static string Bytes2Ip(byte[] bytes)
{
return string.Format("{0}.{1}.{2}.{3}"
, bytes[]
, bytes[]
, bytes[]
, bytes[]);
}
}

2 :多线程疯狂获取IP

  

 /// <summary>
/// 描述:开始采集
/// </summary>
private void StratCollect()
{
foreach (Thread thread in ThreadList)
{
thread.Start();
}
}
/// <summary>
/// 描述:获取要采集的ip long
/// </summary>
private long GetCurrentIp()
{
long curip = System.Threading.Interlocked.Increment(ref CurrentCollectIP);
return curip;
}
/// <summary>
/// 线程中采集的方法
/// </summary>
private void GetTaobaoData()
{
long currentipLong = GetCurrentIp();
while (currentipLong <= EndIP)
{
try
{
CaptureTaobaoIPData(currentipLong);
}
catch (Exception ex)
{
TextLog.SetString(currentipLong + ex.Message);
}
currentipLong = GetCurrentIp();
}
}
/// <summary>
/// 描述:线程中采集并得到IP
/// </summary>
private void CaptureTaobaoIPData(long currentipLong)
{
string ip = IPHelper.Long2Ip(currentipLong);
string url = string.Format(UrlFomat, ip);
string js =HttpHelper. HttpRequest(url, Encoding.UTF8);
taobaoIPdata m = Newtonsoft.Json.JsonConvert.DeserializeObject<TaobaoJsonData>(js).data;
m.ipLong = currentipLong;
//更新界面
this.Invoke(new Action<taobaoIPdata>(v =>
{
taobaoIPdataList.Add(v);
this.dgv.DataSource = taobaoIPdataList;
}), m); }

3 Http请求的Json结果,并反序列化成对象

http请求这个相当简单。网上一大把,这里主要说一下json序列化,在这里本人建议采用Newtonsoft.Json.dll 下载地址: http://json.codeplex.com/ 性能和兼容性达到最好

 

 public class HttpHelper
{
public static string HttpRequest(string url, Encoding encoding)
{
try
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Timeout = * ;
request.Method = "GET";
//得到处理结果
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream myResponseStream = response.GetResponseStream();
StreamReader myStreamReader = new StreamReader(myResponseStream, encoding);
string result = myStreamReader.ReadToEnd();
return result;
}
catch (Exception ex)
{
throw ex;
} } }

Http请求

 taobaoIPdata m = Newtonsoft.Json.JsonConvert.DeserializeObject<TaobaoJsonData>(js).data;

Json序列化

     /// <summary>
/// 淘宝数据
/// </summary>
public partial class taobaoIPdata
{
private long _ipLong;
/// <summary>
/// IP 长整形
/// </summary>
public long ipLong
{
get { return _ipLong; }
set { _ipLong = value; }
} private string _ip;
/// <summary>
/// IP地址
/// </summary>
public string ip
{
get { return _ip; }
set { _ip = value; }
} private string _country;
/// <summary>
/// 国家
/// </summary>
public string country
{
get { return _country; }
set { _country = value; }
} private string _country_id;
/// <summary>
/// 国家编号
/// </summary>
public string country_id
{
get { return _country_id; }
set { _country_id = value; }
} private string _area;
/// <summary>
/// 地区
/// </summary>
public string area
{
get { return _area; }
set { _area = value; }
} private string _area_id;
/// <summary>
/// 地区编号
/// </summary>
public string area_id
{
get { return _area_id; }
set { _area_id = value; }
} private string _region;
/// <summary>
/// 区域
/// </summary>
public string region
{
get { return _region; }
set { _region = value; }
} private string _region_id;
/// <summary>
/// 区域编号
/// </summary>
public string region_id
{
get { return _region_id; }
set { _region_id = value; }
} private string _city;
/// <summary>
///城市
/// </summary>
public string city
{
get { return _city; }
set { _city = value; }
} private string _city_id;
/// <summary>
/// 城市编号
/// </summary>
public string city_id
{
get { return _city_id; }
set { _city_id = value; }
} private string _county;
/// <summary>
/// 县
/// </summary>
public string county
{
get { return _county; }
set { _county = value; }
} private string _county_id;
/// <summary>
/// 县编号
/// </summary>
public string county_id
{
get { return _county_id; }
set { _county_id = value; }
} private string _isp;
/// <summary>
/// 供应商
/// </summary>
public string isp
{
get { return _isp; }
set { _isp = value; }
} private string _isp_id;
/// <summary>
/// 供应商ID
/// </summary>
public string isp_id
{
get { return _isp_id; }
set { _isp_id = value; }
} }
/// <summary>
/// 淘宝api 返回的json数据
/// </summary>
public partial class TaobaoJsonData
{
public int code { get; set; }
public taobaoIPdata data { get; set; }
}

序列号对象taobaoIPdata

4插入到数据库中。。。剩下的自己随便搞啦

源码下载:淘宝IP获取器.rar

淘宝IP地址库采集器c#的更多相关文章

  1. 淘宝IP地址库采集器c#代码

    这篇文章主要介绍了淘宝IP地址库采集器c#代码,有需要的朋友可以参考一下. 最近做一个项目,功能类似于CNZZ站长统计功能,要求显示Ip所在的省份市区/提供商等信息.网上的Ip纯真数据库,下载下来一看 ...

  2. 淘宝IP地址库采集

    作者:阿宝 更新:2016-08-31 来源:彩色世界(https://blog.hz601.org/2016/08/31/taobao-ip-sniffer/index.html) 简述 当初选择做 ...

  3. 用淘宝ip地址库查ip

    这是一个通过调用淘宝ip地址库实现ip地址查询的功能类 using System; using System.Collections.Generic; using System.Linq; using ...

  4. Delphi使用JSON解析调用淘宝IP地址库REST API 示例

    淘宝IP地址库:http://ip.taobao.com,里面有REST API 说明. Delphi XE 调试通过,关键代码如下: var IdHTTP: TIdHTTP; RequestURL: ...

  5. 淘宝IP地址库API接口(PHP)通过ip获取地址信息

    淘宝IP地址库网址:http://ip.taobao.com/ 提供的服务包括: 1. 根据用户提供的IP地址,快速查询出该IP地址所在的地理信息和地理相关的信息,包括国家.省.市和运营商. 2. 用 ...

  6. 淘宝IP地址库API地址

    淘宝IP地址库:http://ip.taobao.com/instructions.php   接口说明 1. 请求接口(GET): http://ip.taobao.com/service/getI ...

  7. WordPress使用淘宝IP地址库的API显示评论者的位置信息(二)

    1 淘宝IP地址库的接口说明 在上一篇文章<WordPress使用淘宝IP地址库的API显示评论者的位置信息(一)>中,vfhky使用了新浪工具提供的这个IP接口显示博客评论者的位置信息. ...

  8. 淘宝IP地址库

    淘宝官方ip地址库 http://ip.taobao.com/ 接口说明 1. 请求接口(GET): http://ip.taobao.com/service/getIpInfo.php?ip=[ip ...

  9. 淘宝ip地址库接口会导致TTFB时间变长,网站打开速度变慢

    前一段时间闲来无事发现别人的网站上有显示当前用户城市的功能,就自己也整了一个 这是淘宝ip地址库调用方法 然后问题就出现了,网站打开速度慢的要死 用F12发现是TTFB太慢,然后百度了,发现了问题的原 ...

随机推荐

  1. 升级phpcms的ckeditor编辑器

    首先说明一下为什么升级?网上很多人升级成了ueditor,可从fckedotror 到 ckeditor,我个人都是比较喜欢的,特别是开放式的插件方式.另外一个就是至少要懂得升级和插件的开发,这样也能 ...

  2. mysql数据安全一之数据恢复案例

    mysql数据安全一之数据恢复案例 --chenjianwen 应用场景:适宜开启binlog 日志功能,定时备份并使用--master-data参数备份,在某个时间点丢失数据,用于数据恢复 开篇总结 ...

  3. django之中间件设置

    中间件 是一个轻量级.底层的插件系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出 激活:添加到Django配置文件中的MIDDLEWARE_CLASSES元组中 每个中间件 ...

  4. maven项目将web2.5改为web3.1

    用maven构建的web项目默认的web.xml为2.3的版本,而我们需要更改为我们想要的版本(3.1). 在这里有两种方式更改web.xml的版本: 第一种: 将项目切换为navigator视图,然 ...

  5. JS 对输入框文本正在输入中校验

    // keyup getInput.keyup(function(){ var a = parseInt(getPrice); var b = parseInt(getInput.val()); // ...

  6. 这几天搞UNITY遇到的坑

    都是在IPHONE设备上遇到的,UNITY版本是5.4.4f1 1.EASY AR出现扫描蓝线绿块的,是因为不是EASY AR的CameraDeviceBehavior默认参数1280X720 2.自 ...

  7. Android APK反编译就这么简单 详解

    在学习Android开发的过程你,你往往会去借鉴别人的应用是怎么开发的,那些漂亮的动画和精致的布局可能会让你爱不释手,作为一个开发者,你可能会很想知道这些效果界面是怎么去实现的,这时,你便可以对改应用 ...

  8. Qt webkitwidgets模块和webenginewidgets模块

    问题 将Qt开发的程序从Qt5.5或更低的版本迁移到5.6或更高的版本时,会提示webkitwidgets是unknown module. Project ERROR: Unknown module( ...

  9. C#中把任意类型的泛型集合转换成SQLXML数据格式的小例子

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.D ...

  10. 并查集 - 1611 The Suspects

    题目地址: http://poj.org/problem?id=1611 分析: - 数据结构 - parent[x] 表示 x 元素的父节点位置. - rank[x] 记录x的子链的长度, 以便在合 ...