1

我正在尝试移植一些使用旧 Perl 模块编写的旧 Web 抓取脚本,以便仅使用 Mojolicious 工作。

使用 Mojo 编写了一些基本脚本,但对使用安全登录站点的经过身份验证的登录以及如何使用Mojo::UserAgent脚本进行处理感到困惑。不幸的是,我在文档中看到的唯一示例是没有表单的基本身份验证。

我试图转换为使用 Mojo:UserAgent 的 Perl 脚本如下:

#!/usr/bin/perl

use LWP;
use LWP::Simple;
use LWP::Debug qw(+);
use LWP::Protocol::https;
use WWW::Mechanize;
use HTTP::Cookies;

# login first before navigating to pages
# Create our automated browser and set up to handle cookies
my $agent = WWW::Mechanize->new();
$agent->cookie_jar(HTTP::Cookies->new());
$agent->agent_alias( 'Windows IE 6' );  #tell the website who we are (old!)

# get login page

$agent->get("https://reg.mysite.com")
$agent->success or die $agent->response->status_line;

# complete the user name and password form
$agent->form_number (1);
$agent->field (username => "user1");
$agent->field (password => "pass1");
$agent->click();

#try to get member's only content page from main site on basis we are now "logged in" 
$agent->get("http://www.mysite.com/memberpagesonly1");
$agent->success or die $agent->response->status_line;

$member_page = $agent->content();
print "$member_page\n";

所以上面的工作正常。如何转换为在 Mojolicious 中做同样的工作?

4

2 回答 2

3

Mojolicious 是一个 Web 应用程序框架。虽然Mojo::UserAgent作为一个低级 HTTP 用户代理工作得很好,并且提供了一些无法使用的功能(特别是对异步请求和 IPV6 的原生支持),但它们都不像Web 抓取LWP那样方便使用。WWW::Mechanize

WWW::MechanizeLWP::UserAgent与互联网接口的子类,并用于HTML::Form处理它找到的表单。Mojo::UserAgent没有处理 HTML 表单的工具,因此构建相应的 HTTP 请求一点也不简单。诸如使用(GETPOST)表单字段名称的 HTTP 方法以及隐藏字段的默认值的插入等信息都是由HTML::Form程序员自动完成的,如果您限制自己使用Mojo::UserAgent.

在我看来,即使尝试Mojo::UserAgent与 with 结合使用HTML::Form也是有问题的,因为前者需要一个Mojo::Transaction::HTTP对象来表示填写表单的提交,而后者会生成HTTP::Request用于 with 的对象LWP

简而言之,除非您愿意大量重写,否则WWW::Mechanize我认为没有办法使用Mojolicious模块重新实现您的软件。

于 2012-11-25T18:51:48.567 回答
1

您可以使用WWW::Mechanize与 Web 服务器对话,并且可以使用Mojo::DOM作为解析器从 Mojolicious' 中受益。两个世界中最好的... :)

于 2012-11-25T22:00:35.373 回答