Python 仅获取响应头, 不获取实体的实例


Posted in Python onAugust 21, 2019

Python Just get Response Headers, not get content.

1. Use HEAD method

>>> import requests
>>> res = requests.head("http://www.baidu.com/")
>>> req.head("https://www.baidu.com/").headers
{'Content-Encoding': 'gzip', 'Server': 'bfe/1.0.8.18', 'Last-Modified': 'Mon, 13 Jun 2016 02:50:08 GMT', 'Connection': 'Keep-Alive', 'Pragma': 'no-cache', 'Cache-Control': 'private, no-cache, no-store, proxy-revalidate, no-transform', 'Date': 'Fri, 13 Oct 2017 04:36:20 GMT', 'Content-Type': 'text/html'}
>>> res.ok
True
>>> res.content
''
# 但是会遇到一些问题, 比如, 服务器不支持 HEAD, 或者拒绝 HEAD.
# 如下情况就被拒绝
#
>>> res = req.head("https://www.douban.com/subject/1/")
>>> res
<Response [403]>
>>> res.ok
False
>>> res.content
''
>>> res.headers
{'Content-Encoding': 'gzip', 'Keep-Alive': 'timeout=30', 'Server': 'dae', 'Connection': 'keep-alive', 'Date': 'Fri, 13 Oct 2017 04:39:00 GMT', 'Content-Type': 'text/html'}

不是很通用, 因为有些服务器不支持.

2. Use urllib

import urllib
>>> res = urllib.urlopen("http://127.0.0.1:8000/git.exe")
>>> res.url
'http://127.0.0.1:8000/git.exe'
>>> res.headers.headers
['Server: SimpleHTTP/0.6 Python/2.7.10\r\n', 'Date: Fri, 13 Oct 2017 06:06:37 GMT\r\n', 'Content-type: application/x-msdownload\r\n', 'Content-Length: 7569408\r\n', 'Last-Modified: Fri, 16 Dec 2016 07:09:32 GMT\r\n']
>>> len(r.read())
7569408
# urllib 只有在调用 read/readline/readlines 的时候才会从 web 服务器读取数据.
# 源码可以在 urllib/httplib 中找到. 
# urllib.py
def urlopen(url, ...):
 opener = FancyURLopener()
 return opener.open(url)
class FancyURLopener(URLopener).open():
 getattr(self, name)(url)
class URLopener.open_http():
 errcode, errmsg, headers = h.getreply()
 if(200 <= errcode < 300):
  return addinfourl(fp, headers, "http:" + url, errcode)
 else:
  if data is None:
   return self.http_error(url, fp, errcode, errmsg, headers)
  else:
   return self.http_error(url, fp, errcode, errmsg, headers, data)
class URLopener.http_error():
 return method(url, fp, errcode, errmsg, headers)
class FancyURLopener.http_error_default():
 return addinfourl(fp, headers, "http:" + url, errcode)
class addinfourl(addbase):
 # 代码中并没有对 fp 做任何操作,包括读写. 
class addbase.__init __():
 self.fp = fp
 self.read = self.fp.read
 self.readline = self.fp.readline
 if hasattr(self.fp, "readlines"): self.readlines = self.fp.readlines
  self.fileno = self.fp.fileno
 # ... ...

可以看到, urllib.open 最终返回了 addbase, addbase 中没有对 socket 做任务处理, 不会有任何读写. 之后显示调用 read/readline/readlines, 才会从 web 服务器读取数据.

图 1. 初始化网络.

Python 仅获取响应头, 不获取实体的实例

图 2. urlopen() 之后

Python 仅获取响应头, 不获取实体的实例

图 3. read() 之后

Python 仅获取响应头, 不获取实体的实例

3. Use socket

看过 urllib 之后, 可以使用 socket 写一个方法, 只获取 header.

import socket
import ssl


_timeout = 10
socket.setdefaulttimeout(_timeout)

def get_header(host, port=80, uri="/", method="GET", user_ssl=False):
 # 这里可以再扩充一下, 支持 headers
 conn = None
 header = """%s %s HTTP/1.1\r\nHost: %s\r\nConnection: close\r\nUser-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36\r\n\r\n""" % (
  method, uri, host)
 if user_ssl:
  ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
  _socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  conn = ssl_context.wrap_socket(_socket, server_hostname=host)
  conn.connect((host, port))
  conn.send(header)
 else:
  conn = socket.create_connection((host, port), _timeout)
  conn.sendall(header)
 text = ""
 while True:
  if "\r\n\r\n" in text:
   break
  buff = conn.recv(10)
  text += buff
  # print buff
 conn.close()
 return text.split("\r\n\r\n")[0]

if __name__ == '__main__':
 print get_header("www.douban.com", uri="/subject/27076001/")
 print
 print get_header("www.douban.com", uri="/subject/27076001/", port=443, user_ssl=True)
➜ 76[14:48:20]zhipeng@zhipeng-MacBook ~/demo/python
�� $ python test_header.py
HTTP/1.1 301 Moved Permanently
Date: Fri, 13 Oct 2017 06:48:23 GMT
Content-Type: text/html
Content-Length: 178
Connection: close
Location: https://www.douban.com/subject/27076001/
Server: dae

HTTP/1.1 302 Moved Temporarily
Server: ADSSERVER/45863
Date: Fri, 13 Oct 2017 06:48:23 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: close
Location: https://sec.douban.com/b?r=https%3A%2F%2Fwww.douban.com%2Fsubject%2F27076001%2F
Strict-Transport-Security: max-age=15552000;
Set-Cookie: __ads_session=uY8l3pLW/AjCKJ8Y4wA=; domain=.douban.com; path=/
X-Powered-By-ADS: uni-jnads-1-02
➜ 77[14:48:23]zhipeng@zhipeng-MacBook ~/demo/python 
�� $

参考

<< Python socket server handle HTTPS request >> (https://stackoverflow.com/questions/32062925/python-socket-server-handle-https-request)

以上这篇Python 仅获取响应头, 不获取实体的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Django内容增加富文本功能的实例
Oct 17 Python
使用Python处理BAM的方法
Sep 28 Python
Pycharm取消py脚本中SQL识别的方法
Nov 29 Python
我喜欢你 抖音表白程序python版
Apr 07 Python
python实现kNN算法识别手写体数字的示例代码
Aug 16 Python
PyTorch 普通卷积和空洞卷积实例
Jan 07 Python
Python 中的pygame安装与配置教程详解
Feb 10 Python
python批量替换文件名中的共同字符实例
Mar 05 Python
利用pandas向一个csv文件追加写入数据的实现示例
Apr 23 Python
jupyter notebook远程访问不了的问题解决方法
Jan 11 Python
python实现scrapy爬虫每天定时抓取数据的示例代码
Jan 27 Python
Python 匹配文本并在其上一行追加文本
May 11 Python
详解用Python为直方图绘制拟合曲线的两种方法
Aug 21 #Python
Python 使用指定的网卡发送HTTP请求的实例
Aug 21 #Python
Python turtle绘画象棋棋盘
Aug 21 #Python
Python随机函数库random的使用方法详解
Aug 21 #Python
Django+zTree构建组织架构树的方法
Aug 21 #Python
python的移位操作实现详解
Aug 21 #Python
基于Python的微信机器人开发 微信登录和获取好友列表实现解析
Aug 21 #Python
You might like
四月新番又没了,《Re:从零开始的异世界生活》第二季延期至7月播出
2020/05/06 日漫
php自动跳转中英文页面
2008/07/29 PHP
PHP数字和字符串ID互转函数(类似优酷ID)
2014/06/30 PHP
学习php设计模式 php实现观察者模式(Observer)
2015/12/09 PHP
php中替换字符串函数strtr()和str_repalce()的用法与区别
2016/11/25 PHP
extjs grid设置某列背景颜色和字体颜色的实现方法
2010/09/06 Javascript
JS将制定内容复制到剪切板示例代码
2014/02/11 Javascript
js 显示base64编码的二进制流网页图片
2014/04/04 Javascript
现代 JavaScript 开发编程风格Idiomatic.js指南中文版
2014/05/28 Javascript
node.js中的fs.symlinkSync方法使用说明
2014/12/15 Javascript
js+css实现tab菜单切换效果的方法
2015/01/20 Javascript
提升jQuery的性能需要做好七件事
2016/01/11 Javascript
JavaScript黑洞数字之运算路线查找算法(递归算法)实例
2016/01/28 Javascript
原生js仿jquery animate动画效果
2016/07/13 Javascript
jquery表单提交带错误信息提示效果
2017/03/09 Javascript
vue一步步实现alert功能
2017/07/05 Javascript
Vue用v-for给src属性赋值的方法
2018/03/03 Javascript
vue-next/runtime-core 源码阅读指南详解
2019/10/25 Javascript
浅谈React中组件逻辑复用的那些事儿
2020/05/21 Javascript
webpack4从0搭建组件库的实现
2020/11/29 Javascript
[43:47]DOTA2上海特级锦标赛主赛事日 - 4 败者组第四轮#2 MVP.Phx VS Fnatic第一局
2016/03/05 DOTA
详解Python中表达式i += x与i = i + x是否等价
2017/02/08 Python
python-itchat 统计微信群、好友数量,及原始消息数据的实例
2019/02/21 Python
python图片二值化提高识别率代码实例
2019/08/24 Python
Django--权限Permissions的例子
2019/08/28 Python
使用Numpy对特征中的异常值进行替换及条件替换方式
2020/06/08 Python
运动鞋中的劳斯莱斯:索康尼(SAUCONY)
2017/08/09 全球购物
法律专业推荐信范文
2013/11/29 职场文书
护理专业学生的求职信范文
2013/12/11 职场文书
销售找工作求职信
2013/12/20 职场文书
政协调研汇报材料
2014/08/15 职场文书
公司员工违纪检讨书
2015/05/05 职场文书
2015年圣诞节寄语
2015/08/17 职场文书
Springboot集成阿里云OSS上传文件系统教程
2021/06/28 Java/Android
Python读写yaml文件
2022/03/20 Python
MySql按时,天,周,月进行数据统计
2022/08/14 MySQL