工作中经常要查看IP地址位于的地址信息,没错,www.ip138.com可以查询到.但是当大批量的查询时,你该怎么办?难道也要一个一个去查询?这种重复性的工作非常耽误时间,不如写个脚本.实现批量查询,脚本和本人博客中的查询手机SIM卡所在省份所使用的方法一样.我也处于刚起步的菜鸟阶段.希望和大家一起学习...

脚本如下:

  1. #!/usr/bin/perl -w  
  2. use warnings;  
  3. use strict;  
  4. use LWP::UserAgent;  
  5. use HTML::TreeBuilder;  
  6. my $ip_url = 'http://www.ip138.com/ips8.asp?ip=';  
  7. if (@ARGV != 1){ 
  8.     die "Usage: ./$0 <ip_list> or <ip_addr>..\n"
  9.  } 
  10. foreach (&get_ip_list()) {  
  11.         print "$_\t";  
  12.         my $link = $ip_url."$_"."&action=2";  
  13. #       print "$link\n";  
  14.         my $cont = get_html("$link");  
  15. #       print "$cont\n";  
  16.         my $table = $1 if $cont =~ m{<table width="80%"  border="0" align="center" cellpadding="0" cellspacing="0">(.*?)</table>}s;  
  17.         $table =~ s/本站主数据://g;  
  18.         $table =~ s/参考数据一//g;  
  19. #print "$table\n";  
  20.         my $tree = HTML::TreeBuilder->new();  
  21.            $tree->strict_comment(1);  
  22.            $tree->parse($table);  
  23.            $tree->eof();  
  24.   
  25.         my $tr = ($tree->find_by_tag_name('tr'))[2];  
  26.         my @kids = $tr->content_list();  
  27. #       print "@kids\n"  
  28.         if (@kids and ref $kids[0] and $kids[0]->tag() eq 'td'){  
  29.                 print $kids[0]->as_text( ),"\n";  
  30.                 }  
  31.            $tree->delete;  
  32.         sleep(1);  
  33. sub get_html {  
  34.         my $browser = LWP::UserAgent->new();  
  35.            $browser->agent('Mozilla/4.0 (compatible;MSIE 6.0;Windows NT 5.1; SV1)');  
  36.         my $resp = $browser->get(@_);  
  37.         return $resp->content;  
  38. }  
  39. sub get_ip_list{ 
  40.     my @ip_list = (); 
  41.     if(!(-r $ARGV[0] and -f _ and -w _)){ 
  42.           @ip_list = split (/\s/,$ARGV[0]); 
  43.     }else
  44.           open IP,"$ARGV[0]" or die "$ARGV:$!\n"
  45.         while(<IP>){ 
  46.             chomp; 
  47.             $_ =~ s/^\s+//; 
  48.             $_ =~ s/\s+$//; 
  49.             next if $_ =~ m/^#/; 
  50.             next if $_ eq ''
  51.             $_ =~ m/((?:\d+\.){3}\d+)/; 
  52.             push (@ip_list,$1); 
  53.     } 
  54.   } 
  55.     return @ip_list; 

结果类似于:

总感觉不是很严谨..少点什么东西..望高手指教.