淘宝IP地址库采集器c#代码
发布时间:2022-01-15 22:42:33
采集器概貌,如下:
最近做一个项目,功能类似于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[4];
for (int i = 0; i < 4; i++)
{
b[3 - i] = (byte)(ipvalue >> 8 * i & 255);
}
return b;
}
/// <summary>
/// byte[]转成long
/// </summary>
/// <param name="bt"></param>
/// <returns></returns>
public static long Bytes2Long(byte[] bt)
{
int x = 3;
long o = 0;
foreach (byte f in bt)
{
o += (long)f << 8 * 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[0]), Convert.ToByte(sp[1]), Convert.ToByte(sp[2]), Convert.ToByte(sp[3]) };
}
/// <summary>
/// byte[]转成ip
/// </summary>
/// <param name="bytes"></param>
/// <returns></returns>
public static string Bytes2Ip(byte[] bytes)
{
return string.Format("{0}.{1}.{2}.{3}"
, bytes[0]
, bytes[1]
, bytes[2]
, bytes[3]);
}
}
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/ 性能和兼容性达到最好
Http请求
public class HttpHelper
{
public static string HttpRequest(string url, Encoding encoding)
{
try
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Timeout = 6 * 1000;
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;
}
}
}
Json序列化
taobaoIPdata m = Newtonsoft.Json.JsonConvert.DeserializeObject<TaobaoJsonData>(js).data;
序列号对象taobaoIPdata
/// <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
猜你喜欢
- OOP语言的三大特征即:面向对象的三个比较重要的思想封装官话:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口进
- 前言我们在很多博客中都有发现,Seata AT模式里面的全局锁其实是行锁,这也是Seata AT模式和XA模式在锁粒度上的最大区别。我们可以
- 一,Maven 依赖 pom.xml配置1, 去掉默认日志,以便切换到log4j2的日志依赖2, 然后添加如下两个日志依赖二,在工程根目录下
- 1、抽象类 vs 接口 方法类型: 接口只能有抽象方法。抽象类可以有抽象和非抽象方法。从 Java 8 开始,它也可以有默认和静态
- public class MD5Check {/*** 默认的密码字符串组合,用来将字节转换成 16 进制表示的字符,apache校验下载的
- 前言:由于项目需求,短信验证码的接口需要换成阿里大于的,但是尴尬的发现阿里大于的jar包没有maven版本的,于是便开始了一上午的 * 引包之
- 一、前言ConcurrentHashMap的源码采用了一种比较独特的方式对map中的元素数量进行统计,自然是要好好研究一下其原理思想,同时也
- 前言:时间过得真是快,现在已经是2022年了。作为开发来说,时间处理是非常繁琐的。从Java 8开始有了Java 8 T
- 在Java的学习中,涉及到两个系统环境变量path和classpath一. path环境变量path环境变量是系统环境变量的一种,它用于保存
- 最近,阿里开源的nacos比较火,可以和springcloud和dubbo共用,对dubbo升级到springcloud非常的方便。这里学习
- 前言春节要到了,看惯了前端各种小游戏,确实做得很好,很精致。但是我也要为后端程序员稍微做一点贡献,做一款java版本的【年兽大作战】。这个游
- 一本书的页码从自然数1开始顺序编码直到自然数n。书的页码按照通常的习惯编排,每个页码都不含多余的前导数字0。例如第6页用6表示而不是06或0
- Java多线程线程的创建1.继承Thread2.实现Runnable3.实现Callable使用继承Thread类来开发多线程的应用程序在设
- 使用wait()和notify()实现Java多线程通信:两个线程交替打印A和B,如ABABABpublic class Test { &n
- File类File类事java.io包中唯一代表磁盘文件本身的对象。File类定义了一些与平台无关的方法来操作文件,可以通过调用File类中
- 本文实例为大家分享了java GUI学生图书管理的具体代码,供大家参考,具体内容如下- mysql数据库建表:1.book表 2.bs借书记
- springmvc 中的 * 可以对请求进行判别, 在请求到达控制器之前, 把非法的请求给拦截掉下面来说一说, 它在springboot中的
- SpringBootWeb开发回顾一下:springboot帮助我们配置了什么,能不能进行修改,能修改哪些,能否扩展?xxxAutoConf
- 已经有很多关于 Flutter WebView 的文章了,为什么还要写一篇。两个原因:Flutter WebView 是 Flutter 开
- 方法1 :利用Struts 2的支持的可配置结果,可以达到过滤器的效果。Action的处理结果配置支持正则表达式。但是如果返回的对象是一个数