[SP-pm] WWW::Scripter - Como tirar o objeto da memória
Daniel de Oliveira Mantovani
daniel.oliveira.mantovani at gmail.com
Fri Apr 16 11:47:01 PDT 2010
2010/4/16 Andre Carneiro <andregarciacarneiro em gmail.com>:
> Bom dia !
>
> Estou fazendo um spider e estou tendo problemas para retirar o objeto
> WWW::Scripter da memória.
>
> Esse módulo é bem interessante para evitar que você tenha que estudar o
> Javascript que o 'brilhante' designer fez e devolve a saída desse Javascript
> em formato HTML. Até aí, tudo bem! Funciona! Maravilha!
>
> O problema é que eu preciso que isso funcione em um spider onde eu tenho
> várias iterações com esse objeto, e para cada 'get' que ele faz em cima de
> uma página, ele reserva um novo espaço na memória que não libera nunca.
>
> Lendo a documentação, eu vi que existe um método 'clear_history', mas
> aparentemente não serve para isso que eu estou querendo. Tentei forçar uma
> chamada para DESTROY, mas também não está funcionando. Abaixo tem um
> segmento de código que pode ajudar vocês a me ajudarem.
>
> <code>
> .
> .
> .
> my $scripter = WWW::Scripter->new;
> $scripter->use_plugin('JavaScript');
> $scripter->max_history(1);
> while(defined($tree)){
> my @products =
> $tree->findnodes("/html/body/div[\@id='container']/div[\@id='geral']/center/div[\@id='centro']/div[\@id='centro2_int']/div[\@id='produtos-vitrine']/div");
>
> print "\n\n#################################ACHEI " . @products .
> "PRODUTOS!\n\n";
> foreach my $p(@products){
> if($p){
> print "\n\n" . $p->as_HTML;
> #link/imagem
> my ($prelink) = $p->findnodes('a');
> if($prelink) {
> my $u = $prelink->attr('href');
> $u = decode_entities($u);
> $self->product->url_original($u);
> $self->product->url($self->product->url_original.
> '&frompartner=3212');
> my $preimg = $prelink->look_down(_tag => 'img');
> if($preimg){
> $self->product->imagem($preimg->attr('src'));
> }
>
> #Capturando detalhes
> # print "\n\nURL: " . $self->product->url_original .
> "\n\n";
> eval{$self->agent->get($self->product->url_original)};
> if($self->agent->success){
> $scripter->get($self->product->url_original);
> my $dtree =
> HTML::TreeBuilder::XPath->new_from_content($self->agent->content);
Você colocou o $scripter->clear_history aqui ?
> $self->get_detail($dtree , $scripter);
> }else {
> .
> .
> .
> }
> .
> .
> .
> }
> }
>
> </code>
>
Como você só colocou um pedaço do código, não da para saber, o final.
Você percebeu que você está iniciando um objeto TreeBuilder a cada
iteração do laço que o request é realizado com sucesso, você está
fazendo $dtree->delete ?
O módulo não tem nenhum "Report Bug", se fosse problema do módulo de
estourar a memória, com certeza alguém já teria reportado.
Por tanto, se você ler na documentação tem um atributo chamado:
max_docs, por favor quando você iniciar o objeto, mude-o para 1
my $script = WWW::Scripter->new(max_docs => 1, max_history => 1)
"The maximum number of document objects to keep in history (along with
their corresponding request and response objects). If this is omitted,
Mech's stack_depth + 1 will be used. This is off by one because
stack_depth is the number of pages you can go back to, so it is one
less than the number of recorded pages. max_docs considers 0 to be
equivalent to infinity."
Isso não é nada mais do que o atributo, "stack_depth" do Mechanize que
guarda os históricos do get, se não me falhe minha memória.
http://search.cpan.org/~sprout/WWW-Scripter-0.010/lib/WWW/Scripter.pod
Estou esperando, para saber se agora funcinona, ok!
[]'s
> Este é um segmento de código onde eu já observei que ocorre o problema
> mencionado mais acima.
>
> Por favor não comentem sobre 'use strict e use warnings' !! Ambos estão
> devidamente em seus lugares mais acima no código.
>
> Página do módulo:WWW::Scripter
>
>
>
> Obrigado!
>
> --
> André Garcia Carneiro
> Analista/Desenvolvedor Perl
> (11)82907780
>
> _______________________________________________
> SaoPaulo-pm mailing list
> SaoPaulo-pm em pm.org
> http://mail.pm.org/mailman/listinfo/saopaulo-pm
>
--
"If you’ve never written anything thoughtful, then you’ve never had
any difficult, important, or interesting thoughts. That’s the secret:
people who don’t write, are people who don’t think."
More information about the SaoPaulo-pm
mailing list