别再被反爬了!手把手教你用Python requests库伪装浏览器请求头(附User-Agent大全)
突破反爬封锁Python requests高级请求头伪装实战指南当你兴致勃勃地写好了爬虫脚本却突然收到403 Forbidden的冰冷回应时那种挫败感每个爬虫开发者都深有体会。网站防护机制正在变得越来越智能但别担心——通过精心设计的请求头伪装你的爬虫完全可以隐身在正常用户流量中。本文将带你深入理解现代反爬机制的工作原理并掌握一套完整的请求头伪装实战方案。1. 为什么你的爬虫会被识别现代网站使用复杂的算法来区分人类用户和自动化脚本。服务器会分析每个请求的数十个特征其中请求头(Headers)是最关键的检测点之一。以下是爬虫最常暴露的几个典型特征默认User-AgentPython requests库的默认UA会直接暴露你的爬虫身份缺失关键头字段如Accept-Language、Referer等人类浏览器必带的头信息非常规访问模式固定时间间隔请求、从不触发JavaScript事件等异常行为无Cookies会话新会话没有携带任何Cookies会被视为可疑流量# 典型的裸奔爬虫请求 - 极易被识别 import requests response requests.get(https://example.com) print(response.status_code) # 很可能返回4032. 构建完美伪装请求头全要素解析2.1 核心头字段详解一个完整的浏览器级请求头通常包含以下关键字段头字段作用示例值User-Agent标识客户端类型和版本Mozilla/5.0 (Windows NT 10.0...)Accept声明可接受的响应类型text/html,application/xhtmlxmlAccept-Language声明首选语言zh-CN,zh;q0.9,en;q0.8Referer表明请求来源页面https://www.google.com/Connection控制网络连接行为keep-aliveUpgrade-Insecure-RequestsHTTPS升级请求12.2 动态User-Agent策略使用单一User-Agent仍然可能被识别。更高级的做法是构建一个UA池并随机轮换import random user_agents [ Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36, Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.3 Safari/605.1.15, Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1 ] headers { User-Agent: random.choice(user_agents), # 其他必要头字段... }3. 实战完整请求头伪装流程3.1 捕获真实浏览器请求打开Chrome开发者工具(F12)访问目标网站在Network标签中找到任意文档请求右键复制为cURL命令使用在线工具转换为Python代码提示注意移除可能包含个人信息的头字段如Cookie和Authorization3.2 请求头动态生成模板def generate_headers(refererNone): base_headers { Accept: text/html,application/xhtmlxml,application/xml;q0.9,image/webp,*/*;q0.8, Accept-Encoding: gzip, deflate, br, Accept-Language: zh-CN,zh;q0.9,en;q0.8, Cache-Control: max-age0, Connection: keep-alive, Upgrade-Insecure-Requests: 1, User-Agent: random.choice(user_agents) } if referer: base_headers[Referer] referer return base_headers4. 进阶反反爬技巧4.1 请求头时序模拟人类操作会有自然的随机延迟和操作间隔import time from random import uniform def human_like_delay(): time.sleep(uniform(0.5, 2.5)) # 随机等待0.5-2.5秒 # 在关键请求之间插入延迟 human_like_delay() response requests.get(url, headersheaders)4.2 分布式IP与头信息组合结合代理IP池和头信息轮换实现全方位伪装proxies { http: http://user:passproxy_ip:port, https: http://user:passproxy_ip:port } response requests.get( url, headersgenerate_headers(), proxiesproxies, timeout10 )5. 最新浏览器User-Agent大全以下是2023年主流浏览器的最新User-Agent示例桌面浏览器Chrome: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36Firefox: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/113.0Edge: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36 Edg/113.0.1774.35移动设备iOS Safari: Mozilla/5.0 (iPhone; CPU iPhone OS 16_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.5 Mobile/15E148 Safari/604.1Android Chrome: Mozilla/5.0 (Linux; Android 13) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.5672.131 Mobile Safari/537.36在实际项目中我发现最难反爬的网站往往不是检测单个头字段而是分析头信息之间的逻辑关系。比如某些电商网站会检查Accept-Language与User-Agent中地域信息是否一致。解决这类问题需要建立完整的设备指纹库确保所有头字段保持逻辑一致。