4、HTTP请求头(上):Host、User-Agent、Referer、Origin、Cookie、Authorization
各位好,我是老张。今天咱们聊聊请求头里最常用的六个字段。说实话,搞数据采集这么多年,我见过太多新手在这几个头上栽跟头。有的是忘了带Cookie,直接被封IP;有的是Referer没写对,服务器直接返回403。嗯,咱们一个一个来拆解。
4.1 Host:你到底是来找谁的?
Host这个头,说白了就是告诉服务器:“我要访问的是哪个网站”。你想想看,一台服务器上可能挂着几十个网站,没有Host,服务器怎么知道你要找谁?
核心要点:Host字段是HTTP/1.1强制要求的,没有它服务器会返回400 Bad Request。
格式很简单:
Host: www.example.com:8080
如果端口是默认的80或443,可以省略端口号。我在做分布式爬虫时遇到过一个问题——多个爬虫节点同时请求同一个目标,结果因为Host写错了(少了个www),数据全乱了。后来我养成了习惯:每次发请求前,先打印一遍请求头,肉眼检查Host对不对。
小技巧:用Python的requests库时,如果你传了URL,它会自动帮你填Host。但如果你用urllib或者自己拼HTTP报文,千万别忘了手动加。
4.2 User-Agent:伪装成什么浏览器?
User-Agent(简称UA)告诉服务器:“我是用什么浏览器/工具来访问的”。服务器根据UA决定返回什么格式的内容——给手机端返回移动版页面,给爬虫直接封掉。
我刚开始做采集时,直接用Python的默认UA:
User-Agent: Python-urllib/3.9
结果呢?对方服务器直接返回一个验证码页面。后来我改成Chrome的UA,问题就解决了。说白了,很多网站的反爬策略第一道防线就是检查UA。
常见的UA格式:
| 浏览器/工具 | UA示例(部分) |
|---|---|
| Chrome 120 (Windows) | Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ... Chrome/120.0.0.0 Safari/537.36 |
| Firefox 121 (Windows) | Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:121.0) Gecko/20100101 Firefox/121.0 |
| Safari (iPhone) | Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) AppleWebKit/605.1.15 ... Mobile/15E148 |
| 百度爬虫 | Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html) |
注意:不要一直用同一个UA。我见过有人一个UA用三个月,结果被对方标记为异常流量。建议准备一个UA池,每次请求随机切换。
4.3 Referer:你是从哪跳过来的?
Referer(注意拼写,不是Referrer)告诉服务器:“用户是从哪个页面点过来的”。这个字段在防盗链和反爬中特别重要。
举个例子。我采集某个图片网站时,直接请求图片URL返回403。加上Referer后,图片就正常加载了。为什么会这样?因为服务器检查了来源——只有从它自己的页面跳过来的请求才允许访问图片。
Referer: https://www.example.com/gallery/photo-123.html
实战经验:采集需要登录的网站时,Referer通常要设置为登录页或首页。我曾经因为Referer写错了,导致登录状态一直无效,排查了整整两个小时。
4.4 Origin:比Referer更干净
Origin和Referer有点像,但它只包含协议、域名和端口,不包含路径和查询参数。它主要用于CORS(跨域资源共享)场景。
Origin: https://www.example.com
注意区别:
| 字段 | 包含内容 | 典型用途 |
|---|---|---|
| Referer | 完整URL(协议+域名+路径+参数) | 防盗链、统计来源 |
| Origin | 协议+域名+端口(无路径) | CORS跨域判断 |
我在采集API接口时,经常需要同时设置Referer和Origin。有些后端只检查Origin,有些两个都检查。我的习惯是:两个都带上,保持一致。
4.5 Cookie:你的身份凭证
Cookie是服务器留在你浏览器里的小纸条。每次请求时,浏览器会自动把Cookie带上,服务器就知道你是谁了。
格式:
Cookie: session_id=abc123; user_token=xyz789; theme=dark
每个键值对用分号+空格隔开。我在采集需要登录的网站时,通常先手动登录一次,然后用浏览器的开发者工具把Cookie复制出来,写到爬虫代码里。
避坑指南:Cookie是有有效期的。我曾经写了一个定时任务,每天凌晨采集数据,结果第三天就失败了——因为Cookie过期了。解决方案:要么用Session维持登录状态,要么写个自动刷新Cookie的逻辑。
另外,有些网站会把关键信息放在Cookie里,比如分页参数、搜索条件。如果你漏掉了某个Cookie,返回的数据可能就不对。
4.6 Authorization:我是谁?我有权限吗?
Authorization用于身份认证,最常见的是Bearer Token和Basic Auth两种方式。
Bearer Token格式:
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
Basic Auth格式:
Authorization: Basic base64(username:password)
我采集某个金融数据API时,对方要求每次请求都带上Authorization头。一开始我忘了加,返回的是401 Unauthorized。加上之后,数据就正常返回了。
安全提醒:Authorization里的Token或密码是敏感信息。千万不要硬编码在代码里,更不要上传到GitHub。我见过有人把API Key直接写在代码里然后推到公开仓库,结果被薅了几万块钱的流量费。
4.7 知识体系总览
下面这张图把这六个请求头的关系和用途梳理了一下,方便你记忆:
4.8 实战中的组合用法
在实际采集项目中,这六个头很少单独使用。我一般会这样组合:
- 基础采集:Host + User-Agent(伪装浏览器)
- 防防盗链:Host + User-Agent + Referer + Origin
- 需登录:Host + User-Agent + Cookie(或Authorization)
- 全副武装:六个头全部带上,再加一些自定义头
举个例子,采集某个需要登录的电商网站时,我的请求头长这样:
Host: www.example-shop.com
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.example-shop.com/my-account/orders
Origin: https://www.example-shop.com
Cookie: session=abc123; csrf_token=xyz789
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
我的习惯:每次写爬虫前,先用浏览器的开发者工具(F12 -> Network)抓一次包,看看正常请求都带了哪些头。然后照着抄,一个都不要少。这样能避免90%的反爬问题。
好了,这六个头就先讲到这里。记住一句话:请求头就是你和服务器之间的“自我介绍”,写对了,数据就来了;写错了,门都进不去。下节课咱们接着聊剩下的几个重要请求头。