AWS Proxy Server 搭建

在数据科学领域,网页爬虫是获取外部数据(external data)的重要来源。但是在现有的反爬虫机制日益普遍且完善的情况下,简单的暴力爬虫已经越来越无法满足实际的数据获取需求。

具体而言,反爬虫机制中广泛应用的一个办法就是检查访问请求的ip地址。若在短时间大量访问网站,网站的服务器即会触发字符验证或者屏蔽该ip地址等操作。因而在很多时候,为了避免被ip被屏蔽列入黑名单或是手动输入验证码,爬虫者会采取用代理服务器(proxy server)以变更ip地址。以下是一个proxy server的原理示意图:

比如路人甲的家庭网ip地址是1.1.1.1,现在他想要爬虫知乎的热点话题,于是他利用ip地址是2.2.2.2的proxy server代理他提出访问请求。于是在知乎看来,这次的访问是从ip地址2.2.2.2的服务器发出的。通过不断更换proxy server,可以有效地减少被检测到爬虫的概率。

当然值得一提的是,proxy server本身的设计很大程度上是为了隐私。严格意义上是通过匿名(anonymity)的方式,保障了隐私(privacy)。例如,某人想要访问一些网页,但是不想被这些网页的服务器收集到自己所在ip下的访问内容和时间规律。于是他可以使用proxy server做代理访问。

在当下社会分工高度细化的时代,其实在网上可以找到很多或免费或收费的proxy server。其中收费的代理服务往往是通过付费api的形式实现。在谷歌上查找一下,就有很多这样的网站提供proxy server api的服务。例如:

代理云 - 企业级分布式代理IP池PAAS平台|提供HTTP代理IP池租用与定制服务​www.dailiyun.com/

但是在个人看来,这里有几个问题。一是很多这样的代理网站会被封,类似于VPN的网站;二是有些网站的收费其实略贵;三是不能保证这些代理的网站是否会收集用户的访问相关数据。当然,每个人有自己的利弊权衡。

言归正传,下面谈谈如何在亚马逊云(AWS)上搭建自己的proxy server。

第一步:注册aws账号AWS Console - Signup​portal.aws.amazon.com/billing/signup#/start第二步: 创建EC2 instance搜索EC2选择EC2服务器所在服务区点击launch instance选择Ubuntu Server XX.04 LTS, 此处以20.04 LTS为例任选一个instance type,其中t2.micro可以免费试用根据实际需求更改storage,添加tags以及设置security group修改security group设置:1. 添加port range(tinyproxy默认的port是8888,也可以添加别的port,本例中加入7777)2.为了安全性,可以将source设置为自己本地电脑的网络IP,这样只有自己的网络可以连接,从而避免proxy server被知道IP和端口的任何人试用

创建ssh key并下载到本地第三步:利用ssh key连接远端linux服务器

点击connectaws提供相应的ssh连接参考命令行以os系统为例第四步(optional):给EC2 instance添加静态IP地址,从而每次关机再重启,IP地址不会发生变化。(AWS默认会动态给EC2 instance分配IP,当关机后IP自动被释放到IP池中以增加IP的利用率)添加的静态IP地址在EC2 instance不运行时会收取一小笔“占坑费”。本例中,静态IP地址为52.72.15.228第五步:在远端linux服务器上安装Tinyproxy

运行以下命令行:

sudo apt-get update sudo apt-get install tinyproxy

而后用vim打开configuraion文件:

sudo vim tinyproxy.conf

在文件中,用#注释掉所有已有的IP地址

#Allow 127.0.0.1 #Allow 192.168.0.0/16 #Allow 172.16.0.0/12 #Allow 10.0.0.0/8

添加本地IP

Allow xxx.xxx.xxx.xxx

添加port

Port 8888 Port 7777

保存configuration文件

重启tinyproxy

sudo service tinyproxy restart第六步 检查proxy server是否运行成功

我们可以用python request包进行简单的测试,代码如下:

import requests proxy="https:52.72.15.228:7777" html = requests.get("", proxies={"https":proxy}, timeout=5) html.content.decode(latin-1)

注意到proxy中的IP地址是在第四步中的静态IP地址。proxy server运行成功!