在Perl中使用HTTP :: Cookie传递Cookie值

时间:2011-10-25 16:30:16

标签: perl session-cookies lwp-useragent html-parser

我需要登录网站,解析HTML页面并在特定HTML标记之间提取值。

我能够在不需要登录数据的页面上成功完成此操作。我正在使用HTML :: Parser类。

LWP :: UserAgent提供cookie_jar方法,通过从文件加载来设置cookie。但是,我想在脚本本身中对cookie值进行编码。那可能吗?我在网上找不到任何有用的例子。

这是我的代码:

请原谅几个地方的变量声明中遗漏的'my'。我急着编写这段代码,试图理解LWP :: UserAgent中的Cookie处理概念。

#!/usr/bin/perl

use strict;
use warnings;
use HTTP::Request::Common;
use LWP::UserAgent;
use HTTP::Response;
use HTTP::Cookies;

package IdentityParse;
use base "HTML::Parser";

my $title_flag=0;
my $title="";

my $cookie_jar= HTTP::Cookies->new;
$cookie_jar->clear;
$cookie_jar->set_cookie(Name=Value); #Example, PHPSESSID=710c7aa60aa5cacdc40028ef79de24b2

sub text{
my($self,$text)=@_;
if($title_flag)
{
    $title.=$text;
}
}

sub start{
my($self,$tag,$attr,$attrseq,$origtext)=@_;
if($tag =~ /^title$/i)
{
    $title_flag=1;
}
}

sub end{
my($self,$tag,$origtext)=@_;
if($tag =~ /^title$/i)
{
    $title_flag=0;
}
}

my $url="http://sitename.com/users/index.php";

my $ua= LWP::UserAgent->new();
$ua->agent('NeonFlash');
$ua->timeout(30);
$ua->cookie_jar($cookie_jar);

my $req= HTTP::Request->new(GET => $url);
my $res= ($ua->request($req))->content;

my $p = new IdentityParse;
$p->parse($res);

$p->eof;

print "The title of the web page is: ".$title."\n";

要点:

我正在使用HTML :: Parser类来解析HTTP Response HTML页面。为了读取标记之间的值,我将重写HTML :: Parser的方法,开头,文本和结尾。

Cookie值以Key和Value的形式传递。我知道,虽然我自己没有尝试过,但是可以从文本文件加载cookie。但我想知道我们是否也可以这样做。

感谢。

3 个答案:

答案 0 :(得分:1)

这是HTTP :: Cookies :: set_cookie

的源代码
sub set_cookie
{
    my $self = shift;
    my($version,
       $key, $val, $path, $domain, $port,
       $path_spec, $secure, $maxage, $discard, $rest) = @_; 

    # path and key can not be empty (key can't start with '$')
    return $self if !defined($path) || $path !~ m,^/, ||
                !defined($key)  || $key  =~ m,^\$,;

    # ensure legal port
    if (defined $port) {
    return $self unless $port =~ /^_?\d+(?:,\d+)*$/;
    }   

好像你想要将cookie设置为cookie_jar,你必须传递数组而不是''key=value''' 或者您也可以使用LWP :: UserAgent :: default_header设置请求cookie 因为HTTP cookie是

的一部分

答案 1 :(得分:0)

只需从HTTP::Request类设置HTTP Cookie标头。

您的解析代码很难看。对于声明性方法,请使用Web::QueryHTML::Query

答案 2 :(得分:-1)

对于这类任务,我更喜欢WWW::Mechanize模块。