问题

今天使用Python爬取高德地图边界数据的时候,设置了header,IP代理,结果返回打印状态码一直显示为304,因为这是GET请求,在浏览器打开后能明显看到有数据返回,为什么在代码里面就不行了呢?

解释

心里很疑惑,百度查了下HTTP状态码,304的解释为:

原意为未修改。

即所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。

客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源。

详细参见:https://www.runoob.com/http/http-status-codes.html

何时会发生

什么情况下会返回304状态码?客户端是怎么知道这些内容没有更新的呢?

其实这并不是客户端的事情,而是你服务器的事情。

大家都知道服务器可以设置缓存机制,这个功能是为了提高网站的访问速度。

当你发出一个GET请求的时候服务器会从缓存中调用你要访问的内容,这个时候服务器就可以判断这个页面是不是更新过了,如果未更新过那么他会给你返回一个304状态码。

例子

例如:一些搜索引擎是如何知道我们的网站是否有更新。

判断网页是否发生变化最直接的方法是设置页面的某一处为监控区域,每次都抓取该部分区域的内容,然后与本地保存的或最 近一次抓取内容比较,如果有差异就表明网页发生了变化,才可以进行解析。

这种方法比较稳妥,几乎可达到万无一失的效果。

但是,这种方式在每次扫描时都要下载页面内容,并且要去截取监控区域的内容,最后还要进行字符串比较,整个过程比较耗时。

其实在众多网页中,有一部分网站的网页内容是静态页面,如图片,html,js等,这些静态页面往往可能是服务器早已准备好的,用户访问时仅仅是下载而已。那么针对这种静态页面,就可以仅仅通过304状态码来判断,内容是否发生了变化。

解决办法

很简单:在requests headers中,记得去掉

If - Modified-Since

If-None-Natch

这两项,并且将Cache-Control设置为no-cach`即可。

欢迎加入地图数据爬取交流群:626697156,有问题可以反馈给群主

原创文章,转载请注明出处:http://www.loveyuanwei.com/article/ss/