前回の投稿で完全に書き間違えた部分がありそのままではよくわからないものになってしまっていたのですが、投稿し直しなどができなかったので再度投稿させてもらいます。
プログラムは
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ランキング
-
IIS の@INC ERRORについて教えて
-
wordの数式について 定積分を書...
-
ラジオボタンが両方とも選択で...
-
チェックボックスの返す値
-
htmlからパラメータで、cgiに渡...
-
WEBページを強制的に横画面で見...
-
INPUT TYPE
-
1つのformに2つのsubmitボタン
-
FC2 掲示版のカスタマイズの仕...
-
「value」に2つの値をセットす...
-
<select>タグの幅設定
-
MSPゴシックで、一番幅を取る文字
-
iPhoneでセレクトボックスが選...
-
プログラミングについての質問...
-
index.html(トップページ)か...
-
電話番号を読み込むプログラム...
-
別formのhidden項目を自form値...
-
proftpdで困ってます。
-
cgiの改造なんですけど助けてく...
-
アンケートで質問を複数ページ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
サーバーのテキストファイルを...
-
canonicalのURLエンコードについて
-
Perl CGI 初心者
-
sendmailの文字化け
-
If文について教えてください。
-
フォームメール確認用ページ
-
ヒアドキュメントが表示されない
-
サーバー(UNIX)上のフォルダ...
-
jcode.pl 使い方
-
perlでHTMLソースを解析してfor...
-
IIS の@INC ERRORについて教えて
-
IIS上でフリーCGIが動かない
-
SUN BBSの改造方法
-
ラジオボタンが両方とも選択で...
-
「value」に2つの値をセットす...
-
WEBページを強制的に横画面で見...
-
select値をhiddenのvalueに渡し...
-
チェックボックスの返す値
-
INPUT TYPE
-
wordの数式について 定積分を書...
おすすめ情報