3

我仍在学习 Perl,因此对缺乏技术术语知识和一般新手表示歉意。

我正在尝试编写一个脚本来登录我的课程作品帐户并下载所有文件。我只能停留大约一个小时,直到我必须重新登录,所以我想在一个子程序中进行登录工作,这样取决于我可以调用它并重新登录并继续的时间爬行。我的问题是我希望能够在子程序和主代码之间来回传递浏览器(?关于术语,参见下面的示例会更有意义)。

这是我到目前为止所拥有的,但它不起作用:

use strict;
use WWW::Mechanize;

login();
my $username = 'username';
my $password = 'password';
my $url = 'website url';

my $browser = WWW::Mechanize->new();

my $response = login ($username,$password,$url,$browser);
print $response->content;

sub login {
    my ($user,$pass,$url,$browser) = @_;
    $browser -> get($url);
    $browser -> form_name('theform');
    $browser -> field ('username' => $user);
    $browser -> field ('password' => $pass);
    $browser -> click ('log in');
    return $browser;
}

这表示我不能在$browser -> get($url);. 所以我猜在主代码中初始化浏览器不起作用(因为它没有传递给子程序)是/否?

好的,很酷,然后我尝试在子程序本身中执行以下操作:

use strict;
use WWW::Mechanize;

login();
my $username = 'username';
my $password = 'password';
my $url = 'website url';

my $response = login ($username,$password,$url,$browser);
print $response->content;

sub login {
    my ($user,$pass,$url) = @_;
    my $browser = WWW::Mechanize->new();
    $browser -> get($url);
    $browser -> form_name('theform');
    $browser -> field ('username' => $user);
    $browser -> field ('password' => $pass);
    $browser -> click ('log in');
    return $browser;
}

这次我收到以下错误消息:“C:/Perl64/lib/HTTP/Response.pm 第 93 行缺少基本参数”

所以,我删除了子程序中的行,直到它工作,并发现它编译时如下所示:

use strict;
use WWW::Mechanize;

login();
my $username = 'username';
my $password = 'password';
my $url = 'website url';

my $response = login ($username,$password,$url,$browser);
print $response->content;

sub login {
    my ($user,$pass,$url) = @_;
    my $browser = WWW::Mechanize->new();
#   $browser -> get($url);
#   $browser -> form_name('theform');
#   $browser -> field ('username' => $user);
#   $browser -> field ('password' => $pass);
#   $browser -> click ('log in');
    return $browser;
}

但它显然只是返回垃圾。

我认为问题在于,正如我所说,试图将浏览器对象传递给子例程,因为我不认为它只是一个标量(因为我可以从中获取“内容”之类的东西),但我实际上真的没有把握。我也很困惑,因为当我在子程序中初始化它时,我仍然遇到问题!!!??????我还尝试使 $browser 成为全局变量,但是在两个代码中都出现了相同的错误。显然我在这里遗漏了一些东西。

在此先感谢所有通过它的人,我知道这有点啰嗦,因为可能是一个非常简单的答案,但我缺乏经验。

4

1 回答 1

4

您的第一次登录调用没有提供浏览器、用户名等。

如果您在整个脚本中只需要一个 Mechanize 实例(并且将使用同一用户登录),则可以依赖全局变量。

use strict;
use WWW::Mechanize;

my $username = 'username';
my $password = 'password';
my $url = 'website url';

my $browser = WWW::Mechanize->new();

login();
print $browser->$response->content;

sub login {
    $browser -> get($url);
    $browser -> form_name('theform');
    $browser -> field ('username' => $user);
    $browser -> field ('password' => $pass);
    $browser -> click ('log in');
}

或者更好的是,每次都将您的数据传递给登录:

use strict;
use WWW::Mechanize;

my $username = 'username';
my $password = 'password';
my $url = 'website url';

my $browser = WWW::Mechanize->new();

login ($username,$password,$url);
print $browser->$response->content;

sub login {
    my ($user,$pass,$url) = @_;
    $browser -> get($url);
    $browser -> form_name('theform');
    $browser -> field ('username' => $user);
    $browser -> field ('password' => $pass);
    $browser -> click ('log in');
}

如果您每次都想要一个新的 Mechanize 实例,请在登录中实例化它并返回它。

于 2011-05-21T08:55:34.867 回答