我的知识记录

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也要控制频率,礼貌抓取。

Python requests带Headers模拟浏览器:解决403反爬基础篇

标签:

更新时间:2026-09-14 20:48:39

上一篇:Python requests处理JSON接口返回:字典取值与解析示例

下一篇:Python requests发起GET请求教程:最简单的网页抓取入门