我正在使用WWW::Mechanize
将目录从我们的产品提供商加载到我们的数据库中。我每天每 2 小时运行一次这个脚本,它使用大约 50 个并发线程在大约 12 分钟内完成。
一切都很顺利,直到这个周末。他们将他们的网站离线进行定期维护,一旦他们再次在线,我的脚本就不再工作了。经过分析,归结为以下代码失败:
use strict;
use warnings;
use WWW::Mechanize;
my $mec = WWW::Mechanize->new;
$mec->get('https://www.imstores.com/Ingrammicromx/login/login.aspx');
print $mec->content;
代码终止(大约 60 秒后)并显示以下消息:
Error GETing https://www.imstores.com/Ingrammicromx/login/login.aspx:
Can't connect to www.imstores.com:443 at test.pl line 7.
现在,这些是让我难以找到问题的要点:
它与网络无关——如果我从任何浏览器访问相同的 URL,我就会得到该页面。
如果我在包含我的 Perl 安装的精确副本的远程机器上尝试相同的代码,它就可以工作。
如果我
use Net::SSL
之前WWW::Mechanize
,它需要很长时间,但最终得到页面。如果我尝试任何其他 SSL 页面,例如“ https://www.paypal.com ”,它可以运行并且非常快。
再说一次,它在他们预定的维护之前就开始工作了。
我不确定还能尝试什么。如果我切换到非 SSL 版本,它可以工作,但我不想这样做,因为我们会自动执行采购操作。
除了我脑海中闪过的许多事情,思考为什么它可以在远程机器上运行以及为什么我可以在本地浏览器中打开页面:
是否有可能被我的 SSL 公钥阻止?那可能吗?如果是这样,LWP/Mechanize 用于 SSL 会话的公钥是什么,我如何使用不同的公钥?
我当前设置的一些数据:
- 操作系统:Windows 7 Ultimate x64
- Perl 版本:5.16.3 x64
LWP::UserAgent
版本:6.05WWW::Mechanize
版本:1.72IO::Socket
版本:1.34IO::Socket::SSL
版本:1.85Net::SSL
版本:2.85Crypt::SSLeay
版本:0.64
提前感谢您提供任何有用的评论。