
用代理IP爬数据时,不少人都陷入过“IP换了一轮又一轮,封禁照样找上门”的怪圈。其实你可能踩了个隐形坑:忽略了User-Agent的管理。如果把代理IP比作爬虫的“匿名身份证”,那User-Agent就是这张身份证上的“职业信息”——信息造假或千篇一律,平台反爬系统一眼就能识破。今天就彻底讲透User-Agent的管理技巧,从原理到实战代码全覆盖,帮你用对这招降低90%的封禁风险。

先搞懂:User-Agent为啥能左右代理IP生死?
User-Agent(简称UA)是爬虫发给网站的“访问名片”,上面清晰写着:你用的是Windows还是Mac,Chrome还是Firefox,手机还是电脑。真实用户的UA千差万别,而爬虫的“致命伤”往往是UA异常——要么用代码默认值,要么全用同一种UA,这就像一群人拿着 identical 的身份证出门,不被盯上才怪。
最常见的错误就是用Python requests库的默认UA:“python-requests/2.31.0”。这相当于在脑门上贴“我是爬虫”,就算你用的是站大爷这类正规平台的高匿IP,平台也会直接拦截——因为正常用户根本不会用“代码程序”当浏览器。还有人图省事,一直用同一个Chrome UA爬数据,短时间内高频请求,平台会判定“这个用户行为异常”,连带着代理IP一起拉黑。
核心技巧1:建“优质UA池”,拒绝“单一化”
真实用户的UA是多样化的,爬虫的UA池也得“接地气”。优质UA池要满足两个条件:一是覆盖主流设备和浏览器,二是用最新版本——老旧UA(比如IE浏览器的)现在几乎没人用,反而容易被标为异常。
这里给一个现成的优质UA池,包含电脑、手机、平板多种场景,直接复制用:
UA池不用贪多,10-15个优质UA足够,重点是“类型杂、版本新”。如果怕过时,直接用浏览器访问“https://www.whatismybrowser.com/”,复制自己浏览器的最新UA补充进去。
核心技巧2:动态随机切换,模拟“真实访问”
有了UA池,关键在“随机切换”——每次发送请求都从池里抽一个不同的UA,而不是一个UA用到底。这里要注意“切换节奏”:不用每次请求都换,但同一UA连续请求别超过5次,避免被平台标记“行为固化”。
下面的代码把“UA随机切换”和“代理IP调用”结合起来,直接就能跑:
import requests
import random
import time
# 1. 构建优质UA池(可根据需求补充)
USER_AGENT_POOL = [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Firefox/129.0",
"Mozilla/5.0 (Linux; Android 14; Pixel 8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Mobile Safari/537.36",
"Mozilla/5.0 (Linux; Android 14; MI 14) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Mobile Safari/537.36 MicroMessenger/8.0.45",
"Mozilla/5.0 (iPad; CPU OS 17_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.4.1 Mobile/15E148 Safari/604.1"
]
# 2. 从站大爷API获取代理IP(替换为你的API密钥)
def get_proxy_from_zdaye():
api_url = "https://www.zdaye.com/PrivateProxy.html?num=1&type=住宅IP&format=json&key=你的API密钥"
response = requests.get(api_url)
if response.status_code == 200:
ip_info = response.json()["data"][0]
return {
"http": f"http://{ip_info['ip']}:{ip_info['port']}",
"https": f"https://{ip_info['ip']}:{ip_info['port']}"
}
return None
# 3. 动态获取随机UA
def get_random_ua():
return random.choice(USER_AGENT_POOL)
# 4. 核心请求函数(UA+代理协同工作)
def crawl_with_ua_proxy(target_url, request_count=10):
proxy = get_proxy_from_zdaye()
if not proxy:
print("获取代理IP失败")
return
success_count = 0
for i in range(request_count):
# 每3次请求换一次UA,平衡稳定性和随机性
if i % 3 == 0:
current_ua = get_random_ua()
headers = {
"User-Agent": current_ua,
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
}
try:
# 加随机延迟,更像真人操作
time.sleep(random.uniform(0.8, 2.0))
response = requests.get(target_url, proxies=proxy, headers=headers, timeout=10)
if response.status_code == 200:
success_count += 1
print(f"第{i+1}次请求成功 | 当前UA:{current_ua[:50]}...")
else:
print(f"第{i+1}次请求失败 | 状态码:{response.status_code}")
except Exception as e:
print(f"第{i+1}次请求异常 | 原因:{str(e)[:30]}")
# 代理IP失效,重新获取
proxy = get_proxy_from_zdaye()
if not proxy:
break
print(f"\n请求完成 | 总次数:{request_count} | 成功次数:{success_count} | 成功率:{success_count/request_count*100:.1f}%")
# 执行爬取(测试目标网站可替换)
if __name__ == "__main__":
target = "https://www.baidu.com"
crawl_with_ua_proxy(target, request_count=10)核心技巧3:UA与场景匹配,别“张冠李戴”
UA管理的进阶技巧是“场景化匹配”——爬什么平台,就用对应场景的UA,别用电脑端UA爬手机端页面,也别用老年机UA爬年轻人聚集的短视频平台。
举个例子:爬京东、淘宝这类电商平台,电脑端和手机端UA可以混用,因为很多用户会跨设备购物;但爬抖音、快手的移动端页面,就优先用手机端微信或Chrome UA,避免用电脑端UA暴露异常;爬政府、企业官网,重点用电脑端主流浏览器UA,这类平台的手机端访问量本就较低。
下面的代码片段展示了“场景化UA选择”的逻辑,可根据实际需求扩展:
# 场景化UA选择示例
def get_scene_ua(scene_type):
# 场景类型:ecommerce(电商)、short_video(短视频)、official(官网)
scene_ua_map = {
"ecommerce": [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36",
"Mozilla/5.0 (Linux; Android 14; MI 14) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Mobile Safari/537.36"
],
"short_video": [
"Mozilla/5.0 (Linux; Android 14; Pixel 8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Mobile Safari/537.36",
"Mozilla/5.0 (Linux; Android 14; MI 14) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Mobile Safari/537.36 MicroMessenger/8.0.45"
],
"official": [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Firefox/129.0"
]
}
return random.choice(scene_ua_map.get(scene_type, USER_AGENT_POOL))
# 爬短视频平台时调用
video_ua = get_scene_ua("short_video")
print(f"短视频场景UA:{video_ua}")避坑提醒:这3个错误别再犯
1. 别用“伪造UA”:有些人生成乱七八糟的UA字符串,比如把Chrome和Firefox的标识混在一起,这种“四不像”UA会被平台直接拦截,不如用真实浏览器的UA;
2. 别忽略UA更新:浏览器版本会迭代,比如Chrome每两个月就更新一次,半年前的UA可能被归为“老旧设备”,建议每月更新一次UA池;
3. 别和代理IP“脱节”:换代理IP时最好同步换UA,避免“一个IP配N个UA”或“N个IP配一个UA”,两者协同切换才能最大化降低风险。
最后总结一下:代理IP解决的是“从哪访问”的问题,而User-Agent解决的是“以什么身份访问”的问题——两者缺一不可。很多人花大价钱买优质代理IP,却在UA上敷衍了事,导致成功率上不去。按照文中的方法,建一个优质UA池,配合动态切换和场景匹配,再加上稳定的代理IP,爬虫的封禁风险会大幅降低,效率也能翻番。记住,爬虫的核心是“模拟真人”,UA管理就是离真人最近的那一步。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。