爬虫被拦?都是没搞懂Referer和Host这两个“通行证”

谷德IP代理 2026-04-09 10:06:11

相信做爬虫的朋友,大概率都遇到过这种糟心事:周末闲得慌,想爬点电影评分数据,打开浏览器一看,网页好好的,评分、剧情介绍全都整整齐齐。可一用Python的requests库去请求,返回的就只有一行破代码——403 Forbidden,访问被拒绝,啥有用的都没拿到。


这就跟你朋友来你家吃饭,到了小区门口,被保安拦下来一样:“你找谁啊?谁让你来的?” 没你报房号,没你提前跟保安打声招呼,你朋友就算站在门口,也进不去小区。


爬虫上网也是这个道理,服务器就相当于小区保安,你不拿出“合法凭证”,它就直接把你拦在门外。而这个“凭证”,最关键的就是两个请求头——Referer和Host,很多人栽跟头,就是没把这俩搞明白。

爬虫被拦?都是没搞懂Referer和Host这两个“通行证”

先说说真实翻车现场:浏览器能进,爬虫就不行


我见过很多新手,刚开始学爬虫,上来就写一行requests.get(url),然后满心期待等着数据返回,结果就收到个403错误。他就纳闷了:“我浏览器能打开啊,为啥爬虫就不行?”


其实差别特别简单,就在于“请求头”。你用浏览器访问网页的时候,浏览器会自动给服务器带上一堆“身份信息”,相当于你朋友去小区,主动跟保安报房号、说清楚找谁;而你写的爬虫,如果不特意设置,就相当于你朋友啥也不说,直接往小区里闯,保安能不拦吗?


就像你给的参考里,访问豆瓣电影首页时,出现“link hit security strategy”的报错,本质上就是服务器识别出,你的请求没有带对“凭证”,直接判定你是“可疑人员”,把你拦在了门外。


Host:相当于你给保安报的“房号”


Host这个请求头,说直白点,就是告诉服务器:“我找的是你这台服务器上的哪个网站”。


可能有人不知道,现在很多服务器都是“一机多用”的——一台服务器上,可能同时挂着几十个网站,这就叫虚拟主机。比如豆瓣的服务器,上面可能既有豆瓣电影(movie.***.com),又有豆瓣读书、豆瓣小组。


你发起请求的时候,服务器收到信号,一看Host是“movie.***.com”,就知道你要的是豆瓣电影的数据,而不是其他板块;但如果你不写Host,或者写得不对,服务器就懵了:“你到底要找谁啊?” 轻则给你返回错的内容,重则直接拒绝访问,连门都不让你进。


重点是,浏览器会自动帮你带上Host,不用你操心;但爬虫不行,如果你不手动设置,有些库会用默认值或者直接填IP地址,服务器一比对,发现不对,立马就把你拦下来了。


Referer:相当于你跟保安说的“谁让我来的”


再说说Referer,这里先纠正一个小细节,它的拼写就是少一个r,不是“Referrer”,别写错了。这个请求头的作用,就是告诉服务器:“我是从哪个页面点过来的”。


举个例子,你从百度搜索“豆瓣电影Top250”,点进豆瓣的页面,这时候Referer就是百度的网址;如果你从豆瓣电影首页,点击进入Top250页面,Referer就是豆瓣电影首页的网址。


服务器为啥要管你从哪来?主要是为了防盗链、防刷量,还有统计访问来源。最常见的就是防盗链——很多网站的图片、视频,只允许自己网站的页面引用。如果你直接用爬虫去请求一张图片的地址,服务器一看Referer是空的,或者不是自己家的网址,立马就拒绝了,要么就给你返回一张“请访问原站查看图片”的提示图。


这就跟小区保安一样,不光要看你报的房号(Host),还要问你“谁让你来的”(Referer)。你要是说“我自己来的,没人叫我”,保安大概率不会放你进;但你说“302房的小李让我来的”,保安确认一下,就会放你进去了。


爬虫过“门禁”的方法,其实超简单


搞懂了这两个请求头的作用,想让爬虫顺利通过服务器的“门禁”,就很简单了——把浏览器访问时带的请求头,原样复制过来,或者挑Host、Referer、User-Agent这三个关键的带上就行。


给大家放一段简单的代码示例,一看就会:


import requests


headers = {
    "Host": "movie.***.com",  # 告诉服务器,我找豆瓣电影
    "Referer": "https://movie.***.com/",  # 告诉服务器,我从豆瓣首页来
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) ..."  # 伪装成浏览器
}


# 请求豆瓣电影Top250页面
response = requests.get("https://movie.***.com/top250", headers=headers)

这样一来,服务器一看:Host对得上,是豆瓣电影;Referer也是豆瓣自家的页面,User-Agent也像是正经浏览器,就会觉得“这人是正常访问的,不是爬虫”,然后就放你进去,把数据返回给你了。


几个容易忽略的小细节,别踩坑!


1.  Referer可能泄露隐私。比如你从A网站跳转到B网站,B网站能通过Referer看到你是从A来的,所以有些场景下,浏览器或者网站会主动去掉Referer,比如从HTTPS的网站跳到HTTP的网站,就会自动隐藏。


2.  不是所有服务器都检查Referer。很多API接口不怎么管这个,但图片、视频、音频这些静态资源,大概率会检查防盗链,这时候Referer就很重要了。


3.  有些网站检查得更严格。不光要看Referer有没有,还会检查Referer是不是自己域名下的合法页面。比如你爬豆瓣Top250,Referer必须是“https://movie.***.com/top250”相关的页面,你只写“https://movie.***.com/”,可能都不行。


总结


Host就是你给保安报的“房号”,告诉服务器你要找谁;Referer就是你跟保安说的“谁让我来的”,告诉服务器你从哪来。这两个“通行证”都带对了,服务器这个“保安”才会放你进去。


其实爬虫写得好不好,不在于你会不会写复杂的代码,而在于你能不能把请求头伪装得像个真人。下次再遇到403错误,别慌,打开浏览器的开发者工具(按F12),找到Network标签,看看正常访问时带了哪些请求头,复制过来,八成问题就能解决。


就像访问豆瓣电影那样,只要带对了Host和Referer,就不会再被“link hit security strategy”这个报错拦住,顺利拿到你想要的数据啦。