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

  • 相关阅读:
    WM_SIZE和WM_MOVE的函数体内容为什么不一样?
    java调用计算机显示文档
    把消息送到默认窗口函数里,并非一点用都没有,可能会产生新的消息(以WM_WINDOWPOSCHANGED为例)
    使用SetWindowPos API函数移动窗口后,还需修改Delphi的属性值,以备下次使用,否则就会出问题(不是API不起作用,而是使用了错误的坐标值)
    Delphi调用WINAPI时到底应该是指针还是结构体(注意是Delphi变量本身就是指针)
    TWinControl.SetBounds与TWinControl.UpdateBounds赏析(定义和调用)
    delphi的取整函数round、trunc、ceil和floor
    2013Esri全球用户大会之互操作和标准
    Delphi判断文件是否正在被使用(CreateFile也可以只是为了读取数据,而不是创建)
    Delphi 的运算符列表,运算符及优先级表格 good
  • 原文地址:https://www.cnblogs.com/zhanghai/p/4461166.html
Copyright © 2011-2022 走看看