0

WWW::Mechanize を使用してサイトに接続し、ログインして、サイト内のいくつかのページにアクセスする Perl スクリプトを作成しました。すべてうまく機能しますが、多数のページにアクセスしようとすると、スクリプトが強制終了されます。これは、HTTP サーバーの構成と構成された接続制限とは何の関係もないと確信しています。これは、スクリプトが自分のサイトで実行されているためです。

私のスクリプトの概要は次のとおりです。

$url="http://example.com";
$mech=WWW::Mechanize->new();
$mech->cookie_jar(HTTP::Cookies->new());
$mech->get($url);

フォーム フィールドを使用してサイトにログインします。

ログインしたら、次のようにサイト内の URL に接続します。

$i は for ループの反復カウンターです

$internal_url="http://example.com/index.php?page=$i";

$mech->get($internal_url);

返されたページでいくつかの操作を実行します ($mech->content using HTML::TreeBuilder::XPath)

ここで、繰り返しごとに $i の値がインクリメントされるため、別の internal_url に接続する for ループを繰り返し処理します。

私が言ったように、それはすべてうまくいきます。ただし、約 180 ページの後、スクリプトは強制終了されます。

その理由は何ですか?私は何度も試しました。

$mech->delete; も追加しました。メモリ リークを防ぐために、FOR ループの最後の直前に挿入します。

ただし、唯一の問題は、この結果、$mech によって維持されていたログイン セッションが破棄されることです。

何度も試しましたが、このスクリプトは同じ数のページにアクセスした後に常に強制終了されます。

ありがとう。

4

1 に答える 1

3

このコードを試してください:

$mech=WWW::Mechanize->new();
$mech->stack_depth(0);

また

$mech=WWW::Mechanize->new(stack_depth=>0);

ドキュメントによると:ページスタックの深さを取得または設定します。大量のページ スクレイピングを行っていてメモリが不足している場合は、これを使用します。

値 0 は、「履歴がまったくない」ことを意味します。デフォルトでは、最大スタック深度は非常に大きく、すべての履歴を効果的に保持します。

于 2012-08-01T00:18:46.983 に答える