别再只认得200!爬虫必须掌握的5类HTTP状态码及应对策略

0 阅读5分钟

摘要:上篇我们亲手用F12拆解了一个完整的HTTP请求,知道了爬虫该如何构造请求。但请求发出去后,服务器返回的第一句“话”就是状态码。200就万事大吉?301该怎么跟?403又代表什么?本篇将5类状态码逐一拆解,给你一份即查即用的“爬虫红绿灯”速查表。

前情回顾:别再只背概念了,打开Chrome F12,手把手拆解一个真实HTTP请求报文本文 - 掘金

一、状态码:服务器开口说的第一句话

无论你发什么请求,服务器返回的第一行永远是:

image.png

HTTP/1.1 200 OK

这里的 200 就是状态码,OK 是它的理由短语。这个三位数,本质上是服务器对你的请求给出的一个高度概括的“评语”:

2xx → “你要的东西,给你。”

3xx → “你要的东西搬家了,去别处找。”

4xx → “你的请求有问题,我不能给。”

5xx → “对不起,是我自己炸了。”

对爬虫工程师来说,处理状态码的核心原则只有一条:2xx 直接解析,3xx 追踪跳转,4xx 检查自身,5xx 挂起重试。

二、2xx 成功类:一切顺利,拿数据就行

这是爬虫最期望看到的区间。

200 OK 爬虫最喜欢的数字。请求完全成功,你要的 HTML、JSON、图片就老老实实躺在响应体里。

`import requests

r = requests.get('www.example.com') if r.status_code == 200: print(r.text[:100]) # 成功,直接解析`

204 No Content 请求成功,但服务器没有任何内容返回给你。常见于某些 API 操作成功后的空响应。爬虫遇到它,当作成功处理,但别去 r.text 里找数据,里面是空的。

三、3xx 重定向类:你要的东西已经搬家了

重定向意味着,你请求的 URL 上的资源,已经被移到了另一个新地址。

301 Moved Permanently:永久重定向。搜索引擎爬虫看到后会更新索引。

302 Found:临时重定向。资源暂时换了个位置。

303 See Other:常见于 POST 请求后,让客户端用 GET 方式跳转到另一个结果页。

🕷️ 爬虫最常遇到的坑:你请求 http:// 开头的网址,它给你一个 301 跳转到 https://。或者你不带 www,它让你跳转到带 www 的地址。

requests 库的智能处理:默认会自动跟随重定向,直接给你最终结果。你可以通过 r.history 查看中间经历了哪些 301/302 跳转,也可以通过 allow_redirects=False 禁止自动跳转,手动分析每一步。

r = requests.get('http://www.example.com') # 很多站会301到https print(r.status_code) # 最终是 200 print(r.history) # [<Response [301]>],中间过程一览无余

四、4xx 客户端错误:你(爬虫)的问题

这是爬虫最常碰壁、最需要反复排查的区间。服务器在说:你的请求不对,我拒绝执行。

403 Forbidden 爬虫的鬼门关。服务器已经理解了你的请求,但明确拒绝执行。你大概率是被反爬了。

常见原因:缺少或伪造的 User-Agent 不真实、缺少必要的 Cookie、IP 已被拉黑。 应对策略:检查并伪装请求头,特别是补全 User-Agent 和 Cookie;更换 IP 代理。

r = requests.get('https://httpbin.org/status/403') if r.status_code == 403: print('我被拒绝了,需要伪装得更像一个真实浏览器。')

  • 404 Not Found
    页面不存在。可能是 URL 路径写错了,或者目标文章已被删除。

  • 418 I'm a teapot 🫖
    一个来自 1998 年的愚人节玩笑协议(HTCPCP)。服务器拒绝煮咖啡,因为“我是个茶壶”。如果你真遇到它,笑一笑,然后检查你是不是把 URL 打成了什么奇怪的东西。

  • 429 Too Many Requests
    爬虫的限速罚单。服务器在抗议:“你请求得太快了,慢一点!”

    应对策略:必须在代码里加上 time.sleep() 延时,并降低并发请求数量。这是服务器给你的最后通牒,不理它下一步就是 403。

五、5xx 服务端错误:服务器自己出了问题

500 Internal Server Error 服务器的程序崩了。爬虫可以尝试重试,但如果对方一直返回 500,就别再持续施压了。

502 Bad Gateway / 503 Service Unavailable 服务器暂时不可用。常见于服务器过载或正在维护中。

503 是爬虫最值得重试的状态码,因为它通常是临时的。

带重试机制的健壮爬虫示例:

`import requests from time import sleep

def safe_get(url, retries=3): for i in range(retries): r = requests.get(url) if r.status_code == 200: return r elif r.status_code in [502, 503]: print(f'服务器暂不可用,第{i+1}次重试...') sleep(3) # 等待3秒再试 else: break # 非可重试错误,直接放弃 return None`

image.png

六、爬虫状态码红绿灯速查表

image.png

七、结语:状态码是你最直接的情报员

image.png 下次你再在 F12 的 Network 面板里看到那一列状态码,别再只认识 200 了。

403 在告诉你:你的伪装还不够像真人。

429 在劝你:爬得慢一点,礼貌一点。

503 只是让你:等一会儿再来,别着急。

一个聪明的爬虫,不在于跑得有多快,而在于它能读懂服务器返回的每一个数字背后的潜台词,并做出最恰当的反应。

建议把这份速查表收藏起来,它就是你写爬虫时最直接、最有效的排错指南。