付费代理的使用

前面两节我们讲解了代理的基本使用方法和免费代理池的搭建过程,但使用过程中其实还会存在代理不稳定的情况,例如代理的失效速度快、运行速度慢。毕竟这些代理都是可以公开获取的,可能有很多人在用,稳定性差也不足为奇了。

相对免费代理,付费代理的稳定性更高,所以如果想进一步提高代理的稳定性,可以考虑使用付费代理。

付费代理的分类

按照使用流程,可以大致将付费代理分为两类。

  • 一类是代理商提供代理提取接口的付费代理,我们可以通过接口获取这类代理组成的列表,这类代理地址的IP和端口都是可见的,想用哪个就用哪个,灵活操控即可。这种代理一般会按时间或者按量收费,比较有代表性的这类代理有快代理( https://www.kuaidaili.com/ )、芝麻代理( http://www.zhimaruanjian.com/ )和多贝云代理( http://www.dobel.cn/ )等。

  • 另一类是代理商搭建了隧道代理的付费代理,我们可以直接把此类代理设置为固定的 IP 和端口,无须进一步通过请求接口获取随机代理并设置。在这种情况下,我们只需要知道一个固定的代理服务器地址即可,代理商会在背后进一步将我们发出的请求分发给不同的代理服务器并做负载均衡,同时代理商会负责维护背后的整个代理池,因此开发者使用起来更加方便,但这样就无法自由控制设置哪个代理 IP 了。比较有代表性的这类代理有阿布云代理( https://www.abuyun.com/ )、快代理( https://www.kuaidaili.com/ )和多贝云代理( http://www.dobel.cn/ )等。

本节分别讲解这两类代理的使用方法。

通过接口提取代理

这里我以快代理为例演示通过接口获取代理并使用的方法,需要先到快代理的官方网站注册一个账号并购买对应的套餐。由于我的目的仅仅是测试,因此我购买的是私密代理套餐,类似的套餐还有开放代理和独享代理,私密代理相对开放代理来说稳定性更高,相对独享代理来说价格更实惠,总体性价比更高。

私密代理的介绍链接为 https://www.kuaidaili.com/doc/product/dps/ ,官方简介内容是:私密代理是我们自运营的高品质 HTTP/SOCKS 代理服务器,IP 动态变化,仅对购买客户授权使用。每天可用 IP 超 15 万个,支持 API 接口和 SDK。

私密代理提取接口的说明链接为 https://www.kuaidaili.com/doc/api/getdps/ ,接口地址为 http://dps.kdlapi.com/api/getdps

在调用私密代理提取接口时需要传入一些参数,参数的官方说明如表9-1所示。

Table 1. 表 9-1 调用私密代理接口提取接口时传入的参数
参数 是否必填 参数说明 取值说明

orderid

订单号

有效的私密代理订单号

sign_type

签名验证方式。目前 simple 和 hmacsha1

默认值: simple

signature

请求签名,用来验证此次请求的合法性。私密代理接口默认不需要验证签名,但在会员中心开启验证后,此参数为必填项

支持 2 种签名验证方式

timestamp

当前的 UNIX 时间戳 (秒级),可记录发起 API 请求的时间。sign_type 取 hmacsha1 时此参数为必填项

例如 1557546010,如果其取值与当前时间相差过大,会引起签名过期错误

num

提取数量

例如 100

area

筛选某些地区的 IP,支持按省/市筛选,仅支持按量付费的订单

多个地区用英文逗号分隔,例如北京,上海

area_ex

排除某些地区的 IP,支持按省/市排除,仅支持按量付费的订单

多个地区用英文逗号分隔,例如北京,上海

ipstart

筛选以特定数字开头的 IP (多个 IP 段用英文逗号分隔)

例如 120.52.

ipstart_ex

排除以特定数字开头的 IP (多个 IP 段用英文逗号分隔)

例如 120.52.

pt

提取的代理 IP 的类型

1 表示 HTTP 代理 (默认), 2 表示 SOCKS 代理

st

按稳定使用时长筛选 IP,这个稳定使用时长是从提取时算起,此参数只对"均匀提取 30-60 分钟版"有效

0: 不筛选 (默认) 其他值:自定义时长 (1-50 分钟)

f_loc

提取结果包含地区信息

取值固定为 1

f_citycode

提取结果包含地区编码

取值固定为 1

f_et

提取结果包含此代理从提取时算起的可用时间 (单位: 秒)

取值固定为 1

dedup

过滤昨天提取过的 IP,不带此参数代表不过滤

取值固定为 1

format

接口返回内容时的格式

text 表示文本格式 (默认), json 表示 JSON 格式, xml 表示 XML 格式

sep

结果列表中,每个代理的分隔符

1 表示用 "\r\n" 分隔 (默认), 2 表示用 "\n" 分隔, 3 表示用空格分隔, 4 表示用 "|" 分隔

可以看到,这里支持指定的内容还是比较多的,例如提取数量、地区、代理类型和过滤条件等。

接口可返回文本格式、JSON 格式或 XML 格式的内容,对返回内容中字段的说明如表 9-2 所示。

Table 2. 表 9-2 返回内容中字段的说明
参数 说明

code

返回码。取值: 0 代表成功; 非 0 代表失败

msg

错误信息

data

包含接口返回的数据

data.proxy_list

返回的代理组成的列表

data.count

返回的代理数量

data.dedup_count

返回的不重复代理数量 (按量付费、包年包月集中提取订单专有)

data.order_left_count

订单提取余额 (按量付费订单专有)

data.today_left_count

今天提取余额 (包年包月集中提取订单专有)

好,基本的请求参数和返回结果我们已经搞清楚了,下面实践看看。

购买相应的套餐之后,可以在订单页面找到对应的订单号,例如我的订单号是 937260530591661,如图 9-4 所示。

图9-4 套餐的订单号

然后点击 “生成 API 链接” 选项,即可跳转到快代理提供的提取页面,这里它已经准备好了操作界面,通过点选就可以配置参数了。例如图 9-5,填好订单号,把提取数量设为 10,代理类型选 http/https 其他选项均保持默认,最后点击底部的 “生成链接” 按钮。

图9-5 配置参数

之后会看到生成了一个 API 链接,这里我生成的 API 链接为 https://dps.kdlapi.com/api/getdps/?orderid=937260530591661&num=10&pt=1&sep=1 ,直接访问就可以看到代理列表了,一共是 10 个,如图 9-6 所示。

图9-6 代理列表

这些就是可用的代理了。为了防止代理被滥用,快代理设置了白名单机制:

  1. 需要设置 IP 白名单或用户名密码才能使用私密代理;

  2. IP 白名单和用户名密码最好二选一,如果是使用用户名密码访问的,请不要设置 IP 白名单。

可以根据其提示设置用户名密码访问或 IP 白名单访问,这里我使用的是 IP 白名单,这个 IP 得是我们对外开放的公网 IP,可以通过很多方式查询到,例如通过百度直接查询,如图 9-7 所示。

图9-7 通过百度查询IP

此时我的 IP 地址为 120.244.118.134,把这个 IP 设置到快代理的后台,我就可以正常使用代理了。当然,你需要找到你的 IP,然后设置白名单。

以上流程完成后,我们用代码实现一下,测试图 9-6 中的 IP 是否可用:

import requests

PROXY_API = 'http://dps.kdlapi.com/api/getdps/?orderid=937260530591661&num=10&pt=1&sep=1'

def get_proxies():
    response = requests.get(PROXY_API)
    return response.text.split('\n')


def test_proxies():
    proxies = get_proxies()
    for proxy in proxies:
        proxy = proxy.strip()
        print(f'using proxy {proxy}')
        try:
            response = requests.get('http://www.httpbin.org/ip', proxies={
                'http': 'http://' + proxy,
            })
            print(response.text)
        except requests.ConnectionError:
            print(f'proxy {proxy} is invalid')


if __name__ == '__main__':
    test_proxies()

这里首先声明了一个 PROXY_API,其值就是上文获取的用于提取代理的 API 链接,然后我们使用 get_proxies 方法请求了这个 API,会返回由可用代理组成的列表,再利用 split 方法将列表的代理逐行分开。接着,我们在 test_proxies 方法里面直接用 requestsget 方法请求了 http://www.httpbin.org/ip ,这会返回请求的真实 IP 地址,代理我们是通过 proxies 参数设置的。

注意,由于我们访问的是 HTTP 类型的页面,所以只需要把 proxies 参数设置成以 http 为字典键名的代理即可,无须再设置以 https 为字典键名的代理。另外,键值内容也是 HTTP 类型的代理,即 http://加上代理。

最后直接打印出网站返回的结果。运行一下代码,输出结果类似如下这样:

using proxy 180.113.8.241:21871
{
"origin": "180.113.8.241"
}
using proxy 175.42.129.219:21350
{
"origin": "175.42.129.219"
}
using proxy 182.38.205.29:18475
{
"origin": "182.38.205.29"
}
using proxy 49.68.111.50:20095
{
"origin": "49.68.111.50"
}
...

可以看到,首先输出提取并使用的代理,然后输出请求 http://www.httpbin.org/ip 的返回结果,会发现代理和网站返回的真实 IP 完全一样。

这样就证明我们成功使用代理请求了网站并达到了伪装真实 IP 的目的。

使用隧道代理

上面我们介绍了利用接口提取代理的使用方法,可以发现这个过程其实相对烦琐,首先得请求接口获取代理,然后选出想用的代理,再设置代理发出请求,那么有没有更方便的设置代理的方法呢?

有,这个方法在前面也提到过,就是隧道代理。

隧道代理相当于服务商在云端维护了一个代理池,客户端只需要设置一个固定的代理服务器,换 IP 的流程由服务器来完成,让用户使用的流程更简单。用户无须更换 IP,隧道代理会将请求转发给不同的代理,可按需指定转发周期。

这里我们还是以快代理为例演示隧道代理的使用方法,首先需要购买隧道代理的套餐,链接为 https://www.kuaidaili.com/doc/product/tps/ ,购买之后进入个人中心可以看到类似如图 9-8 所示的页面。

图9-8 隧道代理套餐

其中显示隧道 host 为 tps136.kdlapi.com,HTTP 端口为 15818,Socks 端口为 20818,我们只需要在请求目标网站的时候把代理设置为这个 host 和这个端口的组合就好了。另外,使用隧道代理需要用到用户名和密码,这两项也在图 9-8 所示的页面里。

另外,这里同样需要设置白名单,按照前一节类似的流程设置即可。接下来我们根据后台提供的一些信息测试一下隧道代理的设置,测试代码如下:

import requests

url = 'http://www.httpbin.org/ip'

# 代理信息
proxy_host = 'tps136.kdlapi.com'
proxy_port = '15818'
proxy_username = 't17260533422646'
proxy_password = 'v93cq4tk'

proxy = f'http://{proxy_username}:{proxy_password}@{proxy_host}:{proxy_port}'
proxies = {
    'http': proxy,
    'https': proxy,
}
response = requests.get(url, proxies=proxies)
print(response.text)

这里首先声明了 proxy_hostproxy_portproxy_usernameproxy_password,分别是隧道代理的 host、端口、认证所需的用户和密码。然后调用了 requestsget 方法,并传入 proxies 参数。

接将代理设置为隧道代理的地址。

运行代码,看下效果:

{
  "origin": "117.92.214.244"
}

可以看到返回了客户端的 IP,但校验之后发现这个 IP 并不是我们的真实 IP,说明代理设置成功了。

然后再同时运行几次,可以看到运行结果一直在变化,例如:

{
  "origin": "122.246.92.129"
}
{
  "origin": "113.121.20.52"
}

这说明每次请求时的代理 IP 是随机变化的。

所以,我们现在只需要设置一个固定的隧道代理就可以实现在每次请求时自动切换 IP 了,使用起来更加方便。

总结

本节讲了两种代理的设置方案,各有各的优势。

  • 通过接口提取代理: 我们可以灵活地控制使用哪个代理,同时可以将代理对接到代理池中维护起来,整体的使用灵活性更高。

  • 使用隧道代理: 我们无须关心具体使用哪个代理,会更加省心。

两种方案各有利弊,可以根据具体的业务场景具体选择。