获取指定天数内的中行外汇牌价历史记录(美元兑人民币)

There's more than one way to do it!
https://metacpan.org http://perlmonks.org
头像
523066680
Administrator
Administrator
帖子: 461
注册时间: 2016年07月19日 12:14
拥有现金: 锁定
储蓄: 锁定
Has thanked: 51 times
Been thanked: 90 times
联系:

获取指定天数内的中行外汇牌价历史记录(美元兑人民币)

帖子 #1 523066680 » 2016年09月05日 17:47

天数在20行设置,-7 表示从七天前开始。
my @other_day = daychange( @today, -7 );

  1. =info
  2.     获取中行外汇牌价-美元栏目的信息
  3.     Code-By: 523066680
  4.        Date: 2015-08
  5. =cut
  6.  
  7. use strict;
  8. use LWP::Simple;
  9. use Encode;
  10. use IO::Handle;
  11. STDOUT->autoflush(1);
  12.  
  13. our $data = [];
  14. our @all;
  15.  
  16. our $FH;
  17. my $stream;
  18.  
  19. my @today = time2year_mon_day( time() );
  20. my @other_day = daychange( @today, -7 );
  21.  
  22. my $fname = sprintf "USD %d-%02d-%02d to %d-%02d-%02d.txt",
  23.                     @other_day, @today;
  24.  
  25. open $FH, ">:raw:crlf", $fname or die "$!";
  26. $FH->autoflush(1);
  27.  
  28.  
  29. my $A = join("-", @today) ;
  30. my $B = join("-", @other_day) ;
  31. my $i = 1;
  32. my $curpg;
  33. my $prvpg = -1;
  34.  
  35. while (1)
  36. {
  37.     print "Getting Page: $i\n";
  38.     @all = ();
  39.     $stream = get(  
  40.                 "http://srh.bankofchina.com/search/whpj/search.jsp?" .
  41.                 "erectDate=${A}&nothing=${B}&pjname=1316".
  42.                 "&page=$i"
  43.             );  #unicode            
  44.    
  45.     $stream =~/var m_nCurrPage = (\d+)/;
  46.     $curpg = $1;
  47.     last if ($curpg == $prvpg);    #页面并不会因为页码超出范围而404,超出后会指向有效的最后一页
  48.                                    #如果返回页码和上次一致,判定为结束
  49.    
  50.     @all=split('\n', $stream);
  51.     get_info();
  52.  
  53.     $i++;
  54.     $prvpg = $curpg;
  55. }
  56.  
  57. close $FH;
  58.  
  59. <STDIN>;
  60.  
  61. sub get_info
  62. {
  63.     our @all;
  64.     our $FH;
  65.  
  66.     my ($i, @arr);
  67.  
  68.     $i=0;
  69.     foreach (@all)
  70.     {
  71.         if (/th>(.*)<\/th>/)
  72.         {
  73.             $arr[$i++] = encode('gbk',$1);
  74.         }
  75.     }
  76.  
  77.     #获取美元信息
  78.     my $spec = decode('utf-8',"<td>美元<\/td>");
  79.     my $begin = 0;
  80.     my $j = 0;
  81.  
  82.     foreach (0..$#all)
  83.     {
  84.         if ($all[$_]=~/$spec/i)
  85.         {
  86.             $begin=1;
  87.             print $FH "\n";
  88.         }
  89.         if ($begin==1 and $j < $i )
  90.         {
  91.             next if ($all[$_]=~/^\s+$/); #如果是空行
  92.             $all[$_]=~/td>(.*)<\/td>/i;
  93.             print $FH encode('gbk',$1), "\t";
  94.             $j++;
  95.         }
  96.         if ($all[$_]=~/<\/tr>/)   #末尾重置
  97.         {
  98.             $j=0;
  99.             $begin=0;
  100.         }
  101.     }
  102. }
  103.  
  104. sub time2year_mon_day
  105. {
  106.     my $t = shift;
  107.     my ($sec, $min, $hour, $day, $mon, $year) = localtime( $t );
  108.     $mon += 1;
  109.     $year += 1900;
  110.     return ($year,$mon,$day);
  111. }
  112.  
  113. sub daychange
  114. {
  115.     use Time::Local;
  116.     my ($year, $mon, $day, $days) = @_;
  117.  
  118.     #转为time格式(从1970年1月1日开始计算的秒数)
  119.     my $t = timelocal(0, 0, 0, $day, $mon-1, $year)
  120.             + $days * 24 * 3600;
  121.  
  122.     no Time::Local;
  123.  
  124.     return time2year_mon_day($t);
  125. }


数据可视化的部分做的不好,等有空继续完善
01.png
您没有权限查看这个主题的附件。

头像
523066680
Administrator
Administrator
帖子: 461
注册时间: 2016年07月19日 12:14
拥有现金: 锁定
储蓄: 锁定
Has thanked: 51 times
Been thanked: 90 times
联系:

Re: 获取指定天数内的中行外汇牌价历史记录(美元兑人民币)

帖子 #2 523066680 » 2019年05月19日 07:29

项目地址:https://github.com/vicyang/Exchange-Rates

snap02.png
snap01.png


环境配置
推荐 Strawberry Perl Portable PDL Edition

在 Strawberry Perl 的基础上需要添加的模块
Font::FreeType
HTML::TableExtract
Math::Geometry::Delaunay
您没有权限查看这个主题的附件。


回到 “Perl”

在线用户

用户浏览此论坛: Baidu [Spider] 和 1 访客