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)