2011年8月14日 星期日

資料收集者的福音~網頁表格殺手,又是Perl發功(股票)

你是不是對一些公司基本面感到興趣?
你是不是很懶的去抄那一堆資料?
你還在用手算?

各位認識小弟的股友們有福了,信我,沒辦法給你上天堂,也沒辦法給永生,但是,讓你多空出點時間陪家人這小事還是做得到,底下的是Perl寫的webTableKiller,這網頁表格殺手主要功能就是把網頁上面的資料抓下來,讓後面串接的Script可以快速的取得網頁的資料,我是拿Yahoo的股市當祭品做出來。

Perl的特色是垮平台都可以使用,也可以找Perl2Exe轉成Windows執行檔(不建議)。

$./webTableKiller <網址> <取出目標欄位的.CSV檔案>











#!/usr/bin/perl
use LWP;
use HTML::TreeBuilder;
use Text::Iconv;

my $url="http://tw.stock.yahoo.com/d/s/company_3115.html"; 

if(defined $ARGV[0]){
  if($ARGV[0] =~ /^http/){
    $url=$ARGV[0];
  }
}

my $showAll=0;
my @getList;
my $getLists;

if(defined $ARGV[1]){
  if($ARGV[1] =~ /\.csv$/i){
    if(open(FH, "<$ARGV[1]")){
      @getList=;
      close FH;
    }
  }
}

foreach (@getList){
   $getLists.=$_;
}

my $ua=LWP::UserAgent->new;
my $res=$ua->get($url);
die "Can't get $url ", $res->status_line unless $res->is_success;
my $html=$res->content;

$converter = Text::Iconv->new("big5", "utf8");
$html = $converter->convert("$html");
#print "$html\r\n";

my $root=HTML::TreeBuilder->new_from_content($html);

my $layer=0;

&parserLookDown($root,$layer);

sub isOnList{
  my $currentPos=shift;
  my $count=0;

  foreach(@getList){
    if($_ =~ /$currentPos/){
      #print "$currentPos/\t$_\n";
      $count++;
    }
  }

  return $count;
}

sub parserLookDown{
  my $root=shift;
  my $layer=shift;
  $layer++;
  my @tables=$root->look_down(_tag=>'table');
  for my $i(0 .. @tables-1){
    my $tmp=$tables[$i]->as_trimmed_text;
    my @trs=$tables[$i]->look_down(_tag=>'tr');
    for my $j(0 .. @trs-1){
      my @tds=$trs[$j]->look_down(_tag=>'td');
      for my $k(0 .. @tds-1){
 if($tds[$k]->as_HTML =~ /table/){
   &parserLookDown($tds[$k],$layer);
 }
 my $tmp=$tds[$k]->as_trimmed_text;
 $_=~s/\ //g;
 if(@getList > 0){
   my $currentPos="$layer,$i,$j,$k";
   if(&isOnList($currentPos) > 0){
    print "$tmp,";
   }
 }else{
   print "($layer,$i,$j,$k)$tmp,";
 }
      }
      if(@getList <= 0){
 print "\r\n";
      }
    }
  }
}

$root->delete;

沒有留言:

張貼留言