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;
     
    }
  • 相关阅读:
    发现个atan2的正确使用方式
    Forward+ Shading架构
    fatal: unable to connect to gitee.com: gitee.com[0: 180.97.125.228]: errno=Unknown error 解决方案
    HDFS HA(高可用性)集群规划
    如何使用RTP引擎对语音编码进行转码
    关于 Angular 应用 tsconfig.json 中的 target 属性
    浅谈 Orbeon form builder 的权限控制
    关于 Angular 应用 tsconfig.json 中的 lib 属性
    orbeon form 通过 url 的方式同第三方应用集成的开发明细
    orbeon form 的配置介绍
  • 原文地址:https://www.cnblogs.com/mcshell/p/5655802.html
Copyright © 2011-2022 走看看