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。
总结一下
常用状态码及其含义跟大家介绍了。
但是,还有个重点:
状态码只是规范,并非强制要求。
所以你会看到某些网站在状态码上搞事情。走的路多了,总会遇见鬼的。