1

所以我正在抓取一个我可以通过 HTTPS 访问的网站,我可以登录并启动该过程,但每次我点击一个新页面 (URL) 时,cookie 会话 ID 都会发生变化。如何保留登录的 Cookie 会话 ID?

#!/usr/bin/perl -w
use strict;
use warnings;
use WWW::Mechanize;
use HTTP::Cookies;
use LWP::Debug qw(+);
use HTTP::Request;
use LWP::UserAgent;
use HTTP::Request::Common;

my $un = 'username';
my $pw = 'password';

my $url = 'https://subdomain.url.com/index.do';

my $agent = WWW::Mechanize->new(cookie_jar => {}, autocheck => 0);
$agent->{onerror}=\&WWW::Mechanize::_warn;
$agent->agent('Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.3) Gecko/20100407 Ubuntu/9.10 (karmic) Firefox/3.6.3');
$agent->get($url);

$agent->form_name('form');
$agent->field(username => $un);
$agent->field(password => $pw);
$agent->click("Log In");

print "After Login Cookie: ";
print $agent->cookie_jar->as_string();
print "\n\n";

my $searchURL='https://subdomain.url.com/search.do';
$agent->get($searchURL);    

print "After Search Cookie: ";
print $agent->cookie_jar->as_string();
print "\n";

输出:

After Login Cookie: Set-Cookie3: JSESSIONID=367C6D; path="/thepath"; domain=subdomina.url.com; path_spec; secure; discard; version=0

After Search Cookie: Set-Cookie3: JSESSIONID=855402; path="/thepath"; domain=subdomain.com.com; path_spec; secure; discard; version=0

另外我认为该站点需要 CERT(在浏览器中确实如此),这是添加它的正确方法吗?

$ENV{HTTPS_CERT_FILE} = 'SUBDOMAIN.URL.COM'; ## Insert this after the use HTTP::Request...

同样对于 CERT 在使用此列表中的第一个选项时,这是否正确?

X.509 Certificate (PEM)
X.509 Certificate with chain (PEM)
X.509 Certificate (DER)
X.509 Certificate (PKCS#7)
X.509 Certificate with chain (PKCS#7)
4

3 回答 3

1

当你的用户代理没有做你认为它应该做的事情时,将它的请求与交互式浏览器的请求进行比较。Firefox 插件对这类事情很方便。

您可能缺少服务器期望的部分过程。您可能没有正确登录或交互,这可能是出于各种原因。例如,页面上可能存在WWW::Mechanize 未处理的 JavaScript。

当您可以查明交互式浏览器在做什么而不是在做什么时,您就会知道需要改进脚本的地方。

在您的脚本中,您还可以通过在LWP中打开调试来观察正在发生的事情,这是基于 Mech 构建的:

 use LWP::Debug qw(+); 

rjh 已经回答了您问题的证书部分。

于 2010-04-27T19:10:11.020 回答
0

如果您的会话 cookie 更改每次页面加载,那么您可能没有正确登录。但是您可以尝试强制每个请求的 JSESSIONID 相同。构建你自己的 cookie jar 并告诉 WWW::Mechanize 使用它:

my $cookie_jar = HTTP::Cookies->new(file => 'cookies', autosave => 1, ignore_discard => 1);
my $agent = WWW::Mechanize->new(cookie_jar => $cookie_jar, autocheck => 0);

ignore_discard => 1意味着即使会话 cookie 也会保存到磁盘(通常出于安全原因它们会被丢弃)。

然后,登录后,调用:

$cookie_jar->save;

然后,在每个请求之后:

$cookie_jar->revert;  # re-loads the save

或者,您可以继承 HTTP::Cookies 并覆盖该set_cookie方法以拒绝重新设置会话 cookie(如果它已经存在)。


另外我认为该站点需要 CERT(在浏览器中确实如此),这是添加它的正确方法吗?

一些浏览器(例如 Internet Explorer)会提示输入安全证书,即使不需要。如果您没有收到任何错误并且响应内容看起来不错,则您可能不需要设置一个。

如果您确实有证书文件,请检查 POD 中的Crypt::SSLeay。您的证书是 PEM0 编码的,所以是的,您要设置$ENV{HTTPS_CERT_FILE}为证书的路径。你可能想设置$ENV{HTTPS_DEBUG} = 1看看发生了什么。

于 2010-04-27T18:10:01.200 回答
-1

设置 cookie jar,类似于以下内容:

my $cookie = HTTP::Cookies->new(file => 'cookie',autosave => 1,);
my $mech = WWW::Mechanize->new(cookie_jar => $cookie, ....);
于 2010-04-27T15:24:36.420 回答