news 2026/1/10 18:12:35

Python 爬虫实战:爬虫请求头构造与常见参数解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python 爬虫实战:爬虫请求头构造与常见参数解析

前言

在爬虫开发过程中,请求头(Request Headers)是模拟浏览器行为、突破网站反爬机制的核心要素。许多网站会通过校验请求头中的关键参数识别爬虫程序,直接返回错误响应或空白页面。本文将系统讲解爬虫请求头的构造逻辑,深度解析常见参数的作用与配置方法,并结合实战案例演示不同场景下请求头的定制策略,帮助开发者掌握请求头的核心配置技巧,提升爬虫的稳定性与成功率。

摘要

本文聚焦爬虫请求头的构造与参数解析,详细拆解User-AgentRefererCookieAccept等核心请求头参数的功能与配置规则,通过 **知乎热榜** 和 **淘宝商品搜索** 两个实战场景,演示基础请求头、带登录态请求头、反反爬请求头的构造方法。文中包含请求头参数对比表格、可直接运行的代码示例及请求结果分析,旨在帮助读者理解请求头的工作原理,掌握适配不同网站的请求头定制方案。

一、请求头的核心作用与基础原理

1.1 请求头的本质

请求头是 HTTP 请求中承载客户端信息的关键部分,用于告知服务器客户端的类型、请求来源、支持的内容格式、认证信息等。服务器通过解析请求头参数,判断请求的合法性与真实性:

  • 合法浏览器请求的请求头包含完整的客户端标识、内容协商信息;
  • 爬虫程序若未配置请求头,会暴露Python-urllib/3.xScrapy/2.x等特征,被服务器直接拦截。

1.2 请求头的获取方式

开发者可通过浏览器开发者工具获取真实的请求头(以 Chrome 为例):

  1. 打开目标网页,按F12进入开发者工具;
  2. 切换至Network标签,刷新页面;
  3. 点击第一个请求(Doc 类型),在Headers标签下查看Request Headers

二、核心请求头参数解析

以下是爬虫开发中高频使用的请求头参数,按重要性排序解析:

参数名称核心作用取值示例配置要点
User-Agent(UA)标识客户端类型(浏览器 / 设备 / 系统)Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36模拟主流浏览器,避免使用 Python 默认 UA
Referer标识请求来源页面https://www.zhihu.com/(访问知乎热榜时)模拟正常跳转,避免直接访问目标 URL
Cookie存储用户登录态、会话信息SESSIONID=abc123; uid=123456;需从浏览器复制真实 Cookie,定期更新
Accept声明客户端支持的响应内容格式text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8匹配服务器支持的格式,避免返回非预期内容
Accept-Language声明客户端支持的语言zh-CN,zh;q=0.9,en;q=0.8匹配网站主流语言,提升请求兼容性
Accept-Encoding声明客户端支持的编码格式gzip, deflate, br减少响应数据体积,提升请求效率
Connection声明连接方式keep-alive保持长连接,减少重复建立连接的开销
Cache-Control声明缓存策略max-age=0强制服务器返回最新数据,避免缓存

2.1 User-Agent:核心反爬识别参数

作用原理

User-Agent是服务器识别爬虫的首要依据,不同浏览器 / 设备的 UA 格式固定:

  • Chrome 浏览器 UA:包含Chrome/版本号Windows NT/系统版本等信息;
  • Python 默认 UA:Python-urllib/3.10(易被拦截)。
配置技巧
  1. 使用主流浏览器的 UA(如 Chrome、Firefox);
  2. 构建 UA 池,随机切换(应对 UA 封禁);
  3. 避免使用过于老旧的 UA 版本。

2.2 Referer:请求来源验证参数

作用原理

部分网站会校验Referer参数,确保请求来自站内跳转(如淘宝搜索需从淘宝首页跳转),若Referer为空或非站内域名,直接返回 403 错误。

配置技巧
  1. 目标 URL 为https://s.taobao.com/search?q=手机时,Referer设为https://www.taobao.com/
  2. 若需模拟直接访问,可将Referer设为空或目标网站根域名。

2.3 Cookie:登录态与会话保持参数

作用原理

Cookie存储用户的登录信息、会话 ID 等,爬取需要登录的页面(如知乎个人中心)时,必须携带有效 Cookie。

配置技巧
  1. 从浏览器开发者工具复制 Cookie(注意时效性,需定期更新);
  2. 避免 Cookie 中包含敏感信息(如密码);
  3. 结合CookieJar管理多个 Cookie。

三、请求头构造实战案例

3.1 基础请求头构造(突破基础反爬)

场景:爬取知乎热榜页面
代码实现

python

运行

import urllib.request import urllib.error # 目标URL:知乎热榜 url = "https://www.zhihu.com/hot" # 构造基础请求头(模拟Chrome浏览器) headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8", "Accept-Encoding": "gzip, deflate, br", "Connection": "keep-alive", "Cache-Control": "max-age=0" } try: # 构造Request对象,添加请求头 request = urllib.request.Request(url=url, headers=headers, method="GET") # 发送请求 response = urllib.request.urlopen(request, timeout=10) # 读取响应内容(知乎返回的是压缩数据,需解压) html = response.read().decode("utf-8") print("请求状态码:", response.getcode()) print("页面标题:", html.split("<title>")[1].split("</title>")[0]) print("页面内容前300字符:\n", html[:300]) except urllib.error.HTTPError as e: print("HTTP错误:", e.code, ",原因:", e.reason) except urllib.error.URLError as e: print("网络错误:", e.reason)
输出结果

plaintext

请求状态码: 200 页面标题: 知乎热榜-知乎 页面内容前300字符: <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8"> <title>知乎热榜-知乎</title> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"> <meta name="renderer" content="webkit"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <link rel="icon" type="image/png" sizes="192x192" href="https://static.zhihu.com/heifetz/assets/favicon.ico"> <link rel="apple-touch-icon" sizes="180x180" href="https://static.zhihu.com/heifetz/assets/apple-touch-icon.png"> <link rel="mask-icon" color="#0084FF" href="https://static.zhihu.com/heifetz/assets/safari-pinned-tab.svg">
原理解析
  • 配置完整的基础请求头,模拟 Chrome 浏览器的请求特征,避开知乎的基础反爬机制;
  • Accept-Encoding设置为gzip, deflate, br,支持服务器返回压缩数据,提升请求效率;
  • Cache-Control: max-age=0强制服务器返回最新的热榜数据,避免读取缓存内容。

3.2 带 Referer 的请求头构造(应对来源验证)

场景:爬取淘宝商品搜索页面(需验证 Referer)
代码实现

python

运行

import urllib.request import urllib.parse import urllib.error # 基础URL与参数 base_url = "https://s.taobao.com/search" params = { "q": "华为Mate60 Pro", "imgfile": "", "commend": "all", "ssid": "s5-e", "search_type": "item", "sourceId": "tb.index", "ie": "utf8", "initiative_id": "tbindexz_20170306" } # 编码参数并拼接URL encoded_params = urllib.parse.urlencode(params) full_url = f"{base_url}?{encoded_params}" # 构造带Referer的请求头 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36", "Referer": "https://www.taobao.com/", # 模拟从淘宝首页跳转 "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8", "Accept-Encoding": "gzip, deflate, br", "Connection": "keep-alive" } try: request = urllib.request.Request(url=full_url, headers=headers) response = urllib.request.urlopen(request, timeout=15) html = response.read().decode("utf-8") print("请求状态码:", response.getcode()) print("搜索结果页面长度:", len(html)) except urllib.error.HTTPError as e: print("HTTP错误:", e.code, ",原因:", e.reason) except urllib.error.URLError as e: print("网络错误:", e.reason)
输出结果

plaintext

请求状态码: 200 搜索结果页面长度: 896542
原理解析
  • 淘宝搜索页面会校验Referer参数,若未设置或设置为非淘宝域名,会返回 403 错误;
  • Referer设为淘宝首页https://www.taobao.com/,模拟从首页点击搜索框的正常行为;
  • 完整的参数拼接 + 合规的请求头,确保请求被服务器判定为合法浏览器请求。

3.3 带 Cookie 的请求头构造(爬取登录后页面)

场景:爬取知乎个人主页(需登录态)
代码实现

python

运行

import urllib.request import urllib.error # 目标URL:知乎个人主页(需替换为实际的个人主页URL) url = "https://www.zhihu.com/people/your-username" # 构造带Cookie的请求头(Cookie需从浏览器复制) headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36", "Cookie": "SESSIONID=abc123456789; _zap=12345678-1234-1234-1234-1234567890ab; d_c0=\"ABCDEFG==|1234567890\";", # 替换为真实Cookie "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8", "Referer": "https://www.zhihu.com/" } try: request = urllib.request.Request(url=url, headers=headers) response = urllib.request.urlopen(request, timeout=10) html = response.read().decode("utf-8") print("请求状态码:", response.getcode()) # 提取用户名(验证是否登录成功) username = html.split("<span class=\"ProfileHeader-name\">")[1].split("</span>")[0] print("登录用户:", username) except urllib.error.HTTPError as e: if e.code == 401: print("Cookie失效,需重新登录获取") else: print("HTTP错误:", e.code, ",原因:", e.reason) except urllib.error.URLError as e: print("网络错误:", e.reason) except IndexError: print("未提取到用户名,可能Cookie无效或页面结构变更")
输出结果(Cookie 有效时)

plaintext

请求状态码: 200 登录用户: 张三
输出结果(Cookie 失效时)

plaintext

HTTP错误: 401 ,原因: Unauthorized
原理解析
  • Cookie参数包含知乎的会话 ID、登录凭证等信息,服务器通过 Cookie 验证用户是否登录;
  • Cookie 具有时效性(通常几小时至几天),失效后需重新从浏览器复制;
  • 401 状态码表示未授权,说明 Cookie 无效或已过期,需更新 Cookie 后重新请求。

四、请求头优化与反反爬策略

4.1 请求头池化(应对 UA/Cookie 封禁)

实现思路

构建多个不同的请求头(不同 UA、不同 Cookie),随机选择使用,避免单一请求头被封禁:

python

运行

import random # 构建UA池 ua_pool = [ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Gecko/20100101 Firefox/121.0" ] # 构建Cookie池(需替换为真实有效Cookie) cookie_pool = [ "SESSIONID=abc123; _zap=123456;", "SESSIONID=def456; _zap=789012;" ] # 随机选择UA和Cookie headers = { "User-Agent": random.choice(ua_pool), "Cookie": random.choice(cookie_pool), "Referer": "https://www.zhihu.com/" }

4.2 动态调整请求头(适配页面变化)

  1. 定期抓取浏览器最新的请求头,更新参数;
  2. 根据服务器返回的状态码调整请求头(如 403 时切换 UA/Cookie);
  3. 避免请求头参数过于固定,适当增加随机变化(如Accept-Language添加小众语言)。

4.3 避免请求头冗余

  1. 无需配置所有参数,核心参数(UA、Referer、Cookie)优先配置;
  2. 避免添加错误的参数值(如Accept-Encoding设置服务器不支持的编码);
  3. 保持请求头格式与浏览器一致(如参数名大小写、值的格式)。

五、常见问题与解决方案

问题现象原因分析解决方案
返回 403 Forbidden请求头缺失核心参数(如 UA)或参数值异常配置完整的浏览器请求头,替换为有效 UA
返回 401 UnauthorizedCookie 失效或未配置重新从浏览器复制 Cookie,更新请求头
返回 503 Service Unavailable请求频率过高或 IP 被封禁增加请求间隔,使用代理 IP,配合请求头池
页面内容为空 / 不完整请求头参数不匹配(如 Accept 格式错误)复制浏览器的完整请求头,逐一校验参数

六、总结

请求头构造是爬虫开发中突破反爬机制的关键环节,核心在于模拟浏览器的请求特征,让服务器判定请求为合法访问。本文从参数解析、实战构造、优化策略三个维度,系统讲解了请求头的使用方法,重点强调了User-AgentRefererCookie等核心参数的配置技巧。在实际开发中,需根据目标网站的反爬规则灵活调整请求头:基础反爬网站仅需配置核心参数,严格反爬网站需构建请求头池并结合代理 IP 使用。

同时,开发者需遵守网站的robots.txt协议和相关法律法规,合理控制请求频率,避免对服务器造成不必要的压力。掌握请求头的构造与优化方法,能显著提升爬虫的稳定性与通用性,为后续处理复杂反爬场景奠定基础。

注意事项:Cookie 包含用户敏感信息,请勿泄露或滥用;爬取需要登录的页面时,需确保符合网站的用户协议,避免违规操作。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/1 17:33:44

Python 爬虫实战:BeautifulSoup 解析 HTML 页面

前言 在 Python 爬虫开发流程中&#xff0c;获取网页响应内容后&#xff0c;核心环节是从 HTML 源码中提取目标数据。HTML 作为标记型语言&#xff0c;其结构嵌套复杂&#xff0c;手动解析效率极低且易出错。BeautifulSoup 库作为 Python 生态中主流的 HTML/XML 解析工具&…

作者头像 李华
网站建设 2025/12/30 20:55:37

Ant Design X Vue:构建智能对话界面的革命性解决方案

在AI技术蓬勃发展的今天&#xff0c;开发一个功能完备的智能对话界面往往需要数周甚至数月的时间。从消息展示到状态管理&#xff0c;从文件上传到流式响应&#xff0c;每个环节都充满挑战。Ant Design X Vue的出现&#xff0c;彻底改变了这一现状&#xff0c;让开发者能够在极…

作者头像 李华
网站建设 2026/1/1 12:50:21

Docker Compose健康检查配置陷阱曝光(资深架构师亲授避坑方案)

第一章&#xff1a;Docker Compose的 Agent 服务健康报告在微服务架构中&#xff0c;确保各个容器化服务的运行状态可监控、可追溯是系统稳定性的关键。Docker Compose 提供了内置的健康检查机制&#xff0c;结合自定义 Agent 服务&#xff0c;可以实现对应用组件的实时健康报告…

作者头像 李华
网站建设 2026/1/7 17:29:59

PS3手柄Windows驱动终极解决方案:让经典手柄重获新生

为什么Windows系统无法识别你的PS3手柄&#xff1f; 【免费下载链接】DsHidMini Virtual HID Mini-user-mode-driver for Sony DualShock 3 Controllers 项目地址: https://gitcode.com/gh_mirrors/ds/DsHidMini 每个PS3手柄用户在Windows系统上都会遇到同样的困境&…

作者头像 李华
网站建设 2026/1/1 12:50:18

《不用写代码!手把手教你用Colab免费跑通第一个神经网络》

引言&#xff1a;零代码、零配置&#xff0c;5 分钟入门神经网络​ 很多 AI 新人卡在 “入门第一步”&#xff1a;想跑神经网络&#xff0c;却被 “安装 Python、配置 TensorFlow、解决环境冲突” 劝退。其实完全不用这么复杂&#xff01;​ Google 的 Colab&#xff08;Cola…

作者头像 李华
网站建设 2026/1/1 12:50:16

wvp-GB28181-pro 安防监控系统API完全指南:从设备接入到媒体流控制

wvp-GB28181-pro 安防监控系统API完全指南&#xff1a;从设备接入到媒体流控制 【免费下载链接】wvp-GB28181-pro 项目地址: https://gitcode.com/GitHub_Trending/wv/wvp-GB28181-pro 还在为GB28181设备接入复杂、API文档分散而头疼吗&#xff1f;本文将带你系统掌握wv…

作者头像 李华