0

我正在尝试提交表单而不填写任何内容并获取响应页面。

#!/usr/bin/perl -w

use LWP::UserAgent;
use HTTP::Request::Common;

$ua= LWP::UserAgent->new;
$req= POST('http://polling.newspoll.com.au/cgi-bin/polling/display_poll_data.pl?url_caller=&mode=trend&page=show_polls&question_set_id=4');

$res= $ua->request($req);
print $res->content;

但我只是打印了原始页面(带有表格)而不是响应。我究竟做错了什么?

编辑:这只是找到传递给页面的正确参数的问题。为了弄清楚这一点,我在结果页面上使用了 Chrome 开发人员工具,然后转到网络选项卡,然后转到标题。向下滚动一点,您将找到提供给页面的所有表单参数。感谢 amon 为我指明了正确的方向。

4

1 回答 1

1

POST帮助程序不采用包含查询参数的完整 URL 。您应该在 arrayref 中提供这些,例如:

my $req = POST('http://www.example.com', [ foo => 42, bar => 'baz' ]);

…如文档中所示。

您还应该注意,POST 参数不是作为 URL 内的查询参数传输的,而是在 POST 请求的正文中传输的。虽然像 CGI 这样的一些软件提供了一个抽象出差异的接口,但其他软件可能没有。

另请注意,所有 Perl 脚本都应该use strict; use warnings;.

您应该考虑的另一件事是通过测试is_success和使用该decoded_content方法进行正确的错误处理,该方法负责传输编码。

$res->is_success
  or die $res->status_line;

print $res->decoded_content;

编辑

我分析了源代码,结果如下(自动生成):

我查看了页面的来源,http://polling.newspoll.com.au/cgi-bin/polling/display_poll_data.pl表格有以下内容<input>

  • <input name="url_caller" type="hidden" value="" />
  • <input name="mode" type="hidden" value="file" />
  • <input name="page" type="hidden" value="Search" />
  • <input name="keywords" type="text" />
  • <input name="show" type="text" />
  • <input src="/images/search_button.jpg" type="image" />

以及以下<select>组:

  • <select name="from_date_month"></select>有价值观(1 .. 12)
  • <select name="from_date_year"></select>有价值观(1998 .. 2013)
  • <select name="to_date_month"></select>有价值观(1 .. 12)
  • <select name="to_date_year"></select>有价值观(1998 .. 2013)
  • <select name="keytype"></select>有价值观("all", "any")
  • <select name="state"></select>有价值观("Any", "FEDERAL", "ACT", "NSW", "NT", "QLD", "SA", "TAS", "VIC", "WA")

此外,还存在具有以下查询的链接:

  • ?url_caller=latest&state=Any&mode=file&page=Search
  • ?mode=trend&page=select_category

这意味着该脚本也响应 GET 请求

我查看了页面的来源,http://polling.newspoll.com.au/cgi-bin/polling/display_poll_data.pl?url_caller=&mode=trend&page=show_polls&question_set_id=4表格有以下内容<input>

  • <input name="url_caller" type="hidden" value="trend" />
  • <input name="show" size="5" type="text" />
  • <input name="mode" type="hidden" value="trend" />
  • <input name="question_id" type="hidden" value="2403" />
  • <input name="page" type="submit" value="Display Results" />
  • <input name=".cgifields" type="hidden" value="to_date_year" />
  • <input name=".cgifields" type="hidden" value="to_date_month" />
  • <input name=".cgifields" type="hidden" value="from_date_month" />
  • <input name=".cgifields" type="hidden" value="to_date_day" />
  • <input name=".cgifields" type="hidden" value="from_date_year" />
  • <input name=".cgifields" type="hidden" value="from_date_day" />

以及以下<select>组:

  • <select name="from_date_day"></select>有价值观(1 .. 31)
  • <select name="from_date_month"></select>有价值观(0 .. 12)
  • <select name="from_date_year"></select>有价值观("Any Year", 1970 .. 2013)
  • <select name="to_date_day"></select>有价值观(1 .. 31)
  • <select name="to_date_month"></select>有价值观(0 .. 12)
  • <select name="to_date_year"></select>有价值观("Any Year", 1970 .. 2013)

此外,还存在具有以下查询的链接:

  • ?url_caller=trend
  • ?url_caller=trend&mode=trend&page=show_polls&question_set_id=4
  • ?mode=trend&page=continue_results&question_id=2403&url_caller=trend

这意味着该脚本也响应 GET 请求

您正在使用请求中的字段[url_caller => '', mode => "trend", page => "show_polls", question_set_id => 4]。例如,该字段question_set_id不存在。的值show_polls不存在page

隐藏字段不应更改,但应在预填时重新提交。对于select离子,从提供的列表中选择有效参数。对于文本输入,根据上下文提供一个合理的值。

于 2013-09-16T11:09:23.207 回答