zoukankan      html  css  js  c++  java
  • 数据采集:完美下载淘宝Ip数据库 简单的程序节省60元人民币而不必购买数据库

    曾经做网站类型的程序时,经常需要收集客户端的访问数据,然后加以分析。这需要一个Ip数据库,数据表中显示Ip所在的省份市区等信息。网络上有流传的Ip纯真数据库,一些公开的Web服务也可以查询Ip地址信息,但是24小时内超过查询次数就需要购买商业授权,网站myds.net上提供了Ip数据库下载,不过需要收取60元人民币。

    最后一种方法,也就是不花钱的办法,用C#调用淘宝的Ip地址库,准确率高,而且查询次数不限制。

    先参考网方提供的文档:

    淘宝IP地址库,提供API

    地址:http://ip.taobao.com/

    提供的服务包括: 
    1. 根据用户提供的IP地址,快速查询出该IP地址所在的地理信息和地理相关的信息,包括国家、省、市和运营商。 
    2. 用户可以根据自己所在的位置和使用的IP地址更新我们的服务内容。 
    优势: 
    1. 提供国家、省、市、县、运营商全方位信息,信息维度广,格式规范。 
    2. 提供完善的统计分析报表,省准确度超过99.8%,市准确度超过96.8%,数据质量有保障。

    接口说明

    1. 请求接口(GET): 
    http://ip.taobao.com/service/getIpInfo.php?ip=[ip地址字串] 
    2. 响应信息: 
    (json格式的)国家 、省(自治区或直辖市)、市(县)、运营商 
    3. 返回数据格式: 
    {"code":0,"data":{"ip":"210.75.225.254","country":"u4e2du56fd","area":"u534eu5317", 
    "region":"u5317u4eacu5e02","city":"u5317u4eacu5e02","county":"","isp":"u7535u4fe1", 
    "country_id":"86","area_id":"100000","region_id":"110000","city_id":"110000", 
    "county_id":"-1","isp_id":"100017"}} 
    其中code的值的含义为,0:成功,1:失败。

    步骤1 : 找到枚举互联网Ip地址的方法

    StackOverflow上面有一篇文章,讲解如何枚举所有的互联网Ip地址。请参考 C# Enumerate IP addresses in a range - Stack Overflow

    请看下面的Ip地址参数例子

    '192.0.2.1'  一个Ip地址 
    '192.0.2.0-31'   枚举192.0.2.0-192.0.2.31 一共32个Ip地址 
    '192.0.2-3.1-254'  枚举192.0.2.1-192.0.2.254和  192.0.3.1-192.0.3.254 一共254个IP地址 
    '0-255.0-255.0-255.0-255'   枚举互联网上所有的IPv4地址

    代码中的调用方法

    string pattern="200.64-71.0-255.0-255"; IPRange ipRange=new IPRange(pattern); List<IPAddress> addresses=ipRange.GetAllIP();

    这样,就得到了所有的Ip地址。

    步骤2:依此发送Web请求,得到Json返回值

    参考下面的代码,得到每个Ip地址的查询结果

    WebRequest request = HttpWebRequest.Create("http://ip.taobao.com/service/getIpInfo.php?ip-200.9.210.200"); request.Credentials = CredentialCache.DefaultCredentials; HttpWebResponse response = (HttpWebResponse) request.GetResponse(); Stream dataStream = response.GetResponseStream(); StreamReader reader = new StreamReader(dataStream); string responseFromServer = reader.ReadToEnd(); reader.Close(); dataStream.Close(); response.Close(); 

    这里为了提高性能,可以用多线程,也可以并行方法,如下面的代码例子

    Parallel.ForEach(addresses, (address)=> { …… });3 解析请求的Json结果,生成DataTable

    把Json变成.NET Object有几种方法。著名的JSON.NET自然很容易就实现,但是不我想依赖第三方的库,.NET内置的JavaScriptSerializer可以实现这个目的。

    JavaScriptSerializer serializer=new JavaScriptSerializer(); object obj=serializer.Deserialize<object>(json); Dictionary<string,object> ip=obj as Dictionary<string,object>

    Json解析的结果,是二个Dictionary,第一个默认是0,我取第二个字典项的Value的值,它是一个字符串Array

    于是,根据这个字符串数组,生成表的列。

    4  合并所有Ip地址的DataTable数据到一个DataTable中,并把它写到Access数据库中

    先创建一个结果表,用于存放每个Ip地址采集的数据

    DataTable final=new DataTable() ...json => DataTable table; if(final.Columns.Count==0) final=table.Clone(); final.Merge(table);

    再创建一个AccessHelper类型,可以直接写数据到文件中。

    AccessHelper access=new AccessHelper(@"C:DataIp.accdb"); access.AppendData(final);

    它会根据DataTable的结构,自动生成创建Access表结构的SQL语句,再把DataTable中的数据以参数的方式插入到

    数据表中。 这里应该注意,不应该用Microsoft.Jet.Oledb4.0,Jet很早就停止开发,并且不能在x64的电脑中运行。一种办法是要将Target设成x86,或是使用Access Runtime 2007,它提供了Microsft.Ace.12.0,这个新的驱动程序,可以运行于x64系统中,并且支持新的accdb格式的数据库。

    原文地址:http://www.cnblogs.com/JamesLi2015/p/3145372.html

  • 相关阅读:
    常见寻找OEP脱壳的方法
    Windows内核原理系列01
    HDU 1025 Constructing Roads In JGShining's Kingdom
    HDU 1024 Max Sum Plus Plus
    HDU 1003 Max Sum
    HDU 1019 Least Common Multiple
    HDU 1018 Big Number
    HDU 1014 Uniform Generator
    HDU 1012 u Calculate e
    HDU 1005 Number Sequence
  • 原文地址:https://www.cnblogs.com/zhanghai/p/4461166.html
Copyright © 2011-2022 走看看