0%

小白学爬虫之代理(公有云)

Hello 各位小伙伴 雷门吼!

在教程之前首先申明!此教程适合土豪不缺钱的玩家

潜水了许久了,今天来更新点东西~ 今天说点啥呢? 那就是代理!! 代理在爬虫界的重要作用相信各位应该清楚吧!毕竟绝大部分反爬可以靠代理解决;不能被代理解决的也得要代理配合解决。 市面上各种代理也是琳琅满目的说··· 相信大家最喜欢用的之一应该就是 某布云。 根据官网的显示他他家的代理是这个样子的:

  • 无须切换 IP,每一个请求一个随机 IP。

哇!感觉很爽的样子今天我们就来实现一个类似的代理! 其实 So Easy! 我们需要借助 公有云 来实现。 下面我以 AWS 举例(其它公有云操作类似,唯一的区别的就是:各个服务的名字不同而已)

  1. 首先我们需要需要使用 EC2 来建立一个代理(Google Could 叫 GCE)
    1. 安装 Squid(当然你可以使用其它的代理)
      1. 无认证安装参考这儿(点我)设置代理服务器那一段
      2. MySQL 认证安装(点我)
      3. Note: 请注意检查!!!务必设置 Ipv4 转发
  2. 安装完成之后我们制作启动模板(毕竟一个 EC2 一个 IP 你总不能安装很多很多台吧!会死人的)
    1. 注意设置你的安全组!正常情况下 入站规则只应该有你需要的端口(squid 使用的端口一定要放心!嫌麻烦的小伙伴儿 可以进出都放行全部流量!)出站则是全部流量!
    2. 启动 EC2 的时候选择安全组一定要看清是否是设置过放行的规则! 不要选错了!
    3. 好了现在就可以批量启动了!
    4. 实例数量就是需要同时有多少个 IP 就启动多少个了。
  3. 设置前端负载均衡(提供一个固定地址,这个地址负责随机将请求转发到后端代理服务器上)
    1. 必须使用 TCP 四层负载!原因为啥大家自己百度一哈
    2. 等待负载均衡器启动完成!
    3. 启动完成后获取负载地址
  4. 下面来测试一下效果!

以上完毕!你可以不停的重启 Ec2 实例!你就有百万 IP 池啦!!(前提是你有钱啊) 下面是重启 Ec2 的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import boto3
from boto3 import setup_default_session


setup_default_session(aws_access_key_id='XXXXXX',
aws_secret_access_key='XXXXXX',
region_name='区域')

ec2 = boto3.client('ec2')


def get_public_ip_address():
"""
获取IP和实例ID
:return: {实例ID: ip}
"""
response = ec2.describe_instances()
reservations = response.get('Reservations')
instances = [i.get('Instances')[0] for i in reservations]
instance_id_public_ip_address = {i.get('InstanceId'): i.get('PublicIpAddress') for i in instances}
return instance_id_public_ip_address


def reboot_ec2(ip):
"""重启实例
:param ip:
:return:
"""
instance_id_public_ip_address = get_public_ip_address()
instance_id = instance_id_public_ip_address.get(ip)
try:
ec2.reboot_instances(InstanceIds=[instance_id], DryRun=True)
except ClientError as e:
if 'DryRunOperation' not in str(e):
print("You don't have permission to reboot instances.")
raise

try:
response = ec2.reboot_instances(InstanceIds=[instance_id], DryRun=False)
print('Success', response)
except ClientError as e:
print('Error', e)