使用WWW :: Mechanize登录到具有重定向功能的网站

时间:2011-12-28 14:44:29

标签: perl authentication web-scraping www-mechanize webautomation

我知道这听起来像是一个已在论坛上提出的问题,但我相信我的情况略有不同......

我尝试使用Perl登录需要身份验证的网站。我已经意识到完成此任务最方便的工具是使用WWW :: Mechanize模块,可以很容易地填写表单并提交它们。

就我而言,我遇到以下困难:

  1. 似乎没有与我想要填写的字段相关的“形式”。相反,字段包含在表<table></table>中。
  2. 按钮本身似乎启动了一些我知道不受Mechanize模块支持的javascript。但是,为了测试此页面的行为,我在Chrome浏览器中禁用了javascript,但仍然可以点击按钮并登录该网站。所以我认为javascript不是必须的。
  3. 我使用以下代码,似乎无论我输入什么细节(用户/通行证),由于某种原因我总是遵循“成功”方案并收到“登录成功!”:< / p>

    my $mech = WWW::Mechanize->new(
     cookie_jar      => {},
     autocheck       => 1,
     onerror         => \&Carp::croak,);
    
    # Login Form
    my $response = $mech->get($url);
    if (!$response->is_success) {
        die "Login page unreachable $url: ",  $response->status_line, "\n";
    }
    
    $mech->field('Email', $Email);
    $mech->field('Password', $Password);
    $response = $mech->click();
    if ($response->is_success) {
        print "Login Successful!\n";
    } else {
        die "Login failed: ",  $response->status_line, "\n";
    }
    
  4. 因此,脚本的运行似乎是成功的,但是当我假设我已经登录并尝试从站点获取任何数据时,我看到(在嗅探器中)我不断被转发到“注册“页面。

    非常感谢任何帮助!

    提前致谢!

4 个答案:

答案 0 :(得分:2)

似乎我已经意识到如何解决这个问题。我使用Wireshark嗅探器来分析使用浏览器时发送的HTTP标头和由mechanize对象创建的标头之间的区别。我发现机械化生成的“连接”标题包含“TE,close”值,而浏览器发出“Connection”标题,其中包含“keep-alive”值。此外,浏览器生成的请求包括额外的“Keep-Alive:115”标题。我手动将这些标题添加到我的mech对象中,如下所示:

  $mech->add_header(
  "Connection" => "keep-alive",
  "Keep-Alive" => "115");

这解决了问题,我能够成功登录!

谢谢大家的贡献和帮助!非常感谢!

答案 1 :(得分:1)

如果它不在表单标记中,则会在某处使用GET请求将提交按钮发送到同一个(最可能的)URL。

为什么要尝试使用浏览器模拟单击身份验证按钮,是否有其他隐藏字段或您需要访问的内容?

在我看来,最好的方法是找出实际验证用户和密码的页面,并对该页面使用SSL POST请求。

如果页面有类似的内容:

<input type="text" name="user" />
<input type="password" name="pass" />

通过HTTP POST请求发送到登录页面的任何内容(如果未定义&lt; form&gt;,则可能是同一页面)。 POST变量将是user = $ value和pass = $ other_value。

答案 2 :(得分:1)

当您检查$response->is_success是否只检查目标站点响应而没有任何HTTP错误时。但是需要检查响应页面是否包含一些文本。例如,“Auth ERROR!”等

如果目标网站使用已禁用的JavaScript,则不会出现此问题。

尝试将x和y(鼠标指针的坐标)添加到提交到表单的数据中(某些站点检查此信息)。

您可以使用一些HTTP流量监控工具来检查浏览器向目标站点发送的数据(我使用Firefox HTTPFox扩展)并通过WWW :: Mechanize发出相同的请求。

此外,WWW :: Mechanize不需要cookie_jar。它默认处理cookie。

试试这段代码:

$mech->get($url);
$mech->submit_form(
    form_name => 'aspnetForm',
    fields => {
        'ctl00$cph1$lg1$txtEmail' => $login,
        'ctl00$cph1$lg1$txtPassword' => $password,
    },
    button => 'ctl00$cph1$lg1$btnLogin',
);

答案 3 :(得分:1)

我建议看看WWW :: Scripter。这是使用javascript和ajax支持在WWW :: Mechanize上编写的。

WWW :: Scripter https://metacpan.org/pod/WWW::Scripter

使用此模块,您可以直接调用javascript函数并执行更多操作。