本文章属于爬虫入门到精通系统教程第九讲 本文讲解的知识点是headers里面的If-modified-since 直接开始案例把 本次我们要抓取的内容是苹果应用商店里面的所有app 从 iTunes 下载的 requests.get(url,headers=headers) # 获取上次修改时间 last_modified = z.headers['Last-Modified'] # 修改headers headers['If-Modified-Since last_modified: print u'网页没有更新' #这种方法也可以知道网页是否有更新 总结 那么假如我要每天爬取苹果应该商店的app,那么我会在第一次请求的时候吧每个网页的上次修改时间存到数据库(也就是If-Modified-Since
它只是告诉浏览器和代理在使用它之前验证服务器的缓存内容(这是通过If-Modified-Since,If-Unmodified-Since,If-Match,If-None-Match属性完成的)。 If-Modified-Since: If-Modified-Since 和 Last-Modified 一样都是用于记录页面最后修改时间的 HTTP 头信息,只是 Last-Modified 是由服务器往客户端发送的 HTTP 响应头字段,而 If-Modified-Since 则是由客户端往服务器发送的请求头字段。 If-Modified-Since如果提供的日期以来尚未更改,服务器不会发送文档的实际内容。 如果文档的ETag仍然与If-None-Match标头的值匹配,则服务器将不发送实际文档。 If-None-Match和If-Modified-Since都可以出现在同一个请求中,但ETag优先于If-Modified-Since(就是Last-Modified的时间戳的值),因为它被认为更准确
add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since add_header 'Access-Control-Expose-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since add_header 'Access-Control-Expose-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since
浏览器携带的是具有判断意味的属性 —— If-Modified-Since(从什么时间以来是否改变) 和 If-None-Match(是否匹配不到)。 Last-Modified 和 If-Modified-Since 是 HTTP 1.0 引入的。 If-Modified-Since 再次请求服务器时,请求头会携带此字段,值为上次请求时服务器返回的 Last-Modified 的值。 服务器收到请求后发现有头 If-Modified-Since 则与被请求资源的最后修改时间进行比对: 若资源的最后修改时间大于 If-Modified-Since,说明资源又被改动过,则响应整片资源内容 若资源的最后修改时间小于或等于 If-Modified-Since,说明资源无新修改,则响应 HTTP 304,告知浏览器继续使用所保存的 cache。
[si4ae1dlnt.jpeg] 缓存5.jpg 协商缓存 当浏览器的强缓存失效的时候或者请求头中设置了不走强缓存,并且在请求头中设置了If-Modified-Since 或者 If-None-Match ○ Last-Modified/If-Modified-Since Last-Modified/If-Modified-Since 的值代表的是文件的最后修改时间,第一次请求服务端会把资源的最后修改时间放到 If-Modified-Since 的值进行比较,如果相等,返回 304 ,并加载浏览器缓存。 为了保证 lastModified 不影响缓存,我把通过 Last-Modified/If-Modified-Since 请求头删除了,源码如下: const express = require('express ,Last-Modified/If-Modified-Since 会错误地返回 304 如果文件被修改了,但是内容没有任何变化的时候,Last-Modified/If-Modified-Since 会错误地返回
Last-Modified/If-Modified-Since Last-Modified/If-Modified-Since要配合Cache-Control使用。 l If-Modified-Since:当资源过期时(使用Cache-Control标识的max-age),发现资源具有Last-Modified声明,则再次向web服务器请求时带上头 If-Modified-Since web服务器收到请求后发现有头If-Modified-Since 则与被请求资源的最后修改时间进行比对。
aren't # add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since POST, OPTIONS'; add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since POST, OPTIONS'; add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since
在客户端地一次输入URL时,服务器端会返回内容和状态码200, 表示请求成功,同时会添加一个“Last-Modified”属性,表示该请求资源的最后修改时间 客户端第二次请求此URL时,客户端会向服务器发送请求头 “IF-Modified-Since 调用 checkNotModified() 方法验证 http 请求头中的“If-Modified-Since”的时间进行对比,判断页面是否更新过。 Paste_Image.png 调用 validateIfModifiedSince() 方法获取http请求头中的“If-Modified-Since”值,并验证是否修改过。 解析http 请求头中的“If-Modified-Since”值 判断缓存页面是否需要更新。 通过浏览器F12 可以看出: 每次请求都会携带“If-Modified-Since”信息到服务器验证资源是否需要更新。
文件修改日期 If-Modified-Since / Last-Modified 2.1.1. if_modified_since 2.1. 静态文件 2.2. 文件修改日期 If-Modified-Since / Last-Modified If-Modified-Since 小于 Last-Modified 返回 HTTP/1.1 200 OK, 否则返回 , 浏览器只有发现Last-Modified后,第二次请求才会推送 If-Modified-Since 需要刷新两次页面。 用户请求index.html Nginx 会找到该文件读取 mtime 与 If-Modified-Since 匹配,如果If-Modified-Since大于 Last-Modified返回 304否则返回 日期大于我们指定的日期程序返回HTTP/1.1 304 Not Modified # curl -H "If-Modified-Since: Fri, 28 Feb 2014 20:04:18
其中 Etag / If-None-Match 的优先级比 Last-Modified / If-Modified-Since 高。 Last-Modified / If-Modified-Since Last-Modified 是该资源文件在服务器最后被修改的时间,会在服务器响应请求时返回,如下: If-Modified-Since 服务器收到该请求,发现请求头含有 If-Modified-Since 字段,则会根据 If-Modified-Since 的字段值与该资源在服务器的最后被修改时间做对比,若服务器的资源最后被修改时间大于 因此,如果请求中包含If-Modified-Since,就说明已经有缓存在客户端。 对于静态文件,例如:CSS、图片,服务器会自动完成Last-Modified和If-Modified-Since的比较,完成缓存或者更新。
Last-Modified/If-Modified-Since Last-Modified/If-Modified-Since要配合Cache-Control使用。 If-Modified-Since:当资源过期时(使用Cache-Control标识的max-age),发现资源具有Last-Modified声明,则再次向web服务器请求时带上头 If-Modified-Since web服务器收到请求后发现有头If-Modified-Since 则与被请求资源的最后修改时间进行比对。
○ Last-Modified/If-Modified-Since Last-Modified/If-Modified-Since 的值代表的是文件的最后修改时间,第一次请求服务端会把资源的最后修改时间放到 If-Modified-Since 的值进行比较,如果相等,返回 304 ,并加载浏览器缓存。 缓存6.jpg 第二次请求资源,服务端根据请求头中的 If-Modified-Since 和 If-None-Match 验证文件是否修改。 ? 为了保证 lastModified 不影响缓存,我把通过 Last-Modified/If-Modified-Since 请求头删除了,源码如下: const express = require('express /If-Modified-Since 会错误地返回 304 如果文件被修改了,但是内容没有任何变化的时候,Last-Modified/If-Modified-Since 会错误地返回 304,上面的例子就说明了这个问题
add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since
xxx Last-Modified:xxx Server: 服务器 如果没有命中强缓存,浏览器会发送请求到服务器,请求会携带第一次请求返回的有关缓存的header字段信息(Last-Modified/If-Modified-Since 或 If-Node-Match),若响应头没有Last-Modified或Etag字段,则请求头也不会由对应的字段 Last-Modified/If-Modified-Since 二者的值都是 GMT response的header加上Last-Modified的header,这个header表示这个资源在服务器上的最后修改时间 浏览器再次跟服务器请求这个资源时,在request的header上加上If-Modified-Since 的header,这个header的值就是上一次请求时返回的Last-Modified的值 服务器再次收到资源请求时,根据浏览器传过来的If-Modified-Since和资源在服务器上的最后修改时间判断资源是否有变化 header 浏览器收到 304 的响应后,就会从缓存中加载资源 如果协商缓存没有命中,浏览器直接从服务器加载资源时,Last-Modified 的 Header在重新加载的时候会被更新,下次请求时,If-Modified-Since
last-modified & if-modified-since last-modified 表示文件的最后修改日期,由服务器添加到 Response Header 中;if-modified-since 服务器收到请求后,会将 if-modified-since 和服务器上该文件的修改时间戳进行比对,如果超过了缓存时间,那么则返回最新的资源,200 状态码,如果还在缓存有效期内,则返回 304 状态码。 image.png image.png 上面这个例子可以看到: Request Header 中 if-modified-since: Fri, 20 Dec 2019 12:44:01 GMT Response last-modified / if-modified-since 是以秒为单位,如果在秒以内文件发生了修改,那么根据这组 Header 头服务器会认为文件没有修改,依然命中协商缓存,返回老的资源 因为以上这些问题 类似于 expires 和 cache-control,etag / if-none-match 的优先级要比 last-modified / if-modified-since 高。
主要有两种方式: Last-Modified,If-Modified-since。 二 协商缓存 2.1 区分Last-Modified和If-Modified-Since 以一个返回的接口为例: 图片2.png Last-Modified的格式: Last-Modified: Mon , 17 Sep 2018 12:06:18 GMT If-Modified-Since的格式: If-Modified-Since: Mon, 17 Sep 2018 12:06:18 GMT 2.2 ,在respone的header加上Last-Modified字段,表示该资源在服务器上的最后修改时间; · 浏览器再次向服务器请求这个资源时,在request的header上加上If-Modified-Since 字段,这个值就是上一次请求时返回的Last-Modified的值; ·服务器收到资源请求时,比较If-Modified-Since字段值和被请求资源的最后修改时间,若资源最后修改时间较旧,则说明文件没有修改
aren't # add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since POST, OPTIONS'; add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since POST, OPTIONS'; add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since
如图: 2.从客户端传回服务端的(即请求头): 1)If-Modified-Since:表示询问服务端,从某个时间点起资源是否修改了。 Last-Modified/If-Modified-Since 二者的值都是GMT格式的时间字符串,具体过程: 浏览器第一次跟服务器请求一个资源,服务器在返回这个资源的同时,在respone的header 加上Last-Modified的header,这个header表示这个资源在服务器上的最后修改时间 浏览器再次跟服务器请求这个资源时,在request的header上加上If-Modified-Since 的header,这个header的值就是上一次请求时返回的Last-Modified的值 服务器再次收到资源请求时,根据浏览器传过来If-Modified-Since和资源在服务器上的最后修改时间判断资源是否有变化 header 浏览器收到304的响应后,就会从缓存中加载资源 如果协商缓存没有命中,浏览器直接从服务器加载资源时,Last-Modified的Header在重新加载的时候会被更新,下次请求时,If-Modified-Since
本文作者:IMWeb devinran 原文出处:IMWeb社区 未经同意,禁止转载 Last-Modified 与 If-Modified-Since 在浏览器第一次请求某url获得的返回状态是 ,格式类似于: Last-Modified Thu, 15 Oct 2015 02:45:17 GMT 然后在浏览器第二次请求此url时,浏览器会根据之前获得的Last-Modified向服务器传送If-Modified-Since 请求头,询问文件是否有被修改过 If-Modified-Since Thu, 15 Oct 2015 02:45:17 GMT 如果服务器端资源没有变化,则请求返回304。 如果If-Modified-Since的时间比服务器当前时间还晚,则会被认定为非法请求 ETag 与 If-None-Match HTTP协议定义ETag为被请求变量的实体标记,类似于一个资源的 If-None-Match 9a932760982d29a83836cbd469bb14e7 以上两个方式虽然完成了缓存文件功能,但是每次请求url时还是会向服务器发送一个请求头If-Modified-Since
URL时,服务器端会返回内容和状态码200, 表示请求成功,同时会添加一个“Last-Modified”属性,表示该请求资源的最后修改时间 客户端第二次请求此URL时,客户端会向服务器发送请求头 “IF-Modified-Since 调用 checkNotModified() 方法验证 http 请求头中的“If-Modified-Since”的时间进行对比,判断页面是否更新过。 checkNotModified() Paste_Image.png 调用 validateIfModifiedSince() 方法获取http请求头中的“If-Modified-Since”值,并验证是否修改过 response响应状态码304或412 如果是GET 或 HEAD 请求则添加响应头“Last-Modified” validateIfModifiedSince() 解析http 请求头中的“If-Modified-Since HTTP 请求响应头分析 通过浏览器F12 可以看出: 每次请求都会携带“If-Modified-Since”信息到服务器验证资源是否需要更新。