我们有一个提供.txt文件的服务器,基本上,一些日志文件会随着时间的推移而增长。当我使用urllib2GET发送到服务器r = urllib2.urlopen('http://example.com')时,响应的标头将是:

Date: XXX
Server: Apache
Last-Modified: XXX
Accept-Ranges: bytes
Content-Length: 12345678
Vary: Accept-Encoding
Connection: close
Content-Type: text/plain


而如果r = requests.get('http://example.com')

Content-Encoding: gzip
Accept-Ranges: bytes
Vary: Accept-Encoding
Keep-alive: timeout=5, max=128
Last-Modified: XXX
Connection: Keep-Alive
ETag: xxxxxxxxx
Content-Type: text/plain


第二个响应与我使用chrome开发工具得到的结果相同。那么为什么两者不同?我需要Content-Length标头来确定每次需要下载多少字节,因为文件可能会变得很大。

编辑:
使用httpbin.org/get进行测试:

urllib2响应:

{u'args': {},
 u'headers': {u'Accept-Encoding': u'identity',
              u'Host': u'httpbin.org',
              u'User-Agent': u'Python-urllib/2.7'},
 u'origin': u'ip',
 u'url': u'http://httpbin.org/get'}


响应头:

Server: nginx
Date: Sat, 14 Jan 2017 07:41:16 GMT
Content-Type: application/json
Content-Length: 207
Connection: close
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true


要求回复:

{u'args': {},
 u'headers': {u'Accept': u'*/*',
              u'Accept-Encoding': u'gzip, deflate',
              u'Host': u'httpbin.org',
              u'User-Agent': u'python-requests/2.11.1'},
 u'origin': u'ip',
 u'url': u'http://httpbin.org/get'}


响应头:

Server : nginx
Date : Sat, 14 Jan 2017 07:42:39 GMT
Content-Type : application/json
Content-Length : 239
Connection : keep-alive
Access-Control-Allow-Origin : *
Access-Control-Allow-Credentials : true

最佳答案

引用Lukasa在github:


  响应不同,因为请求表明它支持
  通过发送接受编码的gzip编码主体:gzip,deflate
  标头字段。 urllib2没有。您会发现是否添加了该标题
  到urllib2请求中,您将获得新的行为。
  
  显然,在这种情况下,服务器会动态gzip
  回应。这意味着它不知道响应会持续多长时间,
  因此它使用分块传输编码进行发送。
  
  如果确实必须获取Content-Length标头,则应添加
  您的请求请求的以下标头:{'Accept-Encoding':
  'identity'}。

关于python - 连接到同一主机时,Python请求和urllib2获得不同的头,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41647673/

10-13 08:07