0

朋友们

我有一个很好的脚本,可以用作图像刮板。对于第一次试验和测试,一切顺利。

这是我在针对脚本运行的 urls.txt 中使用的 URL 列表。请注意,这只是一个简短的列表。我需要针对 2500 个 URL 运行,所以如果脚本更健壮一点并且如果某些 URL 不可用或花费太多时间来获取它会继续运行,那就太好了。我认为如果某些 URL 不可用或花费太多时间或阻止 mozrepl 和WWW:Mechanize::Firefox花费太多时间,脚本会遇到一些问题。

您认为我的想法和建议可能是问题的原因吗?如果是这样,我们如何改进脚本并使其更强大、更强大和更健壮,以便它不会过早停止。

期待您的来信。

问候。

http://www.bez-zofingen.ch
http://www.schulesins.ch
http://www.schulen-turgi.ch/pages/bezirksschule/startseite.php
http://www.schinznach-dorf.ch
http://www.schule-seengen.ch
http://www.gilgenberg.ch/schule/bez/2005-06/
http://www.rheinfelden-schulen.ch/bezirksschule/
http://www.bezmuri.ch
http://www.moehlin.ch/schulen/
http://www.schule-mewo.ch
http://www.bez-frick.ch
http://www.bezendingen.ch
http://www.bezbrugg.ch
http://www.schule-bremgarten.ch/content/view/20/37/
http://www.bez-balsthal.ch
http://www.schule-baden.ch
http://bezaarau.educanet2.ch/info/.ws_gen/index.htm
http://www.benedict-basel.ch
http://www.institut-beatenberg.ch/
http://www.schulewilchingen.ch
http://www.ksuo.ch
http://www.international-school.ch
http://www.vsgtaegerwilen.ch/
http://www.vgk.ch/
http://www.vstb.ch

但是我想如果它比现在更强大,我会很高兴。

当然,它正在驱动一个真正的浏览器,就像 WWW::Mechanize::Firefox

所以在某个地方它可能有点不稳定,可能比任何其他屏幕抓取解决方案都更不稳定。我收到如下错误...(见下文)

请注意,我还仔细查看了Firefox 故障排除中的调试页面, 其中包含有关各种错误、麻烦和类似问题的提示、技巧和解决方法。

  #!/usr/bin/perl
  use strict;
  use warnings;

  use WWW::Mechanize::Firefox;

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

  open my $URLs, '<', 'URLs.txt' or die $!;

  while (<$URLs>) {
    chomp;
    next unless /^http/I;
    print "$_\n";
    $mech->get($_);
    my $png = $mech->content_as_png;
    my $name = $_;
    $name =~ s#^http://##I;
    $name =~ s#/##g;
    $name =~ s/\s+\z//;
    $name =~ s/\A\s+//;
    $name =~ s/^www\.//;
    $name .= ".png";
open(my $out, '>', "/home/martin/images/$name") or die $!;
  binmode $out;
    print $out $png;
    close $out;
    sleep 5;
  }

查看结果以及它停止的错误

martin@linux-wyee:~/perl> perl test_10.pl
http://www.bez-zofingen.ch
Datei oder Verzeichnis nicht gefunden at test_10.pl line 24, <$URLs> line 3.
martin@linux-wyee:~/perl> perl test_10.pl
http://www.bez-zofingen.ch
http://www.schulesins.ch
http://www.schulen-turgi.ch/pages/bezirksschule/startseite.php
http://www.schinznach-dorf.ch
http://www.schule-seengen.ch
http://www.gilgenberg.ch/schule/bez/2005-06/
http://www.rheinfelden-schulen.ch/bezirksschule/
Not Found at test_10.pl line 15
martin@linux-wyee:~/perl> 

你有什么建议?我们怎样才能使脚本更健壮一点?怎么弄才不会这么早停?

4

2 回答 2

3

将所有可能出错的方法/系统调用包装在异常处理程序中。(有关该主题的讨论,请参见Perl Best Practices的第 13 章。)为 Mozrepl 设置显式超时。

当您收到错误时,将其记录下来,然后跳到下一个 URL。运行完成后,检查日志文件并使用之前无法处理的那些 URL 重复运行。整理出永久关闭的页面的 URL。最后,由于某种原因,可能会留下一些无法通过 Mozrepl 截屏的页面。手动处理这些。

于 2012-04-01T14:24:22.943 回答
0

您应该始终检查您的响应是否成功。您更正的代码:

    use strict;
    use warnings;

    use WWW::Mechanize::Firefox;

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

    open my $URLs, '<', 'URLs.txt' or die $!;

      while (<$URLs>) {
        chomp;
        next unless /^http/I;
        print "$_\n";
        my $res = $mech->get($_);
        if(!$res->is_success()){ 
           next; # or continue;
        }
        my $png = $mech->content_as_png;
        my $name = $_;
        $name =~ s#^http://##I;
        $name =~ s#/##g;
        $name =~ s/\s+\z//;
        $name =~ s/\A\s+//;
        $name =~ s/^www\.//;
        $name .= ".png";
       open(my $out, '>', "/home/martin/images/$name") or die $!;
      binmode $out;
        print $out $png;
        close $out;
        sleep 5;
      }

`

于 2017-06-29T13:32:21.130 回答