【问题标题】:Save cookies after post method, perl, mechanize, redirect在 post 方法、perl、机械化、重定向之后保存 cookie
【发布时间】:2014-05-08 08:32:26
【问题描述】:

我想通过 perl 脚本登录到http://www.tennisinsight.com/match_previews.htm 并下载该页面。我被困在通过脚本登录网站

1 该网站使用 cookie 来存储登录数据。

2 登录表单是由 javascript 触发的,但这并不重要,因为本地的一个简单网页仅包含:

  <form action="http://www.tennisinsight.com/myTI.php" method="POST">
      <input name="username" type="text" size="25" />
      <input name="password" type="password"  size="25" />
      <input name="mySubmit" type="submit" value="Submit!" />
 </form>

给定正确的用户名和密码将发送所需的数据,网站将重定向到主页,用户登录,并创建 cookie。简而言之,一个包含正确数据的简单帖子就可以在客户端完成所有工作。

3.一旦提供了正确的 cookie,我已经成功尝试并使用 curl 获取了我需要的页面。

我认为发布到 myTI.php,存储返回的 cookie,然后在读取 cookie 时打开正确的页面就可以了,但我在保存 cookie 部分失败了......

这是我尝试获取 cookie 的脚本,它现在将它们打印到标准输出中

use warnings;
use HTML::Tree;
use LWP::Simple;
use WWW::Mechanize;
use HTTP::Request::Common;
use Data::Dumper;

my $username = "user";
my $password = "pass";
my $site_url = 'http://www.tennisinsight.com/myTI.php'; 
my $mech = WWW::Mechanize->new( autocheck => 1 );


# print $mech->content;

my $response = $mech->post($site_url , 
    [
       'username' => $username,
       'password' => $password,
    ]) ;
my $cookie_jar = HTTP::Cookies->new;
$cookie_jar->extract_cookies( $response );

print $cookie_jar;

编辑: 我找到了如何存储 cookie 的示例,问题是我得到一个空文件(或空标准输出......似乎调用的 php 将在存储 cookie 之前重定向并且登录将失败

我很抱歉,但总的来说我是 perl 新手,似乎我错过了什么

【问题讨论】:

  • 为什么需要使用 PHP (cURL) 来获取页面?使用 Mechanize 从 Perl 获取它非常简单。
  • 实际上,我尽量避免这样做。我提到 curl 只是因为我用它作为页面的概念证明。一旦提供了 cookie,就可以下载我需要的内容。我什么 perl 解决方案,但不能让 perl 存储该站点的 cookie,这实际上是我的问题。我设法为无密码站点存储 cookie,但不是为受保护站点存储 cookie
  • WWW::Mechanize 默认为您使用(保存)cookie。
  • 问题可能出在 User-Agent: 标头中吗?尝试在my $mech = WWW::Mechanize-&gt;new( autocheck =&gt; 1 ); 行之后添加$mech-&gt;agent_alias("Windows IE 6")'

标签: perl cookies mechanize


【解决方案1】:

我遇到了同样的问题,看起来像 Mechanize 没有在请求之间传递 cookie。为了调试,我让 Mechanize 将 cookie 写入磁盘

my $mech = WWW::Mechanize->new(file => "/path/to/cookies");

当我这样做时,我得到了一个以它为内容的文件(即“空”cookie 文件):

#LWP-Cookies-1.0

按照 gangabas 的建议,我更改了我的用户代理

$mech->agent_alias('Linux Mozilla');

然后 cookie 开始出现在文件中,并在后续请求之间传递。问题解决了。

agent_alias 调用修复了它,而不是将 cookie 写入磁盘。

【讨论】:

    【解决方案2】:

    根据HTTP::Cookies 模块文档,您可以向构造函数提供以下参数,以便将cookie 存储在磁盘上。

    • file =&gt; "/path/to/cookies"
    • autosave =&gt; 1

    load 方法也存在,以便从磁盘加载 cookie。

    【讨论】:

    • 您能否详细说明如何进行自动保存,我是语言新手,语法逻辑对我来说不是很清楚,
    • 我找到了所有这些,问题是我得到了空的cookie文件
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-21
    • 1970-01-01
    • 2013-10-16
    • 2011-01-10
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    相关资源
    最近更新 更多