HTTP 范围请求
你好,我是无能。
我一直认为,HTTP Get请求每次都会获取整个页面,这让我觉得一点也不环保。
如果最终只需要获取部分信息,例如只获取<head>内的内容,那么就只获取一部分;如果不是,就获取整个页面并进行提取。
如果能这样做,网络传输成本以及解析head内标签的处理都会对CPU更友好,时间也会更短,感觉好处多多。
而且,既然是TCP通信,我想HTTP应该没有什么做不到的,查了一下发现果然可以。
使用 curl 进行测试
看起来可以通过在-H选项中为请求头信息添加范围来限制它。
$ curl -H "Range: bytes=0-1024" https://soulminingrig.com/
<!DOCTYPE html>
<html lang="ja"><head><meta charset="utf-8"><meta content="width=device-width,initial-scale=1.0" name="viewport"><title>Home - SOULMINIGRIG</title><meta content="light dark" name="supported-color-schemes"><meta content="hsl(220, 20%, 100%)" media="(prefers-color-scheme: light)" name="theme-color"><meta content="hsl(220, 20%, 10%)" media="(prefers-color-scheme: dark)" name="theme-color"><link href="/pagefind/pagefind-ui.css" rel="stylesheet"><link href="/styles.css" rel="stylesheet"><link href="/feed.xml" rel="alternate" title="SOULMINIGRIG" type="application/atom+xml"><link href="/feed.json" rel="alternate" title="SOULMINIGRIG" type="application/json"><link href="/favicon.png" rel="icon" sizes="32x32" type="image/png"><link href="https://soulminingrig.com/" rel="canonical"><script src="/js/main.js" type="module"></script><style>.page-title{background:var(--color-highlight);padding:.5em;font-size:1.2em}</style><script data-website-id="6031aa47-e715-4f87-a99a-9e3046e5dcdc" defer="" src="https://n
因为是范围指定,所以看起来即使不是从开头也可以。
$ curl -H "Range: bytes=1025-1025" https://soulminingrig.com/
o
甚至1字节也能正确返回。
实际应用中
只需在请求头信息中添加范围,就可以在获取时进行范围限制,这基本上适用于任何语言,最重要的是,它能实现对网络带宽的环保使用,而这通常不被人们所关注。
如果只想提取HTML的<head>部分,可以指定Range: bytes=0-4096;如果不行,就获取全部,或者为了更环保,可以以4096字节为单位发送下一个范围的Get请求。
最终,后续处理库提取HTML标签的时间也会缩短,并且对目标服务器也更友好。
但是,正如MDN网站上所说,
“确认服务器是否支持部分请求”如果假设现在大多数地方都支持,那是不好的,如果想严格执行,就必须使用从请求头返回的信息进行判断的条件。
然而,新的互联网帝王...
如果使用以NET为股票代码的CloudFlare,它仿佛在宣称自己是新的互联网之王,但由于它似乎会按请求单位进行限制,所以即使处理速度加快了,如果中途因为DDoS防护而被阻止,最终感觉意义也不大。
但是,例如在VPS上运行某个Bot时,如果它大量占用外部请求的带宽(尽管可能没有多少人会用到这种程度),那么像这次这样的部分请求可能就会有效果。
然而,HTTP请求的内容应该会存储在内存空间中,所以多少也能减少内存使用量,因此,如果有人想制作获取网站信息的工具,加入这个功能也能让对目标服务器的操作稍微友好一些,所以有必要根据需要进行。
这便是关于HTTP的一些事情,看似知道,实则不经意间忽略了。