Передача значения cookie с использованием HTTP::Cookie в Perl

Мне нужно войти на сайт, проанализировать HTML-страницу и извлечь значение между определенным тегом HTML.

Я могу сделать это успешно на странице, которая не требует данных для входа. Я использую класс HTML::Parser.

LWP::UserAgent предоставляет метод cookie_jar для установки файла cookie путем его загрузки из файла. Однако я хочу закодировать значение cookie в самом скрипте. Это возможно? Я не мог найти ни одного рабочего примера в сети.

Вот мой код:

Пожалуйста, извините за отсутствие «my» в объявлениях переменных в нескольких местах. Я написал этот код в спешке, пытаясь понять концепцию обработки файлов cookie в LWP::UserAgent.

#!/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 для анализа HTML-страницы HTTP-ответа. Чтобы прочитать значение между тегами, я переопределяю методы, начало, текст и конец HTML::Parser.

Значение файла cookie передается в виде ключа и значения. Я знаю, что можно загрузить куки из текстового файла, хотя сам не пробовал. Но я хочу знать, можем ли мы сделать это таким же образом.

Спасибо.


person Neon Flash    schedule 25.10.2011    source источник


Ответы (3)


Для такого рода задач я предпочитаю модуль WWW::Mechanize.

person Miguel Prz    schedule 25.10.2011
comment
Пожалуйста, приведите пример того, как выполнить эту задачу. - person Neon Flash; 26.10.2011

Это исходный код 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 запроса.
Поскольку файлы cookie HTTP являются частью

person linehrr    schedule 19.01.2013

Просто установите заголовок HTTP Cookie из класса HTTP::Request.

На ваш код синтаксического анализа больно смотреть. Для декларативного подхода используйте Web::Query или HTML::Query.

person daxim    schedule 27.10.2011