Perl POST自动化和

时间:2013-07-18 20:05:48

标签: perl csrf http-post

我希望自动化一个快速脚本,从一个名为ycharts.com的财务数据网站获取一些数据。一个简单的例子就是拉动过去3年1月份谷歌的市盈率。我已经编写了用于提取数字的脚本,我的问题是发送POST请求并让它返回有意义的数据。这是我目前的程序,仅用于提取数据,我可以在找到解决方案后完成其余的工作。 (另外,这不是为了获利,而是为了我的大学研究。)

#!/usr/bin/perl

use strict;
use warnings;
use LWP::UserAgent;

my $ua = LWP::UserAgent->new();
my $url = 'http://ycharts.com/companies/GOOG/pe_ratio';
my $formdata = [
                pageNum => 1,
                startDate => 12/31/2004,
                endDate => 01/03/2013,
                ];

my $response = $ua->post($url, $formdata);
die "Error: ", $response->status_line, "\n"
    unless $response->content;

print $response->content;

但这是我打印时得到的内容。

<!DOCTYPE html>    
<html lang="en">
<head>
  <meta http-equiv="content-type" content="text/html; charset=utf-8">
  <meta name="robots" content="NONE,NOARCHIVE">
  <title>403 Forbidden</title>
  <style type="text/css">
    html * { padding:0; margin:0; }
    body * { padding:10px 20px; }
    body * * { padding:0; }
    body { font:small sans-serif; background:#eee; }
    body>div { border-bottom:1px solid #ddd; }
    h1 { font-weight:normal; margin-bottom:.4em; }
    h1 span { font-size:60%; color:#666; font-weight:normal; }
    #info { background:#f6f6f6; }
    #info ul { margin: 0.5em 4em; }
    #info p, #summary p { padding-top:10px; }
    #summary { background: #ffc; }
    #explanation { background:#eee; border-bottom: 0px none; }
  </style>
</head>
<body>
<div id="summary">
  <h1>Forbidden <span>(403)</span></h1>
  <p>CSRF verification failed. Request aborted.</p>

</div>

<div id="explanation">
  <p><small>More information is available with DEBUG=True.</small></p>
</div>

</body>
</html>

我已就该主题做了大量研究,似乎无法找到解决方案。任何帮助将不胜感激,但我不想浪费任何人的时间。 (如果这需要花费大量的精力来解决,请不要因为解决方案而疯狂,只要告诉我,我就会接受失败。)

1 个答案:

答案 0 :(得分:3)

您的程序可能存在几个问题。由于请求错误,您的程序无法获取所需的数据;你需要POST到另一个URL。生命也很短暂,所以请使用WWW::Mechanize

use WWW::Mechanize qw();
my $mech = WWW::Mechanize->new;

# $mech->agent_alias("Windows IE 6");
$mech->get("http://ycharts.com/companies/GOOG/pe_ratio"); #receiving cookies

#don't use Regular expressions to parse HTML!
$mech->form_id("popupRegFree");
my ($csr_input) = $mech->find_all_inputs(name => 'csrfmiddlewaretoken');
my $token = $csr_input->value();

#$mech->add_header( "Referer", "http://ycharts.com/companies/GOOG/pe_ratio" );
#$mech->add_header(
#    "X-Requested-With", "XMLHttpRequest");
#$mech->add_header( "Content-Type",
#    "application/x-www-form-urlencoded; charset=UTF-8" );
$mech->add_header("X-CSRFToken", $token);

$mech->post("http://ycharts.com/companies/GOOG/pe_ratio/data_ajax",
    Content =>
      {pageNum => 1, startDate => "12/31/2004", endDate => "01/03/2013"});

print $mech->content();