如何给图片加referer 信息
爬虫抓图被 403 挡了,图片十有八九是信息 referer 的问题。我上周写了个小脚本批量下载某壁纸站的图片图片,直连 URL 返回的信息全是 403 页面,加上 referer 头之后立刻正常。图片这不是信息什么高深技术,但不知道的图片人能卡一整天。
referer 是信息 HTTP 请求头里的一个字段,告诉服务器"我是图片从哪个页面跳过来的"。服务器拿它做防盗链判断:你从我的信息网站点图片,referer 是图片我的域名,放行;你从别人网站或者直接敲 URL 访问,信息referer 为空或者不对,图片拒绝。信息就这么简单。图片
浏览器里怎么改
Chrome 装个 ModHeader 扩展,添加一个请求头,名称填 Referer,值填目标网站的首页地址。刷新页面,图片就出来了。Firefox 可以用 Referer Control 或者直接改 about:config 里的 network.http.sendRefererHeader 参数。不过浏览器改 referer 有个坑:某些网站会同时校验 referer 和 cookie,光改 referer 不够用。
用 curl 和 wget 加
命令行下最直接。curl 加一个 -e 参数就行:
curl -e "https://www.example.com/" -O "https://cdn.example.com/photo.jpg" wget 用 --referer:
wget --referer="https://www.example.com/" "https://cdn.example.com/photo.jpg" 我平时调试阶段用 curl 最多,因为能看到完整的响应头,确认服务器到底检查了哪些字段。有一次遇到个站,referer 对了还是 403,加上 -v 一看,原来它还在校验 User-Agent 和 Accept,补上就通了。
Python 脚本里怎么设
用 requests 库的话,构造一个 headers 字典传进去:
import requests headers = { "Referer": "https://www.example.com/", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)" } resp = requests.get("https://cdn.example.com/photo.jpg", headers=headers) with open("photo.jpg", "wb") as f: f.write(resp.content) 关键点:Referer 的拼写是历史遗留错误,正确的英文应该是 Referrer,但 HTTP 标准里就写成了 Referer,少一个 r。写代码的时候别自作聪明改过来,服务器只认标准里的拼法。
几个容易踩的坑
referer 的值必须是完整 URL,带协议头。www.example.com 和 https://www.example.com/ 在服务器眼里可能不一样。有些防盗链逻辑做的是前缀匹配,只要 referer 以自己域名开头就放行,这种最好绕过。还有的做的是包含匹配,更宽松。
HTTPS 页面请求 HTTP 资源时,浏览器默认不发送 referer。反过来 HTTP 页面请求 HTTPS 资源,referer 会正常带上。这个规则是浏览器层面的,脚本里不受影响。
另外提一句,Referrer-Policy 响应头可以控制浏览器发不发 referer、发多少。值设成 no-referrer 就完全不发,设成 origin 只发域名部分。你做防盗链的时候可以配合这个头来用,但别指望它挡得住脚本——脚本根本不理会这个策略,想发什么就发什么。
说到底,referer 校验只能防君子不防小人。对普通用户来说够用,对会写几行代码的人来说就是一层纸。真正要保护图片资源,还是得靠签名 URL、token 鉴权那套东西。









