使用OpenVPN和Perl穿上隐形斗篷

屏幕抓取用户代理可以通过其IP地址和用户代理字符串等几个特征来识别。本文将展示如何使用HideMyAss.com的VPN服务和Perl模块Net::OpenVPN::Agent来混淆这些数据点,使您的用户代理更难被检测和监控。

先决条件

以下解决方案已在Linux上进行了测试,可能在其他基于UNIX的平台上也有效,但不太可能在Windows上工作。在开始之前,您需要安装OpenVPN(开源网络软件)- 这用于连接到HideMyAss.com的VPN网络。

您还需要通过CPAN安装Net::OpenVPN::Agent

cpan Net::OpenVPN::Agent

最后,您需要一个HideMyAss.com的“VPN Pro”账户。他们提供全球49,000个IP地址。我可以推荐他们的服务,并且已经成功使用了几个月。如果您有使用OpenVPN的VPN提供商的账户,您应该能够修改Net::OpenVPN::Agent以使用该服务(如果您需要帮助,请联系我 - 我是模块作者)。

概述

Net::OpenVPN::Agent提供了一个可配置的用户代理,它将在获取目标URL之前自动连接到HideMyAss.com的一个随机服务器。在可配置的请求数量之后,用户代理将自动断开连接并重新连接到另一个随机服务器。在连接到新服务器时,用户代理也将从可配置的用户代理字符串列表中选择一个新的用户代理字符串。这样,IP地址和用户代理字符串将同时改变,以采用新的身份。用户代理被设计成具有弹性:将尝试多次(可配置)建立服务器连接和失败的页面请求,使用远程服务确认新的IP地址,并通过Log::log4perl(也可配置)提供完整的日志记录功能。

配置

Net::OpenVPN::Agent需要一个名为agent.conf的YAML文件存在于根应用程序目录中。这在模块文档中有解释。

编写隐秘的抓取器

让我们组合一个简单的抓取器来展示这个概念。下面的代码初始化使用Net::OpenVPN::Agent来获取纽约时报网站的主页。然后它提取并请求找到的每个URL,目的是对内容做些处理。

use Net::OpenVPN::Agent;
use strict;
use warnings;
use 5.10.3;
use utf8;

my $ua = Net::OpenVPN::Agent->new;
my $base_url = 'http://www.nytimes.com';
my $html = $ua->get_page($base_url) =~ s/\n//gr;
foreach ($html =~ /href="($base_url.*?)"/g) {
    my $story = $ua->get_page($_)
    # do something
}

在终端运行此代码并启用完整日志记录将给出以下输出

sudo $(which perl) times.pl
DEBUG - setting ip address
DEBUG - GET: http://geoip.hidemyass.com/ip/
DEBUG - Request successful
DEBUG - Request limit is zero, resetting the request limit.
DEBUG - GET: http://securenetconnection.com/vpnconfig/servers-cli.php
DEBUG - Request successful
DEBUG - GET: http://securenetconnection.com/vpnconfig/openvpn-template.ovpn
DEBUG - Request successful
DEBUG - Connecting to 72.11.140.130, USA, California, Los Angeles (LOC1 S4), us
WARN - Ip address not changed, re-requesting ip
DEBUG - GET: http://geoip.hidemyass.com/ip/
DEBUG - Request successful
DEBUG - Ip address changed to 72.11.140.138 from 172.254.124.113
DEBUG - GET: http://www.nytimes.com
DEBUG - Request successful
DEBUG - GET: http://www.nytimes.com/weather
DEBUG - Request successful
DEBUG - GET: http://www.nytimes.com/pages/sports/index.html
DEBUG - Request successful
DEBUG - GET: http://www.nytimes.com/pages/science/index.html
DEBUG - Request successful
DEBUG - GET: http://www.nytimes.com/pages/health/index.html
DEBUG - Request successful
DEBUG - GET: http://www.nytimes.com/pages/arts/index.html
DEBUG - Request successful
DEBUG - Request limit is zero, resetting the request limit.
DEBUG - Disconnecting from server.
DEBUG - Connecting to 173.234.233.226, USA, New York, Manhattan (LOC1 S3), us
WARN - Ip address not changed, re-requesting ip
DEBUG - GET: http://geoip.hidemyass.com/ip/
DEBUG - Request successful
DEBUG - Ip address changed to 108.62.48.75 from 72.11.140.138
DEBUG - GET: http://www.nytimes.com/pages/style/index.html
DEBUG - Request successful
DEBUG - GET: http://www.nytimes.com/pages/opinion/index.html
DEBUG - Request successful
...

输出演示了用户代理首先与洛杉矶的VPN建立安全、加密的连接,然后继续请求纽约时报网站上的页面。一旦达到配置的页面请求限制,用户代理将自动断开连接并连接到纽约的新VPN,建立新的IP并采用新的用户代理字符串。从纽约时报网站服务器的角度来看,它收到了来自两个不同用户的请求系列,IP地址不同,一个在洛杉矶,另一个在纽约。而且这些都不是用户的实际IP地址。

警告

匿名爬取网站的能力是一项强大但可能有害的活动——你绝不应该为了不道德或不合法的目的而进行屏幕抓取。请遵守robots.txt。这种方法并不能保证匿名性:VPN提供商可能需要在执法机构的要求下披露所有连接日志。

披露

作为HideMyAss.comVPN的客户,我从本页链接的成功推荐中获得联盟支付。


本文最初发布在PerlTricks.com

标签

David Farrell

David是一位专业程序员,他经常在Twitter博客上分享代码和编程艺术的见解。

浏览他们的文章

反馈

本文有问题吗?请通过在GitHub上打开一个issue或pull request来帮助我们。