我仍然在学习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成为一个全局变量,但是我在两个代码中都得到了相同的错误。显然我在这里遗漏了一些东西。
提前感谢所有通过它的人,我知道它有点啰嗦,可能是一个非常简单的答案,因为我缺乏经验。
答案 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实例,请在登录时对其进行实例并将其返回。