一、UA 伪装的核心定义与作用

1. 什么是 UA?

UA 是 User-Agent 的简称,是 HTTP 请求头中的一个字段,用于向服务器标识 “发起请求的设备 / 浏览器信息”。

举个实际例子:

  • PC 端 Chrome 浏览器的 UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36

  • 移动端 iPhone Safari 的 UA:Mozilla/5.0 (iPhone; CPU iPhone OS 16_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.5 Mobile/15E148 Safari/604.1

  • 某航司 APP 的 UA:AirChinaApp/6.8.0 (Android; 13; Xiaomi M2102K1C)

2. 什么是 UA 伪装?

UA 伪装是爬虫技术中 “反反爬” 的基础手段,指 通过修改请求头中的 User-Agent 字段,将爬虫伪装成真实用户的设备 / 浏览器 / APP,避免服务器识别出爬虫身份后拒绝请求。

3. 为什么需要 UA 伪装?

机票平台(如航司官网、OTA 平台)的反爬机制会重点检查 UA:

  • 若 UA 为空或为明显爬虫标识(如 Scrapy/2.8.0),服务器会直接拦截请求;

  • 若长期使用同一 UA 高频请求(如持续用 PC 端 UA 查机票),会被判定为 “异常用户”,触发验证码或 IP 封锁;

  • 部分机票数据(如移动端专属优惠)仅对特定 UA(如航司 APP -UA)开放,需伪装对应 UA 才能抓取。

二、UA 伪装的具体实现(结合机票爬虫场景)

1. 核心步骤:构建 UA 库 + 随机切换
(1)第一步:收集多类型 UA

针对机票爬虫的多端抓取需求,需覆盖 3 类核心 UA:

类型示例(可直接用)适用场景
PC 浏览器Mozilla/5.0 (Windows NT 10.0; Win64; x64) Edge/117.0.2045.60航司官网 PC 端价格抓取
移动端浏览器Mozilla/5.0 (Linux; Android 12; SM-G998U) Chrome/116.0.0.0 Mobile Safari/537.36OTA 平台 H5 页面库存抓取
航司 APPChinaSouthern/7.2.1 (iOS; 15.5; iPhone13,2) (南航 APP 示例)航司 APP 接口数据抓取

收集渠道:通过 Chrome 开发者工具(F12 → Network → 任意请求 → Request Headers → User-Agent)复制真实 UA;或使用开源 UA 库(如 fake-useragent Python 库)。

(2)第二步:在爬虫中随机切换 UA

以机票爬虫常用的 Requests 和 Scrapy 为例,说明具体代码实现:

示例 1:Requests 库(单次请求伪装)
# settings.py​
# 1. 配置UA池​
    "Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) Mobile/15E148",  # 移动端Safari​
    "AirChina/6.8.0 (Android; 13; Xiaomi M2102K1C)"  # 国航APP UA​
]​
​
# 2. 启用自定义UA中间件​
DOWNLOADER_MIDDLEWARES = {​
    "my_spider.middlewares.RandomUAMiddleware": 543,  # 自定义中间件优先级​
    "scrapy.downloadermiddlewares.useragent.UserAgentMiddleware": None,  # 禁用默认UA中间件​
}​
​
# 3. 编写自定义中间件(middlewares.py)​
class RandomUAMiddleware:​
    def process_request(self, request, spider):​
        # 从UA池随机选一个,赋值给请求头​
        request.headers["User-Agent"] = random.choice(spider.settings.get("USER_AGENT_LIST"))

三、UA 伪装的关键注意事项(避免被识别)

  1. 不要过度单一:若长期用同一 UA 抓取同一航线(如每天用国航 APP UA 查北京 - 广州机票),即使是真实 UA,也会被判定为异常,需至少准备 10+ 不同 UA 轮换。

  2. 匹配请求场景:若用航司 APP 的 UA 发起请求,需确保请求参数、Cookie 也符合 APP 逻辑(如 APP 端请求通常带 device-id 参数),避免 “UA 是 APP 但参数是 PC 端” 的矛盾。

  3. 结合其他反爬手段:UA 伪装需与 IP 代理、Cookie 池配合使用(如示例 1 中添加 Referer 头),单一依赖 UA 伪装易被突破(机票平台会综合多维度判断爬虫)。

  4. 及时更新 UA:浏览器 / APP 版本更新会导致 UA 变化(如 Chrome 从 117 升级到 118),需定期更新 UA 库,避免使用过时 UA 被识别。

四、常见问题解答(QA)

Q1:用 fake-useragent 库自动生成 UA 可以吗?

A:可以,但需注意两点:

  • 该库生成的 UA 可能存在 “通用但不精准” 的问题(如生成的航司 APP UA 可能不存在),建议结合真实收集的 UA 一起使用;

  • 部分机票平台会识别 fake-useragent 库的特征(如特定 UA 格式),高并发抓取时建议优先用自定义 UA 池。

Q2:伪装成航司 APP 的 UA 后,为什么还是抓不到数据?

A:可能是因为 APP 端请求除了 UA,还需要其他加密参数(如 sign 签名、token),UA 仅能解决 “身份识别” 问题,需进一步通过 Android 逆向提取这些参数(参考前文模块 3 的逆向技术)。

Q3:UA 伪装能 100% 避免被拦截吗?

A:不能。UA 伪装是 “基础反反爬手段”,机票平台的高级反爬(如行为分析:鼠标移动轨迹、点击间隔)会绕过 UA 检查,需结合自动化工具(如 Selenium/AutoJS)模拟真实用户行为。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐