移动蜂窝代理集成指南

3 阅读5分钟

在网络爬虫与反爬虫措施的日益激烈的斗争中,主要网站和应用的风险控制检测变得愈发严格,其中之一就是 IP 禁止。

为了应对 IP 禁止问题,设置代理是一种有效的方法。通过设置代理,爬虫可以使用代理的 IP 地址来伪装其真实 IP 地址,从而绕过反爬虫限制。

然而,代理的质量参差不齐。市场上大多数免费的代理要么无法使用,要么已经被禁止,而一些普通的付费代理也已被主要网站和应用的风险控制黑名单所列。因此,当前可用于数据爬取的高质量代理数量显著减少。目前,市场上主要的高质量代理类型包括专用代理、ADSL 代理和移动蜂窝代理。

本指南将介绍基于移动蜂窝网络(4G、5G)旋转代理服务的应用及使用方法。

移动蜂窝代理

移动蜂窝代理本质上是基于移动数据的代理服务,所有代理 IP 都是真实的移动 IP。这种类型的代理在爬取领域相对较少使用,因此被禁止的概率较低,非常适合爬取具有强风险控制的网站和应用。

该代理服务建立在大规模的群控移动池上,所有流量通过真实的移动数据转发,支持几乎所有市场上网站和应用的数据请求。代理质量极高,显著降低了风险控制的概率。

应用方法

要使用蜂窝代理服务,您可以首先访问 申请页面 进行申请。首次申请将赠送 1 点免费配额。

如果未登录,系统将自动重定向到登录页。登录后,您可以继续进行申请。

使用方法

申请完成后,您可以在“控制台”中查看申请结果,如下图所示:

点击“凭证”查看使用蜂窝代理服务的用户名和密码,格式为“用户名:密码”。用户名为 8 个字符,密码为 32 个字符,如下图所示:

该移动蜂窝代理是一个旋转代理,因此在使用时,您只需设置一个固定的代理地址和端口。代理地址为 cellular.proxy.acedata.cloud,端口为 30000。该代理支持 HTTP/HTTPS/SOCKS 协议,可以用来请求使用 HTTP 和 HTTPS 协议的网站。

命令测试

获取代理的用户名和密码后,最简单的测试方式是通过 curl 命令行。如果尚未安装,请参考 curl 官方网站 进行安装。

如果当前代理的用户名和密码为 1f78266a:eff0896726224fa2a99fe82dd1f07562,您可以使用以下 curl 命令进行测试:

curl -x 1f78266a:eff0896726224fa2a99fe82dd1f07562@cellular.proxy.acedata.cloud:30000 https://ipinfo.io

在这里,我们使用 curl 的 -x 参数指定代理地址。默认代理协议为 HTTP/HTTPS,请求的 URL 为 ipinfo.io,该 URL 可以返回请求该网站的真实 IP 地址及其位置。

注意:上面的用户名和密码可能无效;请替换为您自己的用户名和密码。

输出结果如下:

{
  "ip": "39.144.10.182",
  "city": "Shanghai",
  "region": "Shanghai",
  "country": "CN",
  "loc": "31.2222,121.4581",
  "org": "AS9808 China Mobile Communications Group Co., Ltd.",
  "postal": "200000",
  "timezone": "Asia/Shanghai",
  "readme": "https://ipinfo.io/missingauth"
}

如您所见,返回结果的国家为 CN,代表中国,组织为 China Mobile,表明这是一个蜂窝代理。

如果再次运行,您可以获得不同的结果;每次请求将获得随机的 IP 出口。

代码集成

以下是一个 Python 示例,演示如何设置蜂窝旋转代理:

import requests

proxy = 'http://{proxy_username}:{proxy_password}@cellular.proxy.acedata.cloud:30000'

proxies = {
    'http': proxy,
    'https': proxy
}

for _ in range(3):
    resp = requests.get('https://ipinfo.io', proxies=proxies)
    print(resp.text)

在这里,我们首先声明代理 URL,并将其定义为 proxy 变量,协议为 HTTP,后面跟着旋转代理的用户名和密码(即控制台中显示的用户名和密码,使用冒号分隔),最后是 @ 符号和代理地址及端口。

接下来,我们声明一个 proxies 变量,配置两个键值对,键为 http 和 https,值均为代理,表示对 HTTP 和 HTTPS 网站的请求将使用在 proxy 变量中定义的代理。

然后,我们定义一个循环测试代理三次,请求的 URL 仍为 ipinfo.io

输出结果如下:

{
  "ip": "39.144.18.26",
  "city": "Shanghai",
  "region": "Shanghai",
  "country": "CN",
  "loc": "31.2222,121.4581",
  "org": "AS9808 China Mobile Communications Group Co., Ltd.",
  "postal": "200000",
  "timezone": "Asia/Shanghai",
  "readme": "https://ipinfo.io/missingauth"
}
{
  "ip": "39.144.18.26",
  "city": "Shanghai",
  "region": "Shanghai",
  "country": "CN",
  "loc": "31.2222,121.4581",
  "org": "AS9808 China Mobile Communications Group Co., Ltd.",
  "postal": "200000",
  "timezone": "Asia/Shanghai",
  "readme": "https://ipinfo.io/missingauth"
}
{
  "ip": "39.144.182.55",
  "city": "Zhanjiang",
  "region": "Guangdong",
  "country": "CN",
  "loc": "21.2339,110.3875",
  "org": "AS24445 Henan Mobile Communications Co.,Ltd",
  "postal": "524000",
  "timezone": "Asia/Shanghai",
  "readme": "https://ipinfo.io/missingauth"
}

可以看到,每次运行获取的代理 IP 是随机的,且 IP 的位置确实来自真实的移动流量。

当然,上述代理设置方式实际上是相对简单的设置。

实际上,上述代码等同于在请求中设置了额外的头部——Proxy Authorization,因此上述代码也可以重写为:

import requests
import base64

proxy_host = 'cellular.proxy.acedata.cloud'
proxy_port = '30000'
proxy_username = '{proxy_username}' # 8-character username
proxy_password = '{proxy_password}' # 32-character password

credentials = base64.b64encode(
    f'{proxy_username}:{proxy_password}'.encode()).decode()

proxies = {
    'http': f'http://{proxy_host}:{proxy_port}',
    'https': f'http://{proxy_host}:{proxy_port}'
}

headers = {
    'Proxy-Authorization': f'Basic {credentials}'
}

for _ in range(3):
    resp = requests.get('https://ipinfo.io',
                        proxies=proxies, headers=headers)
    print(resp.text)

在这里,我们通过 Proxy-Authorization 请求头设置代理的用户名和密码(需进行 Base64 编码),该代码的运行效果相同。

对于其他语言,例如 JavaScript 的 axios,也可以使用类似的设置方法:

const axios = require("axios");
const base64 = require("base64");

const proxy_host = "cellular.proxy.acedata.cloud";
const proxy_port = "30000";
const proxy_username = "{proxy_username}"; // 8-character username
const proxy_password = "{proxy_password}"; // 32-character password

const credentials = base64.encode(`${proxy_username}:${proxy_password}`);

const proxies = {
  http: `http://${proxy_host}:${proxy_port}`,
  https: `http://${proxy_host}:${proxy_port}`,
};

const headers = {
  "Proxy-Authorization": `Basic ${credentials}`,
};

for (let i = 0; i < 3; i++) {
  axios
    .get("https://ipinfo.io", { proxies, headers })
    .then((resp) => console.log(resp.data))
    .catch((err) => console.error(err));
}

运行效果相