4

我正在尝试使用 Mechanize 获取 https,但失败了:

use strict;
use warnings;

use IO::Socket::SSL;
use WWW::Mechanize;

my $mech = WWW::Mechanize->new;
$mech->proxy(['https','http'], 'http://proxy:8080/');
$mech->get('https://www.google.com');

print $mech->content;

错误:

Error GETing https://www.google.com: Bad Request at perl4.pl line 9.

当我尝试使用LWP::UserAgent时,我能够获得 https 而不会出现任何错误:

use LWP::UserAgent;

my $ua  = LWP::UserAgent->new;
$ua->proxy(['https','http'], 'http://proxy:8080/');
$ua->get('https://www.google.com');

有人可以帮忙吗?

目前使用机械化 1.72

4

3 回答 3

4

WWWW::Mechanize 基于 LWP::UserAgent,多年来它对 https 代理请求有一个奇怪的想法,例如,它不是使用 CONNECT 请求来构建隧道然后升级到 SSL,而是发送带有 https-URL 的 GET 请求. 见https://rt.cpan.org/Ticket/Display.html?id=1894

一个fix终于被合并到了libwwww-perl github仓库中,但是不知道什么时候会发布新版本的LWP。与此同时,您可能会使用 Net::SSLGlue::LWP 猴子修补 LWP 以提供对 https 代理的适当支持(我是 Net::SSLGlue::LWP 和 LWP 修复程序的作者)。

于 2013-12-19T20:44:38.437 回答
0

我已经安装了 LWP-Protocol-connect-6.03 并连接到代理

$https_proxy = 'connect://proxy:8080/';

现在工作正常:D

于 2014-01-03T01:09:17.287 回答
0

我猜,根据您提供的代理阻止某个用户代理的错误。LWP::UserAgent 使用的 HTTP 用户代理与 WWW::Mechanize 不同。

我建议尝试使用这一行:

my $mech = WWW::Mechanize->new( agent => 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36' );

这将使代理和接收服务器相信您是 Chrome 浏览器,而不是某种爬虫/恶意软件/病毒/等

另一个建议是对 $mech 元素进行数据转储并确认“内部”是什么:

use Data::Dumper;
print Dumper($mech);

您也可以使用相同的方法来转储函数调用$mech后的内容。get()

不确定它是否相关,但请注意,并非所有代理都支持 HTTPS/SSL,只有那些允许内联代理/CONNECT 代理的代理才会允许您代理 HTTPS/SSL 流量。

于 2013-12-03T14:08:51.513 回答