网站使用 AJAX 请求构建表格。这些有点难以解析。您可以使用WWW::Mechanize 获取初始页面,然后点击表格的AJAX 调用。它可以帮助您自动跟踪 cookie 和内容。
use strict; use warnings;
use WWW::Mechanize;
my $mech = WWW::Mechanize->new;
$mech->get('http://ycharts.com/companies/GOOG/pe_ratio#series=type:company,id:GOOG,calc:pe_ratio,,id:AAPL,type:company,calc:pe_ratio,,id:AMZN,type:company,calc:pe_ratio&zoom=3&startDate=&endDate=&format=real&recessions=false');
my $response = $mech->post(
'http://ycharts.com/companies/GOOG/pe_ratio/data_ajax',
{
startDate => '1/1/1962',
endDate => '12/3/2013',
pageNum => 4,
}
);
if ( $response->is_success ) {
print $response->decoded_content; # or whatever
} else {
die $response->status_line;
}
这只是一个基本示例,不会起作用。它给出了403 Forbidden。可能需要更多数据。使用 Firebug 或类似工具来检查正在发生的事情。例如,对http://ping.chartbeat.net/ping?h=ycharts.com&p=%2Fcompanies%2FGOOG%2Fpe_ratio&u=o3m6snxteynby1b8&d=ycharts.com&g=20054&n=1&f=00001&c=10.81&x=200&y=1812&o=1663&w=658&j=30&R=0&W=1&I=0&E=109&e=6&b=1903&t=usmc0fjfd1j0h87g&V=16&_ 的另一个调用不时自动发生,参数不同。这很可能是保持会话进行所必需的。
这个页面非常复杂。这可能不是最好的方法。
您也可以尝试使用 WWW::Mechanize::Firefox 甚至 Selenium 来远程操作浏览器。这将更适合,因为它会处理所有正在发生的 AJAX 问题。
或者您可以寻找一个自愿交出数据的公共 API。我敢打赌周围有一个……或者只是支付一个 ycharts 专业帐户并点击下载按钮。 ;-)