前回の投稿で完全に書き間違えた部分がありそのままではよくわからないものになってしまっていたのですが、投稿し直しなどができなかったので再度投稿させてもらいます。
プログラムは
use Web::Scraper;
use WWW::Mechanize::Firefox;
use Parallel::ForkManager;
use URI;
binmode STDOUT,":utf8";
sub func ;
($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime();
$year += 1900 ;
$mon += 1 ;
$File = "yuma-$year:$mon:$mday:$hour.txt" ;
open (file,"> $File") or die 'fail to open file\n';
print "HOW MUCH PAGE\n" ;
my $page = <STDIN> ;
print "WITEING...\n" ;
my $MAX_PROCESSES = 5;
my $pm = new Parallel::ForkManager($MAX_PROCESSES);
for ($i = 1;$i <= $page;$i++) {
$pm->start and next;
my $uri = URI -> new ("www.目的とするURL$i.html");
my $mech = WWW::Mechanize::Firefox->new();
$mech->get($uri) ;
print file $s->scrape($mech->content) ;
print file "\n" ;
print file $r->scrape($mech->content) ;
print file "\n" ;
$pm->finish;
}
print "WITEID\n" ;
my $s = scraper {
process 'font',sen => 'TEXT';
result 'sen';
};
my $r = scraper {
process 'div#content',ren => 'TEXT';
result 'ren';
};
close (file) ;
です。
$i の順序でファイルへ書き込みをしていきたいのですが、前の処理が終わっていなかった場合に待つ方法がわからないので初心者レベルで教えてください。
No.2ベストアンサー
- 回答日時:
NO.1 さんの言う通りですが、別案として。
並列処理しているそれぞれのプロセスで違うファイルに出力し、子プロセスがすべて終了した後に、親プロセスでそれらのファイルを順番にくっつけるという方法はどうでしょうか。
つなぐ動作はおそらくシステムの部分を呼ぶのかと考えますが、
ばらばらにつないでしまうと大きなファイルにしたときに読み取りに時間がががるのではないか、
寄せ集めて集める前の部分を消した場合HDD(の寿命)に影響が出ないかが心配です。
集めても1.2Mしか使わないので問題ないといえばないのですが・・・
すいません、パソコン関係はソフトもハードも苦手なのであまりわからないので困っていますがみんなそうするのでしょうか?
No.3
- 回答日時:
これって、単にmy $mech = WWW::Mechanize::Firefox->new(); を毎回やってるのが遅いだけでは?
my $mech = WWW::Mechanize::Firefox->new();
for ($i = 1;$i <= $page;$i++) {
my $uri = URI -> new ("www.目的とするURL$i.html");
$mech->get($uri) ;
print file $s->scrape($mech->content) ;
print file "\n" ;
print file $r->scrape($mech->content) ;
print file "\n" ;
}
にしたら十分な速度が得られたりしませんか?
fiirefox通す必要が無いなら、LWPを使うとか。
この回答への補足
プログラムは
use Web::Scraper;
use WWW::Mechanize::Firefox;
use URI;
use Parallel::ForkManager;
use utf8;
my $s = scraper {
process 'font',sen => 'TEXT';
result 'sen';
};
my $r = scraper {
process 'div#content',ren => 'TEXT';
result 'ren';
};
($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime();
$year += 1900 ;
$mon += 1 ;
print "HOW MUCH PAGE\n" ;
my $page = <STDIN> ;
chomp $page ;
print "YA=WITEING...\n" ;
my $Max = 10 ;
my $pm = new Parallel::ForkManager($Max) ;
for ($i = 1;$i <= $page;$i++) {
$pm->start and next;
$File = "current-ya$i.txt" ;
open (file2, ">:utf8","$File") or die 'fail to open file\n';
my $uri = URI -> new ("目的とするURL$i");
my $mech = WWW::Mechanize::Firefox->new();
$mech->get($uri) ;
print file2 $s->scrape($mech->content) ;
print file2 "\n" ;
print file2 $r->scrape($mech->content) ;
print file2 "\n" ;
print "this page is $i\n" ;
close (file2) ;
$pm->finish;
}
wait_all_children ;
print "YASASIISEKAI=NOVEL=WITEID\n" ;
print "CAT...\n" ;
sleep 3 ;
#system ("cat current-ya* > ya=$year:$mon:$mday:$hour.txt") ;
#system ("rm -r current-ya*") ;
print "PERFECT\n";
この結果が
ai@ubuntu:~/Documents/ya$ perl test.pl
HOW MUCH PAGE
14
YASASIISEKAI=NOVEL=WITEING...
this page is 10
this page is 7
this page is 9
this page is 3
this page is 8
YA=WITEID
CAT...
this page is 6
this page is 4
this page is 5
this page is 2
this page is 1
PERFECT
ai@ubuntu:~/Documents/yasasii$ this page is 11
this page is 12
this page is 14
this page is 13
^C
となり途中で止まり完全にバグってしまっています。
ありがとうございます、オブジェクト指向がよくわからないけどこれがそうなんだろうということでforkごとに仕事させるオブジェクトを作ってます。
firefoxがなければ早いのですがjavascriptが含まれているので仕方なく使っています。
回線が悪いため?firefoxでは1ページ読み取りまで大体4秒前後かかり806Pでは間に合わない結果となります。
改造を行ったプログラムが事故を起こしているので補足の方に書いておきますので誰が助けてください(..)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- その他(クラウドサービス・オンラインストレージ) Google ColabでGoogleドライブのサブフォルダにファイルを生成する方法 1 2022/10/31 17:37
- PHP PHP ページング データベース 1 2022/06/16 10:30
- Ruby pythonエラー 4 2022/11/11 19:12
- その他(プログラミング・Web制作) python 2 2022/12/23 09:06
- その他(プログラミング・Web制作) python flask から fastapiへの移行時のエラー対処 1 2023/02/05 12:26
- その他(プログラミング・Web制作) I2C接続のLCDディスプレイを使う 2 2023/05/01 17:15
- YouTube youtubeからの著作権メールについて 2 2023/02/14 16:12
- その他(プログラミング・Web制作) pythonのこのエラーがわかりません 3 2022/11/16 14:54
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
メーリングリストのスクリプト...
-
ラジオボタンが両方とも選択で...
-
wordの数式について 定積分を書...
-
チェックボックスの返す値
-
UTF-8で文字化けしないようにす...
-
[HTML]プルダウンメニューの横...
-
INPUT TYPE
-
リストボックス(multipleなsel...
-
iPhoneでセレクトボックスが選...
-
sendmail 送信先を複数設定す...
-
チェックボックスで選択した内...
-
iframeごとに戻るボタンを
-
VB.net データーグリッドビュー...
-
floatで横に並べている2つのボ...
-
MSPゴシックで、一番幅を取る文字
-
tracert ができない原因
-
チェックボックスで得たデータ...
-
WEBページを強制的に横画面で見...
-
Error: No Recipient というエ...
-
別formのhidden項目を自form値...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
サーバーのテキストファイルを...
-
LuaJITで日本語出力
-
表示を一覧表形式にしたいので...
-
IIS の@INC ERRORについて教えて
-
索引を目次の該当ページへ入れ...
-
HTMLからCGIへデータを引き継ぎ
-
CGIの中で異なるContent-typeの...
-
jcode.pl 使い方
-
ブラウザ表示されません大変困...
-
CGIで、ボタンを押した時に違う...
-
perlがうごきません
-
標準入力からデータが読込めない
-
ランダムに1行読込み フォーム...
-
sjisでの文字化け?
-
サーバー(UNIX)上のフォルダ...
-
検索結果テーブルの背景色を変...
-
他のWWWサーバーからHTMLを得る
-
ひらがなチェック
-
次のcgiファイルを開くには? ...
-
ソケットの使い方が分からない
おすすめ情報