HTTP状态码与爬虫

简介

99%的网络爬虫技术都要与HTTP协议打交道,而在打交道的过程中,你会发现很多好玩的事情。本文主要介绍那些常用的HTTP状态码是如何被反爬虫技术使用的。

常用状态码与反爬虫

2xx

2xx系列状态码一般代表响应成功。

200

OK

最常见的状态码,代表一切正常。

202

Accepted

这个并不常见。原意为请求已经收到,不过服务端采用了异步处理的方式在处理,所以结果没有返回给你。

206

Partial Content

当你访问的资源支持断点下载,并且你使用了Range头部的时候,服务端会返回206,然后你可以继续换下一个范围获取之后的数据。

3xx

资源重定向。需要根据返回头信息中的Location字段重新发起请求。

301

Moved Permanently

资源 永久 重定向。注意是永久。最常见的比如网站升级了HTTPS,则当你使用HTTP访问的时候,会自动重定向到HTTPS的地址。

302

Found

资源 临时 重定向。此种情况下,就不要改你的书签或者访问地址了,可能过一会儿临时地址就失效了。
常见的情况是,某些网站首次访问会有个302跳转,进入某个中间页面做一些奇奇怪怪的操作。比如当你首次访问新浪微博的时候,会触发302跳转,通过JS添加一个访客的Cookie。

304

Not Modified

资源没有改变。这个主要是用来优化网络流量传输的。一般我们访问某个网站时,会访问这个网站的多个页面,这些页面所使用的一些静态资源,比如CSS、JS文件等都是共用的,并且在浏览器内缓存。但为了避免服务端有更新,而客户端没有及时更新,所以每次打开一个网页,浏览器都会重新请求一下这个资源,如果资源没变,那么服务端不用返回资源内容,只要返回304就好了,然后浏览器就自动使用本地缓存。如果服务端资源内容改了,那么就返回200,同时返回新的资源内容。

4xx

4xx一般代表请求有问题。

400

Bad Request

你的请求不知道哪里出了问题。一般是参数格式不对、Cookie不对等情况。

401

Unauthorized

没有登录。一般网站会自动跳转到登录页面。某些服务会直接在页面弹窗出登录框,比如FTP服务。

402

Payment Required

这个一点都不常用。不过很好玩。含义是:你所访问的资源是需要付费的。这个状态码设计的不错,不过真的有人会用吗?

403

Forbidden

禁止访问。这个大概是除了200之外,在爬虫里面最常见的了 ⊙﹏⊙∥∣°,一般就是你的IP被封了。

不过正常情况下,一般代表没有权限访问某个资源。

404

Not Found

资源不见了。一般是资源失效、被删除了。某些情况下,也可能是你没权限…

405

Method Not Allowed

请求方法不对。常见于对某个需要POST访问的资源使用了GET方法。小小提示一下:某些网站是不限制这个的,或者说做了兼容。你可以把需要POST发送的数据作为URL中的参数用GET的方式访问。

413

Payload Too Large

请求体太长了。常见于上传文件过大的情况。

414

URI Too Long

URL太长了。有个不成文的约定,URL长度不能超过1024。不过这个并非标准,各个网站、浏览器的实现也都不一致。所以出现这个情况一般代表你构造的URL有问题。为啥是你构造的,因为肯定是你构造的。如果不是你构造的,这个问题怎么可能被触发呢。
还有个特殊情况,比如新浪微博在某些情况下会返回414来逗你,让你懵逼一会。你的请求没问题,只不过是被识别到你是个爬虫了。

418

I’m a teapot

我是个茶壶。嗯,就是逗你玩。你已经被发现了。

429

Too Many Requests

访问太频繁了。歇一会吧(或者换个代理),你已经被发现了。

5xx

5xx一般代表服务端有问题。

这个就不分开说了,我也没仔细研究过区别。一般是后端代码有问题,处理请求出现了错误导致的。或者是网络不通等。

不过,某些网站会有些迷之行为。明明是正常的请求、正常的响应,偏偏返回个501。

总结一下

常用状态码及其含义跟大家介绍了。

但是,还有个重点:
状态码只是规范,并非强制要求

所以你会看到某些网站在状态码上搞事情。走的路多了,总会遇见鬼的。

HTTP状态码含义全集

https://developer.mozilla.org/en-US/docs/Web/HTTP/Status