如果它是https网站,我很难通过TOR访问网站,但如果它是一个http网站则不会。
#!/usr/bin/perl
use strict;
use WWW::Mechanize;
use LWP::Protocol::socks;
use LWP::Protocol::https;
use utf8;
my $mech = WWW::Mechanize->new(timeout => 60*5);
$mech->proxy(['http', 'https'], 'socks://localhost:9150');
$mech->get("https://www.google.com");
我收到错误消息:错误GETing https://www.google.com:状态读取失败:第10行的文件描述符错误,“第i10行是程序的最后一行。
在TOR浏览器中,我可以成功查看:“https://www.google.com”,端口为9150。 我正在使用ActivePerl 5.16.2; Vadalia 0.2.21和Tor 0.2.3.25。 我有一台Windows机器,我的主要互联网浏览器是Mozilla。
我尝试使用以下命令安装软件包:
cpan LWP::UserAgent
ppm install LWP::Protocol::https
cpan LWP::Protocol::https
ppm install LWP::Protocol::socks
cpan LWP::Protocol::socks
ppm install Mozilla::CA
ppm install IO::Socket::SSL
ppm install Crypt::SSLeay
cpan Crypt::SSLeay
感谢您的帮助!请告诉我是否有任何其他信息可以提供。
答案 0 :(得分:2)
时间以前,我已经找到了通过使用WWW :: Curl :: Easy来获取这些网站的https网站的方法,因为使用LWP我发现了同样的问题。 之后,我将所有html保存在文件中并使用WWW :: Mechanzie或HTML :: TreeBuilder进行解析。
如果您想要与帖子表格等网站进行更多互动,这种解决方案可能会更加繁琐,因为您需要与卷曲互动。
package Curl;
use warnings;
use WWW::Curl::Easy;
use WWW::UserAgent::Random;
my $curl = WWW::Curl::Easy->new;
my $useragent = rand_ua("browsers");
my $host = 'localhost';
my $port = '9070';
my $timeout = '20';
my $connectTimeOut= '20';
&init;
sub get
{
my $url = shift;
$curl->setopt(CURLOPT_URL, $url);
my $response_body;
$curl->setopt(CURLOPT_WRITEDATA,\$response_body);
my $retcode = $curl->perform;
if ($retcode == 0) {
print("Transfer went ok Http::Code = ".$curl->strerror($retcode)."\n");
my $response_code = $curl->getinfo(CURLINFO_HTTP_CODE);
# judge result and next action based on $response_code
return \$response_body;
} else {
# Error code, type of error, error message
print("An error happened: $retcode ".$curl->strerror($retcode)." ".$curl->errbuf."\n");
return 0;
}
}
sub init
{
#setejem el proxy
$curl->setopt(CURLOPT_PROXY,"$host:".$port);
$curl->setopt(CURLOPT_PROXYTYPE,CURLPROXY_SOCKS4);
#posem les altres dades
$curl->setopt(CURLOPT_USERAGENT, $useragent);
$curl->setopt(CURLOPT_CONNECTTIMEOUT, $connectTimeOut);
$curl->setopt(CURLOPT_TIMEOUT, $timeout);
$curl->setopt(CURLOPT_SSL_VERIFYPEER,0);
$curl->setopt(CURLOPT_HEADER,0);
}
希望这会对你有帮助!
答案 1 :(得分:1)
您使用的代理可能已经是HTTPS代理(即CONNECT代理)。在这种情况下,这应该工作(未经测试):
#!/usr/bin/perl
use strict;
use WWW::Mechanize;
use LWP::Protocol::socks;
use LWP::Protocol::https;
use utf8;
my $mech = WWW::Mechanize->new(timeout => 60*5);
$mech->proxy(['http'], 'socks://localhost:9150');
$mech->proxy(['https'], 'https://localhost:9150'); ### <-- make https go over https-connect proxy
$mech->get("https://www.google.com");
答案 2 :(得分:1)
我找不到原点,但我很久以前就和它斗争了。基本上我遇到的问题是LWP :: UserAgent用于https请求的imlpementation。
这个问题可能会对您有所帮助:How do I force LWP to use Crypt::SSLeay for HTTPS requests?