很多刚接触 Python 爬虫的小伙伴,在经历了第一次“访问被封”的毒打后,都会立刻意识到一个真理:数据采集必须得上代理 !
但是,当你打开各大代理厂商的购买页面时,往往会瞬间懵圈:“API 提取代理” 和 “隧道代理(爬虫代理)” 到底是个啥?我的高并发爬虫到底该选哪一个?
别慌,今天我们就用最接地气的方式,帮你把这两个概念彻底搞懂,并附带可以直接在本地跑起来的实战代码!
一、 形象比喻:自己做饭 vs 点外卖
理解这两种代理模式,我们可以打个简单的比方:
1. API 提取代理 = “去菜市场买菜自己做”
- 怎么玩: 代理商会给你一个 API 接口链接。你每次请求这个链接,它会返回一串 IP 地址(比如 10 个新鲜的蔬菜)。
- 你的工作: 你需要把这些 IP 存到你自己的代码里(建立 IP 池),然后自己写代码去分配这些 IP。如果哪个 IP 过期了、失效了(菜坏了),你得自己把它扔掉,再去请求新的。
- 优缺点: 自由度极高,你能清楚地看到自己用了哪些 IP。但非常折腾,你需要写很多额外的代码来维护和测试这些 IP。
2. 隧道代理(爬虫代理) = “直接点外卖”
- 怎么玩: 代理商只给你一个固定不变的入口地址(比如 t.16yun.cn:31111)。
- 你的工作: 你什么都不用管!你只需要把所有的爬虫请求都塞进这个固定地址。代理商的云端服务器(隧道)会在幕后自动帮你把请求转发到世界各地的不同 IP 上。
- 优缺点: 极其省心!也就是我们常说的“即插即用”。代码极简,你只需要关注怎么解析网页,完全不用操心 IP 怎么切换、怎么维护。
选型建议: 如果你是刚入门的新手,或者你的爬虫项目需要跑高并发(同时发出几百上千个请求),强烈建议直接上“隧道代理”。把复杂的调度工作交给服务商,把精力留给更重要的数据解析逻辑!
二、 快速上手 Demo (Python 实现)
说干就干!无论你平时习惯用什么设备写代码,哪怕只是在本地的 Mac mini 上起一个小脚本测试,这段 Python 代码都能让你零基础体验隧道代理的便捷。
我们将使用 requests 库,并配置隧道代理(爬虫代理)、User-Agent(浏览器)和 Cookie(身份保持)。
环境准备
如果你还没有安装 requests 库,请先在终端运行:
pip install requests
核心实战代码
import requests
import random
import time
# ==========================================
# 1. 配置隧道代理 (以亿牛云爬虫代理为例)
# ==========================================
# 代理服务器的主机和端口
proxy_host = "t.16yun.cn"
proxy_port = "31111"
# 代理的身份认证信息 (你在控制台获取的用户名和密码)
proxy_user = "your_username" # 替换为你的真实用户名
proxy_pass = "your_password" # 替换为你的真实密码
# 拼接代理 URL,格式严格为:http://用户名:密码@地址:端口
proxy_url = f"http://{proxy_user}:{proxy_pass}@{proxy_host}:{proxy_port}"
# 组装给 requests 用的代理字典
proxies = {
"http": proxy_url,
"https": proxy_url
}
# ==========================================
# 2. 伪装自己 (User-Agent 和 Cookie)
# ==========================================
# 准备几个不同的浏览器“马甲”,防止被目标网站认出是同一个人
ua_list = [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36"
]
def fetch_page(url):
"""
发起请求的函数
"""
# 每次请求随机挑一件“马甲”穿上
headers = {
"User-Agent": random.choice(ua_list),
# 填入你提前在浏览器抓包获取到的 Cookie,用于访问需要登录的页面
"Cookie": "login_session=abc12345; user_id=998877;",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
}
try:
print(f"开始通过隧道代理请求: {url}")
# 发起请求,把代理和伪装头都带上,设置10秒超时防止卡死
response = requests.get(url, headers=headers, proxies=proxies, timeout=10)
if response.status_code == 200:
print("请求成功!")
# 打印返回信息的前100个字符看看效果
print("返回内容片段:", response.text[:100], "...\n")
else:
print(f"请求失败,状态码: {response.status_code}\n")
except Exception as e:
print(f"发生网络错误: {e}\n")
if __name__ == "__main__":
# 使用 httpbin 这个测试网站来验证我们的 IP 是否真的变了
# 这个接口会返回你当前的出口 IP
target_url = "http://httpbin.org/ip"
# 连续请求 3 次,看看隧道代理是不是在默默帮我们换 IP
for i in range(1, 4):
print(f"--- 第 {i} 次测试 ---")
fetch_page(target_url)
time.sleep(1) # 礼貌性延迟,不要给测试网站太大压力
三、 新手常见问题 (FAQ)
Q1:代码里的代理 URL 写法好奇怪,为什么要带 @ 符号?
这叫 HTTP Basic Authentication(基础认证)。因为大部分高质量的代理都是需要账号密码才能用的,这种写法是 HTTP 协议规定的一种快捷认证方式,requests 库原生支持,不需要你再手写复杂的 Base64 认证头。
Q2:我怎么知道隧道代理真的帮我换 IP 了?
跑一下上面代码里的 http://httpbin.org/ip 就知道了!由于隧道代理在服务端帮你做了轮询,你会发现即便代码里的 proxy_host 没变,每次接口返回的 origin(即你的出口IP)都在不停地变换。这就是隧道代理的魅力!