0

我编写了一个 Perl 脚本,它使用 WWW::Mechanize 连接到一个站点,登录然后访问该站点内的几个页面。一切都很好,但是,当我尝试访问大量页面时,脚本被杀死了。我确信这与 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)

现在,我遍历连接到不同 internal_url 的 for 循环,因为 $i 的值在每次迭代中都会递增。

正如我所说,这一切都很好。然而,在大约 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 回答