改user-agent仍被识别因仅替换ua字符串远远不够:网站会综合校验sec-ch-ua-mobile、sec-ch-ua-platform等新字段及accept等配套头,缺失或格式错误(如缺引号)即触发403;纯requests需完整复刻真实手机请求头,而selenium需正确配置mobileemulation并禁用自动化特征。

为什么改了User-Agent还是被识别为爬虫?
单纯替换User-Agent字符串远远不够。很多网站(比如微博、知乎移动端)会结合Accept、Accept-Language、Sec-Ch-Ua-Mobile等请求头做综合判断,甚至直接检测navigator.userAgent在JS中的运行结果。只改User-Agent时,服务器可能发现你的Sec-Ch-Ua-Mobile缺失或值为?,立刻返回403。
实操建议:
- 用真实手机访问目标站点,抓包(推荐 Chrome DevTools 的 Network → 过滤
doc或fetch/XHR),完整复制整套请求头,不只是User-Agent - 必须带上
Sec-Ch-Ua-Mobile: ?1(注意是字符串?1,不是布尔值)和Sec-Ch-Ua-Platform: "Android"(或"iOS") -
Accept建议设为text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,避免出现application/json这种非浏览器典型值
分辨率参数要不要传?传哪些才有效?
纯Python爬虫(如requests)本身不渲染页面,所以传screenWidth、devicePixelRatio这类参数对服务端无意义——它们只在浏览器环境被JS读取。但如果你用playwright或selenium启动真实浏览器实例,这些参数就关键了。
实操建议:
- 用
playwright时,直接指定设备类名最稳妥:browser.new_context(**playwright.devices['iPhone 13']),它自动注入全套UA、viewport、touch支持、userAgent等 - 手动配置viewport时,别只设
width/height:必须同时启用is_mobile=True和has_touch=True,否则网站JS里matchMedia('(pointer: coarse)')或'ontouchstart' in window会失败 - 分辨率数值不必追求精确:常见有效组合是
375×667(iPhone SE)、414×896(iPhone XR)、360×640(部分安卓),避开1920×1080这种明显PC尺寸
requests模拟手机请求的最小可行配置
如果只是发HTTP请求拿HTML(不执行JS),requests完全够用,但header必须“像手机”,不能只拼一个UA字符串。
示例代码片段(可直接复用):
headers = {
"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 16_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.6 Mobile/15E148 Safari/604.1",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7",
"Accept-Encoding": "gzip, deflate",
"Connection": "keep-alive",
"Upgrade-Insecure-Requests": "1",
"Sec-Fetch-Dest": "document",
"Sec-Fetch-Mode": "navigate",
"Sec-Fetch-Site": "none",
"Sec-Fetch-User": "?1",
"Sec-Ch-Ua-Mobile": "?1",
"Sec-Ch-Ua-Platform": '"iOS"',
}
response = requests.get(url, headers=headers, timeout=10)
注意点:
-
Sec-Ch-Ua-Mobile和Sec-Ch-Ua-Platform的值必须带英文双引号("?1"、"iOS"),这是Chrome规范,少引号会被忽略 - 不要加
Cookie字段除非你有合法会话;空Cookie:头反而暴露异常 - 首次请求务必去掉
Referer,某些站对空Referer或非法Referer直接拦截
用selenium启动手机模式却加载出PC版页面?
根本原因:默认selenium启动的是桌面Chrome,即使设置了mobileEmulation,若未禁用user-agent覆盖逻辑,或未正确设置deviceMetrics,JS仍能检测出矛盾。
实操建议:
- 必须用
mobileEmulation字典完整配置,不能只设deviceName:{"deviceName": "iPhone 12 Pro"}比{"deviceName": "iPhone"}更可靠 - 显式关闭
enable-automation和disable-blink-features,防止被navigator.webdriver检测到:options.add_experimental_option("excludeSwitches", ["enable-automation"]) - 启动后立即执行JS注入,覆盖关键属性(仅用于调试验证):
driver.execute_cdp_cmd('Emulation.setTouchEmulationEnabled', {'enabled': True})
真实场景中,playwright的设备上下文比selenium的mobileEmulation更稳定,尤其对Sec-CH-UA系列头的支持更原生。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











