zoukankan      html  css  js  c++  java
  • 使用coro+anyevent 异步协程获取IP运营商

    主要使用coro协程+AnyEvent::HTTP::LWP::UserAgent 异步http请求,查询数据库中IP字段,返回运营商。如需要获取其他类型的字段,修改正则即可,

    此方法的好处是,不需要获取本地IP库,提高IP精准度。缺点,需要很好的网络质量。CODE如下:

    #查询IP的网络提供商
    sub search_ip_area {
        my $self = shift;
        my ( $dsn, $dbuser, $dbpass, $ips ) = @_;
        my $ua = AnyEvent::HTTP::LWP::UserAgent->new;
        my $dbh = AnyEvent::DBI::MySQL->connect( $dsn, $dbuser, $dbpass );
        my $ipArea;
     
        
    #定义运营商字段
        my $operators = {
            "xe7x94xb5xe4xbfxa1" => 'telecom',
            "xe7xa7xbbxe5x8axa8" => 'mobile',
            "xe8x81x94xe9x80x9a" => 'unicom',
            "xe6x9cxaaxe7x9fxa5" => 'unknowPublic'
        };
        my @coro = map {
            my ( $ip, $id ) = split /:/, $_;
            my $url = "http://www.baidu.com/s?wd=$ip";
     
            async {
                my $r       = $ua->get($url);
                my $content = $r->content;
                
    #正则提取运营商
                if ( $content
                    =~ /<div[^"]+".*?op-ip-detail">[sS]+?</span>S+s+([^<]+)</td/g
                    )
                {
                    my $ipHash;
                    my $area = $1;
                    $area =~ s/s+//g;
     
                    
    #匹配电信、移动、联通、腾讯集团
                    
    #xe7x94xb5xe4xbfxa1 电信
                    
    #xe7xa7xbbxe5x8axa8 移动
                    
    #xe8x81x94xe9x80x9a 联通
                    
    #xe8x85xbexe8xaexafxe9x9bx86xe5x9bxa2 腾讯集团
                    if ( $area
                        =~ /(xe7x94xb5xe4xbfxa1|xe7xa7xbbxe5x8axa8|xe8x81x94xe9x80x9a)/
                        )
                    {
                        
    #插入运营商字段
                        $ipHash->{$id} = $ip;
     
                        update_pt_data( $dbh, $ipHash,
                            'system_info', $operators->{$1}, 'id' );
                        $ipArea->{"$ip:$id"} = $operators->{$1};
                    }
                    elsif ( $area
                        =~ /xe8x85xbexe8xaexafxe9x9bx86xe5x9bxa2/ )
                    {    
    #对特殊字段 腾讯集团处理
                        $ipHash->{$id} = $ip;
     
                        update_pt_data( $dbh, $ipHash, 'system_info',
                            $operators->{"xe7x94xb5xe4xbfxa1"}, 'id' );
                        $ipArea->{"$ip:$id"}
                            = $operators->{"xe7x94xb5xe4xbfxa1"};
                    }
                    else {    
    #对未知运营商处理,并且处理
                        $ipHash->{$id} = $ip;
     
                        update_pt_data( $dbh, $ipHash, 'system_info',
                            $operators->{"xe6x9cxaaxe7x9fxa5"}, 'id' );
                        $ipArea->{"$ip:$id"}
                            = $operators->{"xe6x9cxaaxe7x9fxa5"};
                    }
     
                }
                else {
                    $ipArea->{"$ip:$id"}
                        = $operators->{"xe6x9cxaaxe7x9fxa5"};
                }
            }
        } keys %$ips;
        for (@coro) {
            $_->join;
        }
        return $ipArea;
     
    }
  • 相关阅读:
    摘:SQL Server数据类型的25种
    二维码简介和容错率的问题
    PHP QR Code
    Git 更新操作
    [转载]ecmall语言包程序
    linux 从百度网盘下载文件的方法
    Linux定时备份数据到百度云盘
    nginx整合php+lua+oracle环境搭建
    php 36进制与10进制转换
    “互联网+”取代O2O将成为2016最大风口
  • 原文地址:https://www.cnblogs.com/mcshell/p/5655802.html
Copyright © 2011-2022 走看看