使用Mozrepl使用WWW :: Mechanize :: FireFox创建缩略图 - 一些调试尝试

时间:2012-03-27 06:41:32

标签: perl parsing firefox-addon mechanize mozrepl

我运行这个脚本,编写一些网站的截图 我也启动并运行mozrepl

这里我们有一些请求网址的文件...请注意,这只是真实列表的一小段 - 实际列表要长得多。它包含超过3500行和URL

http://www.unifr.ch/sfm
http://www.zug.phz.ch
http://www.schwyz.phz.ch
http://www.luzern.phz.ch
http://www.schwyz.phz.ch
http://www.phvs.ch
http://www.phtg.ch
http://www.phsg.ch
http://www.phsh.ch
http://www.phr.ch
http://www.hepfr.ch/
http://www.phbern.ch
http://www.ph-solothurn.ch
http://www.pfh-gr.ch
http://www.ma-shp.luzern.phz.ch
http://www.heilpaedagogik.phbern.ch/

输出是什么奇怪 - 见下文...... 问题:我应该更改脚本吗

为什么要使用以下小脚本来输出输出:

#!/usr/bin/perl

use strict;
use warnings;
use WWW::Mechanize::Firefox;

my $mech = new WWW::Mechanize::Firefox();

open(INPUT, "<urls.txt") or die $!;

while (<INPUT>) {
        chomp;
        print "$_\n";
        $mech->get($_);
        my $png = $mech->content_as_png();
        my $name = "$_";
        $name =~s/^www\.//;
        $name .= ".png";
        open(OUTPUT, ">$name");
        print OUTPUT $png;
        sleep (5);
}

在这里看到压倒性的输出 - 坦率地说,我从来没有得到如此有趣的输出..我必须调试整个代码....见下文,

http://www.unifr.ch/sfm
print() on closed filehandle OUTPUT at test_3.pl line 20, <INPUT> line 2.
http://www.zug.phz.ch
print() on closed filehandle OUTPUT at test_3.pl line 20, <INPUT> line 3.
http://www.schwyz.phz.ch
print() on closed filehandle OUTPUT at test_3.pl line 20, <INPUT> line 4.
http://www.luzern.phz.ch
print() on closed filehandle OUTPUT at test_3.pl line 20, <INPUT> line 5.
http://www.schwyz.phz.ch
print() on closed filehandle OUTPUT at test_3.pl line 20, <INPUT> line 6.
http://www.phvs.ch
print() on closed filehandle OUTPUT at test_3.pl line 20, <INPUT> line 7.
http://www.phtg.ch
print() on closed filehandle OUTPUT at test_3.pl line 20, <INPUT> line 8.
http://www.phsg.ch
print() on closed filehandle OUTPUT at test_3.pl line 20, <INPUT> line 9.
http://www.phsh.ch
print() on closed filehandle OUTPUT at test_3.pl line 20, <INPUT> line 10.
http://www.phr.ch
print() on closed filehandle OUTPUT at test_3.pl line 20, <INPUT> line 11.
http://www.hepfr.ch/
print() on closed filehandle OUTPUT at test_3.pl line 20, <INPUT> line 12.
http://www.phbern.ch                                                                                                                                                                  

一些想法:首先,我认为这不是一个非常严重的错误 - 我认为我必须调试它然后它会更好地工作。 其次,我首先认为脚本似乎“超载机器”? 现在我对此并不十分肯定:症状确实看起来很奇怪,但我想结束“超载机器”并不是必要的。

第三,我认为必须采取某些步骤来确保问题与WWW :: Mechanize :: Firefox完全相关? 这让我想到了Perl警告意味着什么,以及使用诊断实用程序获得更多解释的想法:你怎么看?

print() on unopened filehandle FH at -e line 1 (#2) (W unopened) An I/O operation was attempted on a filehandle that w +as never initialized. 

首先 - 我们需要执行open(),sysopen()或so + cket()调用,或者从FileHandle包中调用构造函数 除此之外 - 或者,关闭文件句柄OUTPUT上的print()也提供了许多答案,告诉我们我们没有使用autodie并且也没有检查open的返回值。 最重要的是我必须调试它并确保找到错误发挥作用[/ QUOTE]

但经过一些思考之后,我认为值得仔细研究所有测试事物 - 你怎么看待总是测试的想法,以确保文件在使用之前是开放的。这意味着我们也应该养成使用三个文件的习惯

arg open():

open my $fh, '>', $name or die "Can't open file $name : $!";
print $fh $stuff;

嗯 - 我想我们可以或者应该在不使用die()的情况下解决这个问题, 但是我们必须手动设置一些方法让我们知道哪些文件无法创建。在我们的例子中,它看起来像像所有这些 ....如上所示...

更新选择一个好的文件名,你的意思是我需要一个文件名来存储图片..注意:我想在本地存储所有文件 。但是,如果我有一个巨大的网址列表,那么我会得到一个巨大的输出文件列表。因此我需要有良好的文件名。我们能否在计划中反映那些事情和需求!?

最新更新;机械化似乎有一些错误 ....我想是这样!!!

1 个答案:

答案 0 :(得分:2)

我想打印出二进制数据(jpg文件),你必须明确地设置它。 其次,如果您不再需要文件处理程序,请关闭文件处理程序,并在打开时“死”。 第三,选择一个好的文件名。

此致

http://perldoc.perl.org/functions/binmode.html

#!/usr/bin/perl

use strict;
use warnings;
use WWW::Mechanize::Firefox;

my $mech = new WWW::Mechanize::Firefox();

open(INPUT, "<urls.txt") or die $!;

while (<INPUT>) {
        chomp;
        next if $_ =~ m/http/i;
        print "$_\n";
        $mech->get($_);
        my $png = $mech->content_as_png();
        my $name = "$_";
        $name =~s#http://##is;
        $name =~s#/##gis;$name =~s#\s+\z##is;$name =~s#\A\s+##is;
        $name =~s/^www\.//;
        $name .= ".png";
        open(my $out, ">",$name) or die $!;
        binmode($out);
        print $out $png;
        close($out);
        sleep (5);
}