HTML::TableExtract - HTML 表格提取

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

HTML::TableExtract - HTML 表格提取

帖子 #1 523066680 » 2017年10月12日 20:24

以获取外汇牌价为例

代码: 全选

Getting Page: 1
货币名称    现汇买入价   现钞买入价   现汇卖出价   现钞卖出价   外管局中间价  中行折算价   发布时间   
美元  657.61  652.21  660.25  660.25  658.08  658.08  2017.10.12 20:13:46
美元  657.61  652.21  660.25  660.25  658.08  658.08  2017.10.12 20:04:31
美元  657.61  652.21  660.25  660.25  658.08  658.08  2017.10.12 20:04:31
美元  657.61  652.21  660.25  660.25  658.08  658.08  2017.10.12 19:54:38
美元  657.61  652.21  660.25  660.25  658.08  658.08  2017.10.12 19:37:28
美元  657.61  652.21  660.25  660.25  658.08  658.08  2017.10.12 19:04:57
美元  657.51  652.11  660.15  660.15  658.08  658.08  2017.10.12 19:02:32
美元  657.51  652.11  660.15  660.15  658.08  658.08  2017.10.12 18:37:34
美元  657.51  652.11  660.15  660.15  658.08  658.08  2017.10.12 18:32:19
美元  657.51  652.11  660.15  660.15  658.08  658.08  2017.10.12 17:56:23
美元  657.51  652.11  660.15  660.15  658.08  658.08  2017.10.12 17:31:39
美元  657.51  652.11  660.15  660.15  658.08  658.08  2017.10.12 17:28:20
美元  657.46  652.06  660.1   660.1   658.08  658.08  2017.10.12 17:24:10
美元  657.46  652.06  660.1   660.1   658.08  658.08  2017.10.12 17:14:09
美元  657.41  652.01  660.05  660.05  658.08  658.08  2017.10.12 17:10:01


Code: [全选] [展开/收缩] [Download] (Untitled.txt)
  1. =info
  2.     获取中行外汇牌价-美元栏目的信息
  3.     Auth: 523066680
  4.     Date: 2017-10
  5.     https://github.com/vicyang/Exchange-Rates
  6. =cut
  7.  
  8. use Encode;
  9. use Time::Local;
  10. use File::Slurp;
  11. use LWP::UserAgent;
  12. use HTML::TableExtract;
  13.  
  14. use IO::Handle;
  15. STDOUT->autoflush(1);
  16.  
  17. our $URL = "http://srh.bankofchina.com/search/whpj/search.jsp";
  18. our $FH;
  19. open $FH, ">:raw", "history.txt" or die "$!";
  20.  
  21. our $ua = LWP::UserAgent->new(
  22.             timeout => 5, keep_alive => 1, agent => 'Mozilla/5.0',
  23.           );
  24.  
  25. my $from = time_to_date(time() - 24*3600*1);
  26. my $to   = time_to_date(time());               # today
  27.  
  28. my $pageid = 1;
  29. my $content;
  30.  
  31. while (1)
  32. {
  33.     print "Getting Page: $pageid\n";
  34.     $content = get_page( $from, $to, $pageid );
  35.  
  36.     #页码超出后会指向有效的最后一页而非404,实际页码不同步时结束循环
  37.     $content =~/var m_nCurrPage = (\d+)/;
  38.     last if ( $1 != $pageid );
  39.  
  40.     get_info( $content );
  41.     $pageid++;
  42. }
  43.  
  44. close $FH;
  45. printf("Done\n");
  46.  
  47.  
  48. sub get_info
  49. {
  50.     my $html_str = shift;
  51.    
  52.     # count => 1 表示选择第二个表格。
  53.     my $obj = HTML::TableExtract->new( depth => 0, count => 1 );
  54.     $obj->parse($html_str);
  55.  
  56.     my $table;
  57.     grep { $table = $_ } $obj->tables;
  58.  
  59.     for my $row ( $table->rows )
  60.     {
  61.         next if ( $row->[1] eq '' );  #表格最末一行为空
  62.         grep { print encode('gbk', decode('utf8', $_)), "\t" } @$row;
  63.         print "\n";
  64.     }
  65. }
  66.  
  67. sub get_page
  68. {
  69.     our $ua;
  70.     my ($from, $to, $pageid) = @_;
  71.     my $res;
  72.     $res = $ua->post(
  73.         $URL,
  74.         [
  75.             erectDate => $from,
  76.             nothing   => $to,
  77.             pjname    => "1316",
  78.             page      => $pageid
  79.         ]
  80.     );
  81.     return $res->content();
  82. }
  83.  
  84. sub time_to_date
  85. {
  86.     my ($sec, $min, $hour, $day, $mon, $year) = localtime( shift );
  87.     $mon += 1;
  88.     $year += 1900;
  89.     return sprintf "%d-%02d-%02d", $year,$mon,$day;
  90. }

回到 “模块”

在线用户

用户浏览此论坛: 没有注册用户 和 0 访客