我使用WWW::Mechanize
和HTML::TokeParser
解析網站的更新。我不能在網站上提供任何細節,因爲它需要登錄。該網站基本上有一個數據表。我只是簡單地解析html直到我到達表的第一行,檢查它是否是我最後一次刮的值,如果不發送郵件。當我在現有的表格條目上進行測試時,這非常有效,除非發生實際更新時,刮擦並不會停留在最後的刮擦處。它會一直髮送郵件,直到表格耗盡並無限期重複。我無法弄清楚發生了什麼事。我知道沒有任何人可以在沒有網站的情況下進行驗證,但無論如何我都會發布我的代碼。我會很欣賞可能出錯的想法。Perl:意外的行爲與網站刮
代碼:
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 ([email protected]);
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('[email protected]');
$message->Cc('[email protected];[email protected]');
my $hd = "$name - $info";
$message->Subject($hd);
$message->Body(" ");
$message->Attach($link);
$message->send;
}
}
}
你可以包括你的while循環的代碼 - 在你檢查更新位。這可能是事情出錯的地方。 – Mike
我會建議您添加應用程序日誌記錄,以便您可以從日誌中檢查更多內容。此外,郵件發送計數器和受控制的停止也是好的。我已經從這樣的程序發送了數百次的電子郵件,我知道這可能是多麼令人討厭。 – weismat
我在循環中添加了代碼。郵件發送計數器的問題是,首先,我不知道有多少更新可以從刮擦到刮擦。其次,即使我做了限制,我每60秒運行一次腳本,所以下一次迭代開始重新發送郵件 – Aks