Python requests带Headers模拟浏览器:解决403反爬基础篇
讲解requests自定义Headers,伪装User-Agent、Referer、Accept等字段,让请求看起来像真实浏览器,解决裸请求被服务器拒绝的403问题。
场景痛点
写好GET请求一跑,结果返回403 Forbidden或者一段"请使用浏览器访问"的提示。这是因为很多服务器会检查请求头里的User-Agent,发现是Python的requests默认标识就直接拒绝。带上一套完整的浏览器请求头,绝大多数基础反爬都能绕过去,是写爬虫必学的一步。
用到的库
pip install requests beautifulsoup4 lxml
完整代码
# 导入requests
import requests
def fetch_with_headers(url):
"""带浏览器请求头发起请求"""
# 构造一套常见的浏览器Headers,模拟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"),
# 告诉服务器我们从哪个页面跳过来的
"Referer": "https://www.baidu.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",
}
# 把headers传给get请求
resp = requests.get(url, headers=headers, timeout=10)
resp.encoding = resp.apparent_encoding
print("状态码:", resp.status_code)
print("内容长度:", len(resp.text))
return resp.text
def main():
# 用httpbin查看我们实际发出去的请求头
url = "https://httpbin.org/headers"
try:
html = fetch_with_headers(url)
print(html)
except Exception as e:
print("出错:", e)
if __name__ == "__main__":
main()
代码讲解
headers是一个字典,key是请求头名称,value是值。requests.get接收headers=参数后会把这些字段加到HTTP请求头里。User-Agent是最关键的字段,默认requests会发python-requests/2.x,很多网站直接拦掉。上面那串是Chrome浏览器的标准UA字符串。Referer告诉服务器这个请求是从哪个页面点过来的,有些资源站(图片、视频)会校验Referer防盗链。Accept-Language设成zh-CN可以让服务器优先返回中文页面。- 调试时用
https://httpbin.org/headers可以看到服务器视角下你发出去了什么头,方便核对。
运行结果
运行后会打印一个JSON,里面 headers 对象包含服务器收到的所有请求头,能看到我们自定义的User-Agent、Referer等都已发送成功,状态码200。
注意事项
- Headers不要加得太"干净",只有User-Agent一个字段反而容易被识别,建议把Accept、Accept-Language也带上。
- 不要照搬几年前的旧UA字符串,Chrome版本号要看起来是近期的。
- 改Headers只是绕过最基础的反爬,遇到Cloudflare、JS渲染、滑块验证码还需要更复杂的方案。
- 即使加了Headers也要控制频率,礼貌抓取。

更新时间:2026-09-14 20:48:39
上一篇:Python requests处理JSON接口返回:字典取值与解析示例