是否可以在C#/ python或其他任何内容中仅检索指定URL的选定部分,以减少网络流量。
例如: 我想抓一个网站,让我们说一千个网址要处理,但我只需要一小部分网页(跳到100并下载200字节)。
答案 0 :(得分:2)
读取部分 small实际上会增加网络流量(以及服务器负载)。对于您的用例,如果您真的只想要每个资源中的一个范围,您可能需要请求Range: bytes=0-1024
,并使用流API来停止以1024字节读取(并关闭套接字),即使您获得了整个文件,并手动选出你得到的字节[100:300]
。
但有些情况下绝对值得这样做。假设您试图读取200MB文件的第2和第54兆字节;你不想只读1%的全部200MB,对吧?
简单版本如下:您在请求中发送Range
标头。你可能会回来:
Content-Range
响应,只有您想要的字体。Content-Range
表示您应该要求的内容。如果您想提前了解406您的请求是否满意,您应该HEAD
请求获取Content-Length
和Accept-Ranges
标头。但请注意,这些都不是必需的。
另外,请注意,某些服务器处理简单的范围请求,但不是所需的全部规范。因此,虽然看起来像在单个请求中获取两个范围可能比产生两个请求有一些开销,但它也可能增加回落到整个文件的机会,因此可能不值得这样做。
无论如何,我不知道任何使这一切都完全无关紧要的库,但任何中级HTTP库(包括Python stdlib和.NET中内置的库)都应该使这相对容易。我将以交互方式在Python中使用第三方requests
库展示一个示例:
>>> import requests
>>> url = 'http://example.com'
>>> h = requests.head(url)
>>> h.headers['Accept-Ranges']
'bytes'
>>> h.headers['Content-Length']
'1270'
>>> r = requests.get(url, headers={'Range': 'bytes=500-600'})
>>> r.status_code
206
>>> r.headers['Content-Range']
500-600/1270
>>> len(r.text)
101
>>> r.text
' 5em auto;\n padding: 50px;\n background-color: #fff;\n border-radius: 1em;\n }\n '
请注意,HTTP范围已关闭 - 即Bytes: 500-600
包括500和600,因此它长101,而Python range(500, 600)
只有100长。在这里很容易搞到一个错误。