UA伪装:原理、实现与机票爬虫场景应用
一、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.36 | OTA 平台 H5 页面库存抓取 |
| 航司 APP | ChinaSouthern/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 伪装的关键注意事项(避免被识别)
-
不要过度单一:若长期用同一 UA 抓取同一航线(如每天用国航 APP UA 查北京 - 广州机票),即使是真实 UA,也会被判定为异常,需至少准备 10+ 不同 UA 轮换。
-
匹配请求场景:若用航司 APP 的 UA 发起请求,需确保请求参数、Cookie 也符合 APP 逻辑(如 APP 端请求通常带
device-id参数),避免 “UA 是 APP 但参数是 PC 端” 的矛盾。 -
结合其他反爬手段:UA 伪装需与 IP 代理、Cookie 池配合使用(如示例 1 中添加
Referer头),单一依赖 UA 伪装易被突破(机票平台会综合多维度判断爬虫)。 -
及时更新 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)模拟真实用户行为。
更多推荐
所有评论(0)