为什么我能够在python 3 urllib.request中读取HEAD http请求?

埃里克

我想发出一个没有任何内容数据的HEAD请求,以节省带宽。我正在使用urllib.request但是,经过测试,似乎HEAD请求也获得了数据吗?这是怎么回事?

Python 3.4.2 (v3.4.2:ab2c023a9432, Oct  6 2014, 22:16:31) [MSC v.1600 64 bit (AM
D64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import urllib.request
>>> req = urllib.request.Request("http://www.google.com", method="HEAD")
>>> resp = urllib.request.urlopen(req)
>>> a = resp.read()
>>> len(a)
24088
马丁·彼得斯(Martijn Pieters)

http://www.google.comURL重定向

$ curl -D - -X HEAD http://www.google.com
HTTP/1.1 302 Found
Cache-Control: private
Content-Type: text/html; charset=UTF-8
Location: http://www.google.co.uk/?gfe_rd=cr&ei=A8sXVZLOGvHH8ge1jYKwDQ
Content-Length: 261
Date: Sun, 29 Mar 2015 09:50:59 GMT
Server: GFE/2.0
Alternate-Protocol: 80:quic,p=0.5

urllib.request已按照重定向进行,向该新位置发出GET请求:

>>> import urllib.request
>>> req = urllib.request.Request("http://www.google.com", method="HEAD")
>>> resp = urllib.request.urlopen(req)
>>> resp.url
'http://www.google.co.uk/?gfe_rd=cr&ei=ucoXVdfaJOTH8gf-voKwBw'

您必须构建自己的处理程序堆栈以防止这种情况;HTTPRedirectHandler发出HEAD方法操作它不够聪明,无法处理重定向改编自《如何防止Python的urllib(2)重定向到Python 3之后》中的Alan Duan的示例将为您提供:

import urllib.request

class NoRedirection(urllib.request.HTTPErrorProcessor):
    def http_response(self, request, response):
        return response
    https_response = http_response

opener = urllib.request.build_opener(NoRedirection)

req = urllib.request.Request("http://www.google.com", method="HEAD")
resp = opener.open(req)

您最好使用该requestsallow_redirects=False在使用requests.head()requests.Session().head()可调用对象时进行了显式设置,因此您可以在其中看到原始结果:

>>> import requests
>>> requests.head('http://www.google.com')
<Response [302]>
>>> _.headers['Location']
'http://www.google.co.uk/?gfe_rd=cr&ei=FcwXVbepMvHH8ge1jYKwDQ'

即使启用了重定向,该response.history列表也使您可以访问中间请求,并且也requests对重定向的调用使用正确的方法:

>>> response = requests.head('http://www.google.com', allow_redirects=True)
>>> response.url
'http://www.google.co.uk/?gfe_rd=cr&ei=8e0XVYfGMubH8gfJnoKoDQ'
>>> response.history
[<Response [302]>]
>>> response.history[0].url
'http://www.google.com/'
>>> response.request.method
'HEAD'

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

urllib2比python3中的请求慢吗

来自分类Dev

使用urllib3模块而不是python中的请求

来自分类Dev

Python 3 urllib vs请求性能

来自分类Dev

Python 3-带有urllib.request的POST请求返回HTML数据

来自分类Dev

Python 3-带有urllib.request的POST请求返回HTML数据

来自分类Dev

在 Python 3 中读取 HTTP 请求数据?

来自分类Dev

如何使用python 3构建对neutrinoapi的请求?(将urllib2请求转换为urllib)

来自分类Dev

urllib.error.HTTPError:HTTP 错误 400:Python 函数中的错误请求

来自分类Dev

python request / urllib3连接池未捕获HTTP错误

来自分类Dev

Python-使用Python 3 urllib发出POST请求

来自分类Dev

Python urllib请求多次

来自分类Dev

如何使用urlopen和urllib修复Python 3中的HTTP错误

来自分类Dev

urllib2.HTTPError:HTTP错误400:错误的请求-Python

来自分类Dev

发出http POST请求以使用Python urllib / urllib2上传文件

来自分类Dev

在Python中,为什么urllib.urlopen使Google给出http状态“ 302 Moved”?

来自分类Dev

HTTP请求可以在cURL中工作,但不能在urllib2.request中工作吗?

来自分类Dev

Python 3:urllib.request.urlopen和Progressbar

来自分类Dev

Python3 urllib.request不会立即关闭连接

来自分类Dev

将代理设置为urllib.request(Python3)

来自分类Dev

Python 3:urllib.request.urlopen和Progressbar

来自分类Dev

Python request.packages.urllib3.connection.VerifiedHTTPSConnection [Errno 11004]

来自分类Dev

Python3:Urllib.request无法正常工作

来自分类Dev

urllib3调试请求标头

来自分类Dev

Swift 3中的HTTP请求

来自分类Dev

在本地主机上使用请求或 urllib3 从 python 请求 servlet 时出错

来自分类Dev

如何在Python 3中解析原始HTTP请求?

来自分类Dev

python请求中的HTTP重定向代码3XX

来自分类Dev

Python 3中的http.client请求方法

来自分类Dev

Python 3.x 中异步 HTTP 请求的异常处理

Related 相关文章

  1. 1

    urllib2比python3中的请求慢吗

  2. 2

    使用urllib3模块而不是python中的请求

  3. 3

    Python 3 urllib vs请求性能

  4. 4

    Python 3-带有urllib.request的POST请求返回HTML数据

  5. 5

    Python 3-带有urllib.request的POST请求返回HTML数据

  6. 6

    在 Python 3 中读取 HTTP 请求数据?

  7. 7

    如何使用python 3构建对neutrinoapi的请求?(将urllib2请求转换为urllib)

  8. 8

    urllib.error.HTTPError:HTTP 错误 400:Python 函数中的错误请求

  9. 9

    python request / urllib3连接池未捕获HTTP错误

  10. 10

    Python-使用Python 3 urllib发出POST请求

  11. 11

    Python urllib请求多次

  12. 12

    如何使用urlopen和urllib修复Python 3中的HTTP错误

  13. 13

    urllib2.HTTPError:HTTP错误400:错误的请求-Python

  14. 14

    发出http POST请求以使用Python urllib / urllib2上传文件

  15. 15

    在Python中,为什么urllib.urlopen使Google给出http状态“ 302 Moved”?

  16. 16

    HTTP请求可以在cURL中工作,但不能在urllib2.request中工作吗?

  17. 17

    Python 3:urllib.request.urlopen和Progressbar

  18. 18

    Python3 urllib.request不会立即关闭连接

  19. 19

    将代理设置为urllib.request(Python3)

  20. 20

    Python 3:urllib.request.urlopen和Progressbar

  21. 21

    Python request.packages.urllib3.connection.VerifiedHTTPSConnection [Errno 11004]

  22. 22

    Python3:Urllib.request无法正常工作

  23. 23

    urllib3调试请求标头

  24. 24

    Swift 3中的HTTP请求

  25. 25

    在本地主机上使用请求或 urllib3 从 python 请求 servlet 时出错

  26. 26

    如何在Python 3中解析原始HTTP请求?

  27. 27

    python请求中的HTTP重定向代码3XX

  28. 28

    Python 3中的http.client请求方法

  29. 29

    Python 3.x 中异步 HTTP 请求的异常处理

热门标签

归档