【发布时间】:2011-09-18 11:32:40
【问题描述】:
我正在使用 WWW::Mechanize 和 HTML::TokeParser 解析网站以获取更新。我无法在网站上提供任何详细信息,因为它需要登录。该网站基本上有一个数据表。我只是解析 html 直到我到达表格的第一行,检查它是否是我最后一次抓取的值,如果没有发送邮件。当我在现有的表条目上测试它时,这非常有效,除了当实际更新发生时,抓取不会在我最后一次抓取时停止。它一直发送邮件,直到表用完并无限期地重复。我无法弄清楚发生了什么。我知道没有网站,没有多少人可以验证,但无论如何我都会发布我的代码。对于可能出现的问题,我将不胜感激。
代码:
sub func{
my ($comid, $mechlink) = @_;
my $mechanize = WWW::Mechanize->new(
noproxy => 0,
stack_depth => 5,
autocheck => 1
);
$mechanize->proxy( https => undef );
eval{
my $me = $mechanize->get($mechlink);
$me->is_success or die $me->status_line;
};
return $comid if ($@);
my $stream = HTML::TokeParser->new( \$mechanize->{content} ) or die $!;
while ( $tag = $stream->get_tag('td') ) {
if( $tag->[1]{class} eq 'dateStamp' ) {
$dt = $stream->get_trimmed_text('/td');
$tag = $stream->get_tag;
$tag = $stream->get_tag;
$name = $stream->get_trimmed_text('/td') if( $tag->[1]{class} eq 'Name' );
return $comid unless( $tag->[1]{class} eq 'Name' );
$tag = $stream->get_tag;
$tag = $stream->get_tag;
$tag = $stream->get_tag;
$tag = $stream->get_tag;
$info = $stream->get_trimmed_text('/td');
print "$name?\n";
return $retval if($info eq $comid);
print "You've Got Mail! $info $comid\n";
$tcount++;
$retval = $info if($tcount == 1);
$tag = $stream->get_tag;
$tag = $stream->get_tag;
$tag = $stream->get_tag;
$link = "http://www.abc.com".$tag->[1]{href} if ($tag->[0] eq 'a' );
my $outlook = new Mail::Outlook();
my $message = $outlook->create();
$message->To('abc@def.com');
$message->Cc('abc@def.com;abc@def.com');
my $hd = "$name - $info";
$message->Subject($hd);
$message->Body(" ");
$message->Attach($link);
$message->send;
}
}
}
【问题讨论】:
-
您能否包含您的 while 循环的代码 - 您检查更新的位。这很可能是出了问题的地方。
-
我建议您添加应用程序日志记录,以便您可以从日志中查看更多信息。此外,邮件发送计数器和受控停止也很好。我已经从这样的程序发送了好几次 100 封电子邮件,我知道这有多烦人。
-
我在循环中添加了代码。邮件发送计数器的问题在于,首先,我不知道从一次抓取到抓取多少次更新。其次,即使我设置了限制,我也会每 60 秒运行一次相同的脚本,所以下一次迭代开始重新发送邮件
标签: perl www-mechanize