前言目标站点的反爬体系中请求头校验、客户端指纹识别是最基础、应用最广泛的防护手段。常规 Python 爬虫直接使用requests发起请求时默认请求头、网络指纹、客户端特征与真实浏览器差异极大极易被站点识别为爬虫并拦截、封禁 IP、返回错误数据。请求头伪造、浏览器指纹模拟、环境特征伪装是爬虫突破基础反爬的第一道关卡。本文从 HTTP 请求头原理、主流反爬校验规则出发结合requests、fake-useragent、httpx等工具完整讲解通用请求头构造、动态 UA 轮换、Cookie 模拟、Referer/Origin 伪装、浏览器特征指纹模拟、SSL 指纹绕过等实战方案区分静态伪装、动态随机伪装、浏览器内核模拟三大场景配套可直接运行的代码、参数解析、踩坑总结覆盖 90% 以上基础请求类反爬场景。本文依赖库官方参考链接requests 官方文档主流 HTTP 请求库fake-useragent 文档动态生成随机浏览器 UAhttpx 官方文档支持 HTTP/2、模拟浏览器特征curlconverter浏览器请求一键转 Python 代码工具Python 官方文档基础运行环境整套方案适用于资讯、商品、图片、接口类爬虫可直接对接前文 IP 代理池、分布式爬虫架构构建多层反爬防护体系。一、基础原理站点如何识别爬虫1.1 HTTP 请求头核心字段作用浏览器访问网页时会携带一系列Request Headers向服务端声明客户端信息服务端通过校验字段合法性、完整性、一致性判断访问来源。高频校验字段如下表表格字段名作用反爬校验逻辑User-Agent客户端标识包含浏览器、系统、版本信息无 UA、UA 为 Python/requests 直接判定为爬虫Referer跳转来源页面地址防盗链校验空 Referer 或非法来源拒绝访问资源Origin请求源站点多用于跨域请求接口类站点校验跨域合法性防止非法调用接口Cookie身份标识、会话凭证无 Cookie 无法登录、无法访问需会话的页面Accept客户端可接收的数据类型模拟浏览器正常内容接收规则Accept-Language客户端语言匹配地区与语言特征异常则拦截Accept-Encoding支持的压缩格式浏览器默认携带缺失易被识别Cache-Control缓存策略区分浏览器正常浏览与高频爬虫请求1.2 爬虫被识别的核心原因默认 UA 特征明显requests默认 UA 为python-requests/xxx服务端一眼识别请求头残缺仅传 UA缺失 Accept、Referer 等配套字段特征突兀UA 固定不变长期使用同一个 UA高频请求下被标记异常指纹不匹配SSL/TLS 指纹、HTTP/1.1/HTTP/2 协议特征、请求时序与浏览器不一致Cookie 缺失 / 无效未维持会话无法通过登录态、会话校验。1.3 项目核心目标掌握标准浏览器请求头完整构造实现静态伪装绕过基础反爬实现动态随机 UA、请求头轮换模拟多客户端访问行为完成 Cookie 会话维持、Referer/Origin 防盗链绕过实战使用httpx模拟浏览器协议与 SSL 指纹解决高阶请求指纹反爬结合代理池、请求头伪装形成组合式反爬方案总结抓包分析、请求头还原、问题排查的实战技巧。二、环境搭建与依赖安装执行 pip 命令安装所需第三方库国内镜像加速bash运行pip install -i https://pypi.tuna.tsinghua.edu.cn/simple requests fake-useragent httpx导入校验python运行import requests from fake_useragent import UserAgent import httpx三、实战一静态请求头伪装基础绕过静态伪装即手动复制浏览器真实请求头完整复刻浏览器请求参数适合请求头固定、反爬较弱的站点上手简单、稳定性高。3.1 抓包获取真实请求头打开 Chrome/Firefox 浏览器F12 打开开发者工具切换至「Network」刷新目标页面选中第一条主请求复制右侧Request Headers全部字段剔除Cookie、Sec-*等动态变化字段按需保留。3.2 完整静态请求头爬虫代码python运行import requests # 手动构造完整浏览器请求头模拟Chrome浏览器 HEADERS { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36, Accept: text/html,application/xhtmlxml,application/xml;q0.9,image/avif,image/webp,*/*;q0.8, Accept-Language: zh-CN,zh;q0.9, Accept-Encoding: gzip, deflate, br, Connection: keep-alive, Upgrade-Insecure-Requests: 1, Sec-Fetch-Dest: document, Sec-Fetch-Mode: navigate, Sec-Fetch-Site: none, Sec-Fetch-User: ?1 } def static_headers_crawl(url: str): try: resp requests.get(url, headersHEADERS, timeout10) resp.raise_for_status() # 捕获4xx/5xx错误 print(f请求成功状态码{resp.status_code}) return resp.text except Exception as e: print(f请求失败{str(e)}) return None # 调用测试 if __name__ __main__: target_url https://www.baidu.com static_headers_crawl(target_url)3.3 代码解析与使用要点完整复刻浏览器请求头补齐所有常规字段避免字段缺失被识别Sec-*系列为现代浏览器安全标识高防护站点建议全部保留优点稳定性强、无额外依赖缺点UA 固定高频请求易被风控。四、实战二动态 UA 随机轮换进阶伪装单一 UA 长时间高频请求仍会被封禁使用fake-useragent动态生成海量随机浏览器 UA每次请求切换不同客户端标识模拟多设备、多用户访问。4.1 基础动态 UA 实现python运行import requests from fake_useragent import UserAgent # 初始化UA生成器 ua UserAgent() def random_ua_crawl(url: str): # 每次请求生成全新随机UA headers { User-Agent: ua.random, Accept: text/html,application/xhtmlxml,application/xml;q0.9,*/*;q0.8, Accept-Language: zh-CN,zh;q0.9 } try: resp requests.get(url, headersheaders, timeout10) print(f当前UA{headers[User-Agent]}) print(f状态码{resp.status_code}) return resp.text except Exception as e: print(f请求异常{e}) return None if __name__ __main__: url https://www.baidu.com # 循环请求观察UA自动切换 for i in range(5): random_ua_crawl(url)4.2 分类指定浏览器 UA可按需指定 Chrome、Firefox、Edge、移动端等专属 UA适配不同场景python运行# 指定Chrome浏览器UA print(ua.chrome) # 指定Firefox浏览器UA print(ua.firefox) # 指定移动端UA print(ua.mobile)4.3 异常处理UA 库加载失败部分环境首次运行会出现 UA 文件加载异常添加容错逻辑python运行from fake_useragent import UserAgent try: ua UserAgent() except: # 加载失败使用备用静态UA ua UserAgent(use_cache_serverFalse) ua.random Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/124.0.0.0 Safari/537.36五、实战三Referer/Origin 防盗链绕过图片、静态资源、接口类站点普遍开启防盗链校验通过Referer/Origin判断请求来源空来源或非法来源直接拦截。5.1 Referer 防盗链绕过python运行import requests from fake_useragent import UserAgent ua UserAgent() def bypass_referer_crawl(target_url: str, referer_url: str): headers { User-Agent: ua.random, Referer: referer_url, # 填写合法来源地址 Accept: */* } resp requests.get(target_url, headersheaders, timeout10) print(f状态码{resp.status_code}) return resp.content # 示例访问图片资源来源设置为站点首页 if __name__ __main__: img_url https://xxx.com/test.jpg home_url https://xxx.com bypass_referer_crawl(img_url, home_url)5.2 Origin 跨域接口绕过前后端分离接口优先校验Origin多用于 POST、AJAX 请求python运行import requests from fake_useragent import UserAgent ua UserAgent() def bypass_origin_api(api_url: str, origin: str): headers { User-Agent: ua.random, Origin: origin, Referer: origin, Content-Type: application/json } data {key: value} resp requests.post(api_url, jsondata, headersheaders) print(resp.json()) # 调用Origin设置为站点域名 bypass_origin_api(https://xxx.com/api/data, https://xxx.com)六、实战四Cookie 会话维持登录态 / 会话校验多数站点需要登录、会话跟踪才能访问数据requests.Session()可自动维持 Cookie、会话信息模拟浏览器连贯访问行为。6.1 基础会话维持python运行import requests from fake_useragent import UserAgent ua UserAgent() headers {User-Agent: ua.random} # 创建会话对象自动保存、携带Cookie session requests.Session() # 第一步访问首页获取初始Cookie session.get(https://xxx.com, headersheaders) # 第二步登录接口携带账号密码会话自动保存登录Cookie login_data {username: xxx, password: xxx} session.post(https://xxx.com/login, datalogin_data, headersheaders) # 第三步访问需要登录的页面自动携带登录态Cookie resp session.get(https://xxx.com/user, headersheaders) print(resp.text)6.2 手动设置固定 Cookie已知有效 Cookie 时可直接写入请求头跳过登录步骤python运行import requests headers { User-Agent: Mozilla/5.0 Chrome/124.0.0.0, Cookie: sessionidxxxx; tokenxxxx } resp requests.get(https://xxx.com/user, headersheaders)七、实战五SSL/HTTP 指纹伪装高阶绕过部分高阶反爬通过SSL 指纹、TLS 版本、HTTP 协议特征识别requests此时使用httpx模拟真实浏览器协议特征完美绕过指纹校验。7.1 httpx 模拟浏览器指纹python运行import httpx from fake_useragent import UserAgent ua UserAgent() def fingerprint_crawl(url: str): # 模拟Chrome浏览器开启HTTP/2伪装TLS指纹 client httpx.Client( headers{User-Agent: ua.random}, http2True, # 启用HTTP/2协议现代浏览器默认 timeout10 ) resp client.get(url) print(f状态码{resp.status_code}) client.close() return resp.text if __name__ __main__: fingerprint_crawl(https://www.xxx.com)7.2 持久会话等同于 requests.Sessionpython运行import httpx from fake_useragent import UserAgent ua UserAgent() headers {User-Agent: ua.random} # 持久会话维持Cookie与指纹特征 client httpx.Client(headersheaders, http2True) client.get(https://xxx.com) resp client.get(https://xxx.com/data) print(resp.text) client.close()八、组合方案请求头 代理池 综合反爬结合前文 Redis IP 代理池 动态请求头构建多层防护大幅降低封禁概率python运行import requests from fake_useragent import UserAgent ua UserAgent() # 代理池接口地址 PROXY_API http://127.0.0.1:5000/get_proxy def get_proxy(): 从代理池获取代理 resp requests.get(PROXY_API) data resp.json() return data.get(proxy) if data[code] 200 else None def crawl_with_proxy_and_headers(url: str): proxy get_proxy() if not proxy: print(无可用代理) return proxies { http: fhttp://{proxy}, https: fhttps://{proxy} } headers { User-Agent: ua.random, Referer: url, Accept: text/html,*/* } try: resp requests.get(url, headersheaders, proxiesproxies, timeout10) print(请求成功) return resp.text except: # 上报失效代理 requests.post(http://127.0.0.1:5000/report_fail, data{proxy: proxy}) return None九、常见问题排查与优化技巧9.1 高频问题UA 正常但依旧拦截缺失Referer/Cookie/Sec-*字段补全完整请求头静态 UA 短期可用长期被封切换动态随机 UA降低请求频率状态码 200 但返回空内容防盗链校验失败补充Refererrequests 被指纹拦截替换为httpx模拟浏览器 SSL/HTTP 指纹。9.2 实战优化技巧请求头宁缺毋滥以浏览器抓包结果为标准不随意删减字段控制请求间隔搭配time.sleep()模拟人工浏览节奏动态 Cookie优先使用Session自动维持会话少用固定 Cookie字段一致性移动端 UA 搭配移动端请求特征PC 端 UA 搭配 PC 特征不混搭。9.3 工具推荐curlconverter浏览器抓包请求一键转为 Python requests/httpx 代码提升开发效率浏览器插件Modify Headers本地测试请求头效果。
Python 爬虫项目 爬虫请求头与指纹伪装深度实战(反爬基础绕过)
前言目标站点的反爬体系中请求头校验、客户端指纹识别是最基础、应用最广泛的防护手段。常规 Python 爬虫直接使用requests发起请求时默认请求头、网络指纹、客户端特征与真实浏览器差异极大极易被站点识别为爬虫并拦截、封禁 IP、返回错误数据。请求头伪造、浏览器指纹模拟、环境特征伪装是爬虫突破基础反爬的第一道关卡。本文从 HTTP 请求头原理、主流反爬校验规则出发结合requests、fake-useragent、httpx等工具完整讲解通用请求头构造、动态 UA 轮换、Cookie 模拟、Referer/Origin 伪装、浏览器特征指纹模拟、SSL 指纹绕过等实战方案区分静态伪装、动态随机伪装、浏览器内核模拟三大场景配套可直接运行的代码、参数解析、踩坑总结覆盖 90% 以上基础请求类反爬场景。本文依赖库官方参考链接requests 官方文档主流 HTTP 请求库fake-useragent 文档动态生成随机浏览器 UAhttpx 官方文档支持 HTTP/2、模拟浏览器特征curlconverter浏览器请求一键转 Python 代码工具Python 官方文档基础运行环境整套方案适用于资讯、商品、图片、接口类爬虫可直接对接前文 IP 代理池、分布式爬虫架构构建多层反爬防护体系。一、基础原理站点如何识别爬虫1.1 HTTP 请求头核心字段作用浏览器访问网页时会携带一系列Request Headers向服务端声明客户端信息服务端通过校验字段合法性、完整性、一致性判断访问来源。高频校验字段如下表表格字段名作用反爬校验逻辑User-Agent客户端标识包含浏览器、系统、版本信息无 UA、UA 为 Python/requests 直接判定为爬虫Referer跳转来源页面地址防盗链校验空 Referer 或非法来源拒绝访问资源Origin请求源站点多用于跨域请求接口类站点校验跨域合法性防止非法调用接口Cookie身份标识、会话凭证无 Cookie 无法登录、无法访问需会话的页面Accept客户端可接收的数据类型模拟浏览器正常内容接收规则Accept-Language客户端语言匹配地区与语言特征异常则拦截Accept-Encoding支持的压缩格式浏览器默认携带缺失易被识别Cache-Control缓存策略区分浏览器正常浏览与高频爬虫请求1.2 爬虫被识别的核心原因默认 UA 特征明显requests默认 UA 为python-requests/xxx服务端一眼识别请求头残缺仅传 UA缺失 Accept、Referer 等配套字段特征突兀UA 固定不变长期使用同一个 UA高频请求下被标记异常指纹不匹配SSL/TLS 指纹、HTTP/1.1/HTTP/2 协议特征、请求时序与浏览器不一致Cookie 缺失 / 无效未维持会话无法通过登录态、会话校验。1.3 项目核心目标掌握标准浏览器请求头完整构造实现静态伪装绕过基础反爬实现动态随机 UA、请求头轮换模拟多客户端访问行为完成 Cookie 会话维持、Referer/Origin 防盗链绕过实战使用httpx模拟浏览器协议与 SSL 指纹解决高阶请求指纹反爬结合代理池、请求头伪装形成组合式反爬方案总结抓包分析、请求头还原、问题排查的实战技巧。二、环境搭建与依赖安装执行 pip 命令安装所需第三方库国内镜像加速bash运行pip install -i https://pypi.tuna.tsinghua.edu.cn/simple requests fake-useragent httpx导入校验python运行import requests from fake_useragent import UserAgent import httpx三、实战一静态请求头伪装基础绕过静态伪装即手动复制浏览器真实请求头完整复刻浏览器请求参数适合请求头固定、反爬较弱的站点上手简单、稳定性高。3.1 抓包获取真实请求头打开 Chrome/Firefox 浏览器F12 打开开发者工具切换至「Network」刷新目标页面选中第一条主请求复制右侧Request Headers全部字段剔除Cookie、Sec-*等动态变化字段按需保留。3.2 完整静态请求头爬虫代码python运行import requests # 手动构造完整浏览器请求头模拟Chrome浏览器 HEADERS { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36, Accept: text/html,application/xhtmlxml,application/xml;q0.9,image/avif,image/webp,*/*;q0.8, Accept-Language: zh-CN,zh;q0.9, Accept-Encoding: gzip, deflate, br, Connection: keep-alive, Upgrade-Insecure-Requests: 1, Sec-Fetch-Dest: document, Sec-Fetch-Mode: navigate, Sec-Fetch-Site: none, Sec-Fetch-User: ?1 } def static_headers_crawl(url: str): try: resp requests.get(url, headersHEADERS, timeout10) resp.raise_for_status() # 捕获4xx/5xx错误 print(f请求成功状态码{resp.status_code}) return resp.text except Exception as e: print(f请求失败{str(e)}) return None # 调用测试 if __name__ __main__: target_url https://www.baidu.com static_headers_crawl(target_url)3.3 代码解析与使用要点完整复刻浏览器请求头补齐所有常规字段避免字段缺失被识别Sec-*系列为现代浏览器安全标识高防护站点建议全部保留优点稳定性强、无额外依赖缺点UA 固定高频请求易被风控。四、实战二动态 UA 随机轮换进阶伪装单一 UA 长时间高频请求仍会被封禁使用fake-useragent动态生成海量随机浏览器 UA每次请求切换不同客户端标识模拟多设备、多用户访问。4.1 基础动态 UA 实现python运行import requests from fake_useragent import UserAgent # 初始化UA生成器 ua UserAgent() def random_ua_crawl(url: str): # 每次请求生成全新随机UA headers { User-Agent: ua.random, Accept: text/html,application/xhtmlxml,application/xml;q0.9,*/*;q0.8, Accept-Language: zh-CN,zh;q0.9 } try: resp requests.get(url, headersheaders, timeout10) print(f当前UA{headers[User-Agent]}) print(f状态码{resp.status_code}) return resp.text except Exception as e: print(f请求异常{e}) return None if __name__ __main__: url https://www.baidu.com # 循环请求观察UA自动切换 for i in range(5): random_ua_crawl(url)4.2 分类指定浏览器 UA可按需指定 Chrome、Firefox、Edge、移动端等专属 UA适配不同场景python运行# 指定Chrome浏览器UA print(ua.chrome) # 指定Firefox浏览器UA print(ua.firefox) # 指定移动端UA print(ua.mobile)4.3 异常处理UA 库加载失败部分环境首次运行会出现 UA 文件加载异常添加容错逻辑python运行from fake_useragent import UserAgent try: ua UserAgent() except: # 加载失败使用备用静态UA ua UserAgent(use_cache_serverFalse) ua.random Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/124.0.0.0 Safari/537.36五、实战三Referer/Origin 防盗链绕过图片、静态资源、接口类站点普遍开启防盗链校验通过Referer/Origin判断请求来源空来源或非法来源直接拦截。5.1 Referer 防盗链绕过python运行import requests from fake_useragent import UserAgent ua UserAgent() def bypass_referer_crawl(target_url: str, referer_url: str): headers { User-Agent: ua.random, Referer: referer_url, # 填写合法来源地址 Accept: */* } resp requests.get(target_url, headersheaders, timeout10) print(f状态码{resp.status_code}) return resp.content # 示例访问图片资源来源设置为站点首页 if __name__ __main__: img_url https://xxx.com/test.jpg home_url https://xxx.com bypass_referer_crawl(img_url, home_url)5.2 Origin 跨域接口绕过前后端分离接口优先校验Origin多用于 POST、AJAX 请求python运行import requests from fake_useragent import UserAgent ua UserAgent() def bypass_origin_api(api_url: str, origin: str): headers { User-Agent: ua.random, Origin: origin, Referer: origin, Content-Type: application/json } data {key: value} resp requests.post(api_url, jsondata, headersheaders) print(resp.json()) # 调用Origin设置为站点域名 bypass_origin_api(https://xxx.com/api/data, https://xxx.com)六、实战四Cookie 会话维持登录态 / 会话校验多数站点需要登录、会话跟踪才能访问数据requests.Session()可自动维持 Cookie、会话信息模拟浏览器连贯访问行为。6.1 基础会话维持python运行import requests from fake_useragent import UserAgent ua UserAgent() headers {User-Agent: ua.random} # 创建会话对象自动保存、携带Cookie session requests.Session() # 第一步访问首页获取初始Cookie session.get(https://xxx.com, headersheaders) # 第二步登录接口携带账号密码会话自动保存登录Cookie login_data {username: xxx, password: xxx} session.post(https://xxx.com/login, datalogin_data, headersheaders) # 第三步访问需要登录的页面自动携带登录态Cookie resp session.get(https://xxx.com/user, headersheaders) print(resp.text)6.2 手动设置固定 Cookie已知有效 Cookie 时可直接写入请求头跳过登录步骤python运行import requests headers { User-Agent: Mozilla/5.0 Chrome/124.0.0.0, Cookie: sessionidxxxx; tokenxxxx } resp requests.get(https://xxx.com/user, headersheaders)七、实战五SSL/HTTP 指纹伪装高阶绕过部分高阶反爬通过SSL 指纹、TLS 版本、HTTP 协议特征识别requests此时使用httpx模拟真实浏览器协议特征完美绕过指纹校验。7.1 httpx 模拟浏览器指纹python运行import httpx from fake_useragent import UserAgent ua UserAgent() def fingerprint_crawl(url: str): # 模拟Chrome浏览器开启HTTP/2伪装TLS指纹 client httpx.Client( headers{User-Agent: ua.random}, http2True, # 启用HTTP/2协议现代浏览器默认 timeout10 ) resp client.get(url) print(f状态码{resp.status_code}) client.close() return resp.text if __name__ __main__: fingerprint_crawl(https://www.xxx.com)7.2 持久会话等同于 requests.Sessionpython运行import httpx from fake_useragent import UserAgent ua UserAgent() headers {User-Agent: ua.random} # 持久会话维持Cookie与指纹特征 client httpx.Client(headersheaders, http2True) client.get(https://xxx.com) resp client.get(https://xxx.com/data) print(resp.text) client.close()八、组合方案请求头 代理池 综合反爬结合前文 Redis IP 代理池 动态请求头构建多层防护大幅降低封禁概率python运行import requests from fake_useragent import UserAgent ua UserAgent() # 代理池接口地址 PROXY_API http://127.0.0.1:5000/get_proxy def get_proxy(): 从代理池获取代理 resp requests.get(PROXY_API) data resp.json() return data.get(proxy) if data[code] 200 else None def crawl_with_proxy_and_headers(url: str): proxy get_proxy() if not proxy: print(无可用代理) return proxies { http: fhttp://{proxy}, https: fhttps://{proxy} } headers { User-Agent: ua.random, Referer: url, Accept: text/html,*/* } try: resp requests.get(url, headersheaders, proxiesproxies, timeout10) print(请求成功) return resp.text except: # 上报失效代理 requests.post(http://127.0.0.1:5000/report_fail, data{proxy: proxy}) return None九、常见问题排查与优化技巧9.1 高频问题UA 正常但依旧拦截缺失Referer/Cookie/Sec-*字段补全完整请求头静态 UA 短期可用长期被封切换动态随机 UA降低请求频率状态码 200 但返回空内容防盗链校验失败补充Refererrequests 被指纹拦截替换为httpx模拟浏览器 SSL/HTTP 指纹。9.2 实战优化技巧请求头宁缺毋滥以浏览器抓包结果为标准不随意删减字段控制请求间隔搭配time.sleep()模拟人工浏览节奏动态 Cookie优先使用Session自动维持会话少用固定 Cookie字段一致性移动端 UA 搭配移动端请求特征PC 端 UA 搭配 PC 特征不混搭。9.3 工具推荐curlconverter浏览器抓包请求一键转为 Python requests/httpx 代码提升开发效率浏览器插件Modify Headers本地测试请求头效果。