将机械化浏览器传递给子程序(Perl with WWW :: Mechanized)

时间:2011-05-21 07:37:33

标签: perl www-mechanize

我仍然在学习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);处“调用方法'获取'未定义的值”。所以我猜测在主代码中初始化浏览器不起作用(因为它没有传递给子程序)Y / N ??

好酷然后我尝试在子程序本身中进行如下操作:

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成为一个全局变量,但是我在两个代码中都得到了相同的错误。显然我在这里遗漏了一些东西。

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

1 个答案:

答案 0 :(得分: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实例,请在登录时对其进行实例并将其返回。