
1. 从一次“请求被拒”说起为什么我们需要关注User-Agent那天下午我正在调试一个自动化脚本它需要模拟手机浏览器去抓取某个资讯App的公开数据。代码逻辑清晰请求头也设置了Referer、Cookie一切看起来天衣无缝。然而服务器返回的始终是403 Forbidden。我检查了IP频率、Cookie有效性甚至怀疑对方启用了高级风控折腾了近两个小时。最后在一个技术论坛的角落看到一条评论“试试把User-Agent改成他们App内嵌WebView的标识。” 我照做了仅仅修改了请求头中那一行看似无关紧要的User-Agent字符串脚本立刻畅通无阻数据如预期般返回。这个经历让我深刻意识到User-Agent用户代理字符串这个存在于每一次HTTP请求中的“身份证”其重要性被绝大多数开发者甚至很多爬虫爱好者严重低估了。它远不止是浏览器或客户端的一个简单声明更是服务器进行流量识别、内容分发、兼容性调整乃至风险控制的第一道也是最重要的一道关卡。对于需要模拟真实客户端行为的场景——无论是数据采集、自动化测试、接口调试还是反爬策略研究——拥有一份准确、常用且持续更新的User-Agent大全就如同拥有了一把万能钥匙。很多人习惯性地使用浏览器默认的UA或者从网上随便复制一个。但在实际对抗与协作中一个“不合适”的UA可能导致请求被直接屏蔽比如桌面UA访问移动端专属接口、获取到错误的内容版本比如触屏版与PC版网页或者触发不必要的验证流程。因此系统地整理、理解并应用这些UA字符串是一项非常基础且实用的技能。本文将为你梳理市面上主流App及浏览器的典型User-Agent并深入探讨其结构、应用场景以及在实际操作中的核心技巧与避坑指南。2. User-Agent字符串的解构读懂每一段代码的含义在罗列清单之前我们必须先理解一个User-Agent字符串在“说”什么。它并非乱码而是一套遵循一定格式的、包含多层信息的标识符。一个典型的现代移动端User-Agent可能长这样Mozilla/5.0 (Linux; Android 10; SM-G973F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.120 Mobile Safari/537.36看起来复杂但我们可以将其拆解为几个关键部分产品标识与兼容性令牌Mozilla/5.0这是一个历史遗留的兼容性前缀。早期网景浏览器Netscape的UA以“Mozilla”开头后来许多浏览器为了兼容那些只识别“Mozilla”的网站都加上了这个前缀。现在它已成为一个事实标准不代表实际使用的浏览器。系统平台信息括号内第一部分这部分描述了操作系统和硬件信息。Linux; Android 10; SM-G973F表明这是一个运行在Linux内核上的Android 10系统设备型号是三星Galaxy S10SM-G973F。对于iOS设备这里则会显示iPhone; CPU iPhone OS 14_6 like Mac OS X。渲染引擎信息AppleWebKit/537.36这是核心的布局引擎标识。AppleWebKit是Safari使用的引擎但其开源版本WebKit被众多浏览器使用包括Chrome早期版本和几乎所有移动端浏览器。后面的537.36是版本号。(KHTML, like Gecko)同样是历史兼容性声明KHTML是WebKit的前身Gecko是Firefox的引擎。浏览器/客户端核心信息Chrome/91.0.4472.120这里指明了实际使用的浏览器品牌和版本号。在这个例子中是Chrome 91。对于iOS上的Safari这里会是Version/14.0。最终功能标识Mobile Safari/537.36这通常用于声明最终的客户端身份和兼容模式。Mobile表明是移动端。Safari/537.36再次声明了Safari兼容性。在桌面Chrome上最后一部分通常是Safari/537.36。App内嵌WebView的特殊性许多App如微信、抖音的内置浏览器并非完整Chrome或Safari而是系统提供的WebView组件。其UA会包含Mobile Safari渲染引擎标识但会在前面加上App特有的标记。例如旧版微信的UA中会包含MicroMessenger字样。这是服务器识别流量来自哪个App生态的关键。理解这个结构后你就能一眼看出一个UA是来自安卓Chrome、iOS Safari还是某个App的内置浏览器从而在模拟时做出精准选择。3. 主流平台与App的User-Agent实战清单下面我将分类列出当前请注意UA会随版本更新而变化以下为典型示例实际使用时建议从真实设备抓取最新版本常用的User-Agent字符串。重要提示直接使用这些字符串时最好能配合相应的IP地址行为特征例如移动数据IP、屏幕分辨率、触摸事件等模拟效果更佳。3.1 移动端浏览器标准Android Chrome (主流版本)Mozilla/5.0 (Linux; Android 10; SM-G975F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.120 Mobile Safari/537.36要点设备型号SM-G975F和Android版本10可以替换为其他常见型号如Pixel 5、MI 9等。Chrome版本号应保持相对较新。iOS Safari (主流版本)Mozilla/5.0 (iPhone; CPU iPhone OS 14_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Mobile/15E148 Safari/604.1要点注意CPU iPhone OS 14_6 like Mac OS X是iOS的经典标识格式。AppleWebKit/605.1.15是iOS Safari的WebKit版本。Mobile/15E148是移动设备标识。3.2 桌面端浏览器用于对比或特定场景Windows 10/11 上的 ChromeMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36要点Windows NT 10.0代表Windows 10。Win64; x64代表64位系统。没有Mobile标识。macOS 上的 SafariMozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.1 Safari/605.1.15要点Intel Mac OS X 10_15_7代表macOS Catalina 10.15.7。Apple Silicon芯片的Mac可能会有所不同。3.3 超级App的内置WebView核心场景这部分是模拟App内访问H5页面或小程序的关键。微信AndroidMozilla/5.0 (Linux; Android 10; SM-G973F Build/QP1A.190711.020; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/91.0.4472.120 Mobile Safari/537.36 MMWEBID/1234 MicroMessenger/8.0.40.2400(0x28002851) WeChat/arm64 NetType/WIFI Language/zh_CN ABI/arm64深度解析wv这是一个关键标记代表WebView。MMWEBID/1234微信WebView的标识。MicroMessenger/8.0.40.2400(0x28002851)明确指出了这是微信客户端并带有版本号和内部编译信息。WeChat/arm64客户端名称和架构。NetType/WIFI网络类型可能是WIFI或4G等。Language/zh_CN语言设置。ABI/arm64应用二进制接口指处理器架构。实操注意微信对UA检查非常严格缺少MicroMessenger或NetType等字段可能被识别为非法请求。模拟时尽量使用完整的、抓取到的UA。微信iOSMozilla/5.0 (iPhone; CPU iPhone OS 14_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.40(0x1800282f) NetType/WIFI Language/zh_CN要点iOS版本结构类似Safari但末尾附加了MicroMessenger等微信特有字段。注意没有Chrome字样因为iOS上所有浏览器包括WebView都必须使用Safari的WebKit引擎。抖音/头条系Android WebViewMozilla/5.0 (Linux; Android 10; SM-G973F Build/QP1A.190711.020; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/91.0.4472.120 Mobile Safari/537.36 JsKit/1.0 (com.ss.android.article;app;1.0) okhttp/3.10.0要点JsKit/1.0 (com.ss.android.article;app;1.0)是字节跳动系App如今日头条、抖音WebView的常见标识其中包含包名信息。okhttp表明网络库。支付宝AndroidMozilla/5.0 (Linux; Android 10; SM-G973F Build/QP1A.190711.020; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/91.0.4472.120 Mobile Safari/537.36 AliApp(AP/10.3.70.8000) AlipayClient/10.3.70.8000 Language/zh-Hans要点AliApp和AlipayClient是支付宝的明确标识。3.4 其他常见客户端移动端QQ浏览器Mozilla/5.0 (Linux; Android 10; SM-G973F) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/91.0.4472.120 MQQBrowser/11.0 Mobile Safari/537.36要点MQQBrowser是QQ浏览器的标识。PC端Edge浏览器Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 Edg/91.0.864.64要点末尾的Edg/91.0.864.64指明了是Edge浏览器。4. 获取、验证与管理User-Agent的最佳实践拥有清单只是第一步如何有效地获取、验证和使用它们才是保证项目稳定运行的关键。4.1 如何获取最新的、真实的User-Agent从真实设备抓取最可靠移动端在手机浏览器中打开一个类似http://httpbin.org/user-agent的网站页面上显示的就是当前浏览器的完整UA。对于App内的WebView可以让App打开一个你控制的、能记录HTTP请求头的页面。桌面端在浏览器开发者工具F12中切换到Network网络标签刷新页面点击任意一个请求在Headers标头选项卡中找到User-Agent请求头。这是最准确的方法。使用专业的UA数据库或生成库在编程中可以使用像fake-useragentPython这样的库来随机生成主流浏览器的UA。但请注意对于模拟特定App如微信这类库可能无法提供足够精确的、带有App特有字段的UA。一些开源项目维护了UA列表但时效性需要验证。4.2 验证User-Agent的有效性与一致性直接使用网上抄来的UA字符串风险很高因为版本过时Chrome、微信等更新频繁旧版本UA可能已被服务器策略标记。字段残缺可能缺失关键字段如微信的NetType。信息矛盾例如UA声称是iPhone但其他请求头或JavaScript环境变量却暴露了桌面浏览器的特征这很容易被反爬系统侦测。验证步骤基础格式检查确保UA字符串包含关键组件如Mozilla前缀、系统信息、引擎、浏览器标识。上下文模拟除了UA还应该设置与之匹配的其他请求头如Accept-Language、Accept-Encoding、Sec-CH-UA客户端提示等。环境检测绕过许多网站会通过JavaScript检测navigator.userAgent、navigator.platform、屏幕分辨率等。如果你的爬虫或脚本运行在Node.js或无头浏览器中需要确保这些JavaScript属性值与你的UA字符串描述一致。这就是为什么有时在无头浏览器如Puppeteer中直接设置UA更有效因为它同步修改了JavaScript环境。4.3 管理与轮换策略对于大规模采集任务固定使用一个UA是不明智的。建立UA池根据目标网站准备一组几十到上百个不同的、真实的UA涵盖不同的设备类型iOS/Android、浏览器版本和App类型。合理轮换在发送请求时从UA池中随机选取一个使用。轮换逻辑可以简单随机也可以根据请求频率、目标域名等更复杂的规则进行。会话保持对于一个需要登录或保持状态的会话在整个会话生命周期内应使用同一个UA避免因UA突变引发安全警报。5. 高阶应用与常见陷阱剖析掌握了基础清单和实践方法后我们来看看更深层次的应用和那些容易踩进去的坑。5.1 场景化选择不是越新越好而是越“像”越好场景一采集大众点评/美团等生活服务类App的公开数据。分析这类App对H5页面和App内流量的区分可能不那么极端但使用一个移动端Chrome UA可能不如使用一个WebViewUA如带有okhttp或JsKit标识的来得安全。因为大量正常用户流量来自App内部分享或打开链接。选择优先使用从对应App内抓取到的或已知的该App WebView的UA。场景二访问银行或支付相关的H5页面。分析这类页面安全风控等级极高。它们不仅检查UA还会深度检测运行环境是否在真正的浏览器中、是否有调试工具、是否在模拟器。单纯修改UA字符串几乎必然失败。策略对于此类高安全场景通常需要更复杂的技术如使用改机工具、真机群控或者直接寻求合法的API合作。不建议强行突破。场景三需要兼容旧版网站的测试。分析一些老网站可能只识别特定的旧版浏览器UA如IE。选择此时就需要准备一些“古董级”UA例如IE 11的UA。5.2 那些让你前功尽弃的陷阱“指纹”冲突这是最大的陷阱。你只改了UA字符串但浏览器或脚本环境留下的其他“指纹”与UA不符。例如你的UA是iPhone但navigator.platform返回Linux x86_64或者屏幕分辨率是1920x1080。现代浏览器指纹检测技术非常全面包括Canvas、WebGL、字体列表、音频上下文等。使用无头浏览器时需要通过额外参数来模拟完整的设备指纹。避坑使用Puppeteer或Playwright等现代无头浏览器工具它们提供setUserAgent的同时也允许通过--window-size设置分辨率通过--disable-features关闭一些开发者特征更逼真地模拟设备。TLS指纹与HTTP/2指纹高级反爬系统会分析TCP/IP栈和TLS握手阶段的特征。不同浏览器/客户端使用的TLS库、支持的加密套件顺序、TLS扩展等都有细微差别。使用Python的requests库发送的请求其TLS指纹可能与真正的Chrome浏览器不同。避坑对于普通网站此问题不常见。但对顶级风控可能需要使用curl命令其指纹更接近浏览器或专门的指纹浏览器工具。忽略“Sec-”系列请求头现代浏览器Chrome 90会自动发送Sec-CH-UA用户代理客户端提示等头部提供更结构化的浏览器品牌、版本信息。服务器可能同时检查传统的User-Agent和新的Sec-CH-UA头。如果你的请求缺少这些新头部或者其内容与UA矛盾也会暴露。避坑从真实浏览器中捕获请求时注意复制所有头部特别是Sec-CH-UA、Sec-CH-UA-Mobile、Sec-CH-UA-Platform等。UA字符串格式错误多一个空格、少一个分号、括号不匹配都可能导致UA解析失败被服务器视为无效或恶意请求。避坑直接从真实请求中复制粘贴避免手动输入。在代码中将UA字符串定义为常量或从配置文件中读取确保一致性。6. 自动化工具中的User-Agent集成实战理论最终要落地到代码。这里以Python的requests库和PuppeteerNode.js为例展示如何集成UA管理。6.1 在Python requests中动态设置UAimport requests import random # 定义一个UA池 USER_AGENTS [ Mozilla/5.0 (Linux; Android 10; SM-G973F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.120 Mobile Safari/537.36, Mozilla/5.0 (iPhone; CPU iPhone OS 14_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Mobile/15E148 Safari/604.1, # ... 添加更多UA ] def make_request(url): headers { User-Agent: random.choice(USER_AGENTS), # 务必设置其他常用头部使其更像浏览器 Accept: text/html,application/xhtmlxml,application/xml;q0.9,image/webp,*/*;q0.8, Accept-Language: zh-CN,zh;q0.9,en;q0.8, Accept-Encoding: gzip, deflate, br, Connection: keep-alive, Upgrade-Insecure-Requests: 1, } try: response requests.get(url, headersheaders, timeout10) # 处理响应... return response except requests.exceptions.RequestException as e: print(f请求失败: {e}) return None # 使用示例 response make_request(https://example.com)6.2 在PuppeteerNode.js中模拟完整设备Puppeteer的优势在于可以模拟整个浏览器环境包括UA、视口、地理位置等。const puppeteer require(puppeteer); (async () { const browser await puppeteer.launch({ headless: new, // 使用新的无头模式 args: [ --window-size375,812, // 设置为iPhone X的屏幕尺寸 --disable-blink-featuresAutomationControlled, // 隐藏自动化控制特征 ] }); const page await browser.newPage(); // 设置一个完整的移动端UA例如iPhone Safari await page.setUserAgent(Mozilla/5.0 (iPhone; CPU iPhone OS 14_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Mobile/15E148 Safari/604.1); // 设置视口以匹配UA await page.setViewport({ width: 375, height: 812, isMobile: true, hasTouch: true }); // 覆盖navigator.webdriver属性防止被检测为自动化脚本 await page.evaluateOnNewDocument(() { Object.defineProperty(navigator, webdriver, { get: () undefined }); }); await page.goto(https://example.com, { waitUntil: networkidle2 }); // ... 后续操作 await browser.close(); })();6.3 使用第三方库管理UAPython示例fake-useragent库可以方便地生成随机UA但需注意其维护情况和是否包含App UA。from fake_useragent import UserAgent import requests # 创建一个UserAgent对象禁用缓存并设置回退 ua UserAgent(cacheFalse, verify_sslFalse, fallbackMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36) headers { User-Agent: ua.random, # 随机生成一个主流浏览器UA # ... 其他头部 } response requests.get(https://httpbin.org/user-agent, headersheaders) print(response.json()) # 查看服务器收到的UA注意fake-useragent库需要在线获取数据且生成的UA不一定包含特定App的WebView标识。对于高精度模拟建议还是自建UA池。7. 法律、道德与可持续性思考最后也是最重要的一部分是关于使用这些技术时的边界。User-Agent本身是中性的但如何使用它决定了行为的性质。遵守Robots协议在开始任何自动化访问前务必检查目标网站的robots.txt文件。其中User-agent: *和Disallow:指令明确了哪些路径不允许爬虫访问。尊重这些规则是基本的网络礼仪和合法性的基础。识别公开数据与私有接口通过模拟App UA访问其公开的、未加密的H5页面或API与破解其私有、加密的通信协议是两回事。前者通常处于法律和道德的灰色地带而后者很可能涉及违法行为。务必区分你访问的数据是否是网站/App意图向公众开放的。控制访问频率无论使用什么UA过高的请求频率都会对目标服务器造成压力构成拒绝服务攻击DoS的雏形也极易触发封禁。务必在代码中增加随机延迟如time.sleep(random.uniform(1, 3))模拟人类操作间隔。明确数据用途采集到的数据应用于个人学习、研究或法律允许的公开分析。未经授权不得用于商业用途、侵犯个人隐私或进行不正当竞争。关注服务条款许多网站和App的用户协议中明确禁止任何形式的自动化数据抓取。违反这些条款可能导致法律纠纷。说到底技术是工具User-Agent大全是我们工具箱里的一把精密螺丝刀。用它来修复问题、学习原理、进行合规的测试与研究它能创造巨大价值。但若用于破坏规则、侵犯权益它也会带来相应的风险。在实际操作中我始终坚持“最小必要”和“尊重目标”原则在满足需求的前提下将对目标系统的影响降到最低这是作为一名技术从业者应有的素养。