-1

(Windows cmd ウィンドウで) perl スクリプトを実行しようとしていますが、常に特定の時点で動作が停止します。進まない理由はどうすればわかりますか?

スクリプトは次のとおりです。最後に実行されるのは、37 行目の「get_html_source()」です。

#!/usr/bin/perl
# Perl script that scrapes the members of the Hellenic Parliament
# Created by Kostas Ntonas, 03 May 2013 - http://ntonas.gr
# http://deixto.blogspot.gr/2013/05/scraping-members-of-greek-parliament.html

use strict;
use warnings;
use utf8;

use IO::File;
use POSIX qw(tmpnam);
use DEiXToBot;
use WWW::Selenium;

my $agent = DEiXToBot->new(); # create the DEiXToBot agent object

# launch a Firefox instance
my $sel = WWW::Selenium->new( host => "localhost",
                              port => 4444,
                              browser => "*firefox",
                              browser_url => "http://www.hellenicparliament.gr/"
                            );
$sel->start;

for my $i (1..30) {

    my $url = "http://www.hellenicparliament.gr/en/Vouleftes/Viografika-Stoicheia?pageNo=$i";

    $sel->open($url);

    $sel->wait_for_page_to_load(5000);

    $sel->pause(1);

    print "$i) $url\n";

    my $content = $sel->get_html_source();

    my ($fh,$name); # create a temporary file containing the page's source code
    do { $name = tmpnam() } until $fh = IO::File->new($name, O_RDWR|O_CREAT|O_EXCL);
    binmode( $fh, ':utf8' );
    print $fh $content;
    close $fh;

    $agent->get("file://$name"); # load the temporary file/page with the DEiXToBot agent using the file:// scheme

    unlink $name; # delete the temporary file, it is not needed any more

    if (! $agent->success) { die "Could not fetch the temp file!\n"; }

    $agent->build_dom();

    $agent->load_pattern('C:\Users\XXX\Documents\Privat\MyCase3\Deixto Patterns\parliament_CVs.xml');

    $agent->extract_content();

    if (! $agent->hits) {
        die "Could not find any MPs/ records!\n";
    }
    else {
        for my $record ($agent->records) {
            my @rec = @$record;

            my $party;
            my $logo = $rec[0];

            # deduce the party name from the logo in the first column of the table
            if ($logo=~m#ND_Logo#) { $party = "N.D. (New Democracy)"; }
            elsif ($logo=~m#COALITION#) { $party = "SYRIZA Unitary Social Front"; }
            elsif ($logo=~m#PASOK#) { $party = "PA.SO.K. (Panhellenic Socialist Movement)"; }
            elsif ($logo=~m#ANEKS_ELL#) { $party = "ANEXARTITOI ELLINES (Independent Hellenes)"; }
            elsif ($logo=~m#xrisi#) { $party = "LAIKOS SYNDESMOS - CHRYSI AVGI (People's Association - Golden Dawn)"; }
            elsif ($logo=~m#small#) { $party = "DHM.AR (Democratic Left)"; }
            elsif ($logo=~m#KKE#) { $party = "K.K.E. (Communist Party of Greece)"; }
            elsif ($logo=~m#INDEPENDENT#) { $party = "INDEPENDENT"; }
            else { die "$logo => Unknown logo!\n"; }

            $rec[0] = $party;

            $rec[3]=~s#\s+# #g; # replace whitespace characters with a single space

            # append the data in a tab delimited text file
            open my $fh,">>:utf8","MPs.txt";
            print $fh join("\t",@rec)."\n";
            close $fh;
        }
    }
}

$sel->stop;
4

2 に答える 2

0

コードが get_html_source 内で死んでいることを知っていますか、それとも実際にはその直前または直後 (たとえば、セミコロンが欠けているように見える tmpnam の呼び出し) で死んでいますか?

もう 1 つのコメントは、国会議員とその政党のリストをかき集めるだけでも大変な作業のように思えるということです。ページ ソースを見ると、base-64 でエンコードされたテキストの巨大なブロックがあり、必要なデータがすべて含まれているように見えます。そのため、ページをロードし、ブロックをデコードして、必要なものをすべて入手する方が速いことに気付くかもしれません.

于 2013-10-23T21:14:19.677 に答える
0

tmpnam 関数は、POSIX Perl モジュールによって提供されます。Unix/Linux のほとんどのバリアントでは問題なく動作するはずですが、Windows では機能しないようです。tmpnam 呼び出しを含む「問題のある」行を次のように置き換えることをお勧めします。

use File::Temp qw/ tempfile /;
($fh,$name) = tempfile();

この変更により問題が解決され、スクリプトが完了することを願っています。

これは、Perl tmpnam のドキュメント ( http://perldoc.perl.org/POSIX.html ) が示唆していることでもあります。代わりに File::Temp を参照してください。

于 2013-11-02T17:05:08.783 に答える