一个相对完整的http请求,输入ip和端口,输出响应码,响应头,响应体,是否超时,以及出错时的错误信息

处理包括:

1.协议处理,如果是443用https,其他用http

2.HTTPError处理,HTTPError一般是401,403,404之类的错误,虽然报错,但是也有响应头。注意获取错误信息时要用str(e),其他的比如repr(e)得到的不是字符串,e.read()是响应体,不是错误原因

3.URLError处理,一般是Connection refused之类的错误。注意获取错误信息时要用str(e.reason)

4.响应体gzip解压

5.响应体编码转换

# coding=utf8

import urllib2
import chardet
import traceback
import StringIO
import re
import gzip def plugin_homepage(data, timeout):
ip = data["ip"]
port = data["port"]
if port == 443:
url = "https://%s:%s/" % (ip, port)
else:
url = "http://%s:%s/" % (ip, port)
is_timeout, error_reason, code, header, body, title = get_html(url, timeout)
res = {"ip": ip,
"port": port,
"rsp_header": header,
"rsp_body": body,
"code": code,
"title": title,
"is_timeout": is_timeout,
"error_reason": error_reason}
return res def get_html(url, timeout):
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
headers = {'User-Agent': user_agent}
is_timeout = False
error_reason = None
code = None
header = None
body = None
title = None
try:
request = urllib2.Request(url, headers=headers)
response = urllib2.urlopen(request, timeout=timeout)
code = response.getcode()
body = response.read()
header = str(response.headers)
except urllib2.HTTPError, e: # 处理http错误
# print "str(e):%s\nrepr(e):%s\ne:%s\ne.read():%s\n" % (str(e), repr(e), e, e.read())
error_reason = str(e)
body = e.read()
header = e.headers
except urllib2.URLError, e:
print traceback.print_exc()
error_reason = str(e.reason)
if error_reason == "timed out": # 判断是否超时
is_timeout = True
return is_timeout, error_reason, code, header, body, title
except Exception, e:
print traceback.print_exc()
error_reason = str(e)
return is_timeout, error_reason, code, header, body, title
if not header:
return is_timeout, error_reason, code, header, body, title
# 解压gzip
if 'Content-Encoding' in header and 'gzip' in header['Content-Encoding']:
html_data = StringIO.StringIO(body)
gz = gzip.GzipFile(fileobj=html_data)
body = gz.read()
# 编码转换
try:
html_encode = get_encode(header, body).strip()
if html_encode and len(html_encode) < 12:
body = body.decode(html_encode).encode('utf-8')
except:
pass
# 获取title
try:
title = re.search(r'<title>(.*?)</title>', body, flags=re.I | re.M)
if title:
title = title.group(1)
except:
pass
return is_timeout, error_reason, code, str(header), body, title # 获取html编码
def get_encode(header, body):
try:
m = re.search(r'<meta.*?charset=(.*?)"(>| |/)', body, flags=re.I)
if m:
return m.group(1).replace('"', '')
except:
pass
try:
if 'Content-Type' in header:
Content_Type = header['Content-Type']
m = re.search(r'.*?charset=(.*?)(;|$)', Content_Type, flags=re.I)
if m:
return m.group(1)
except:
pass
chardit1 = chardet.detect(body)
encode_method = chardit1['encoding']
return encode_method if __name__ == "__main__":
data = {"ip": "127.0.0.1", "port": 80}
res = plugin_homepage(data, 3)
print res

【python】获取http响应的更多相关文章

  1. python获取url响应

    前言 requests发请求时,接口的响应时间,也是我们需要关注的一个点,如果响应时间太长,也是不合理的.如果服务端没及时响应,也不能一直等着,可以设置一个timeout超时的时间 关于request ...

  2. Python+requests 发送简单请求--》获取响应状态--》获取请求响应数据

    Python+requests 发送简单请求-->获取响应状态-->获取请求响应数据 1.环境:安装了Python和vscode编译器(Python自带的编译器也ok).fiddler抓包 ...

  3. python获取响应某个字段值的三种方法

    近期将要对两个接口进行测试,第一个接口的响应值是第二个接口的查询条件.为了一劳永逸,打算写个自动化测试框架.因为请求和响应都是xml格式的,遇到的问题就是怎么获取xml响应的某一个值.尝试了很多博客的 ...

  4. python获取网络时间和本地时间

    今天我们来看一下如何用python获取网络时间和本地时间,直接上代码吧,代码中都有注释. python获取网络时间 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...

  5. urllib的实现---timeout,获取http响应码,重定向,proxy的设置

    1.Timeout设置超时 只能修改Socket设置全局Timeout #! /usr/bin/env python3 import socket import urllib.request # ti ...

  6. Java学习-055-Jsoup爬虫通过设置获取响应数据大小的最大值,解决因默认获取 1MB 响应数据导致的无法获取全部的响应数据内容问题

    在日常工作中,通常会遇到获取各种网络数据使用的情况,Java中可使用Jsoup(Python中可使用 BeatifulSoup)进行数据的获取及处理. 今天有朋友问,在使用 Jsoup 进行请求数据时 ...

  7. python+requests 请求响应文本出错返回“登录超时”

    Python+requests请求响应:"msg":"登录过时" 1.出错原代码: import requests import json#页面按条件搜索返回相 ...

  8. 使用shell/python获取hostname/fqdn释疑

    一直以来被Linux的hostname和fqdn(Fully Qualified Domain Name)困惑了好久,今天专门抽时间把它们的使用细节弄清了. 一.设置hostname/fqdn 在Li ...

  9. python 获取日期

    转载   原文:python 获取日期 作者:m4774411wang python 获取日期我们需要用到time模块,比如time.strftime方法 time.strftime('%Y-%m-% ...

  10. python获取字母在字母表对应位置的几种方法及性能对比较

    python获取字母在字母表对应位置的几种方法及性能对比较 某些情况下要求我们查出字母在字母表中的顺序,A = 1,B = 2 , C = 3, 以此类推,比如这道题目 https://project ...

随机推荐

  1. centos7 五大查找常用命令

    1.find find是最常见和最强大的查找命令,你可以用它找到任何你想找的文件. find的使用格式如下: $ find <指定目录> <指定条件> <指定动作> ...

  2. ES6走一波 Proxy/Reflect

    Proxy:像拦截器,对目标对象修改等进行拦截,是一种元编程(meta programming),即修改JS语言本身. //生成proxy实例,两个参数都是对象,targetObj是要拦截的目标对象, ...

  3. chrome性能分析

    Chrome开发者工具之JavaScript内存分析 前端性能优化 —— 前端性能分析 Chrome DevTools - 性能监控

  4. Spring如何支持可扩展

    Spring是一款优秀的开发框架,包括了非常多的基础组件 那么它是如何做到灵活可扩展呢? 1 .框架初始化 2.Bean初始化 ref https://mp.weixin.qq.com/s/QuSls ...

  5. HashSet去除List重复元素

    使用Hashset 去重复 例一,List<String> 去重复 public class main { public static void main(String[] args) { ...

  6. python3-深浅copy

    转载:https://www.cnblogs.com/ctztake/p/8194275.html 术语 变量:是一个系统表的元素,拥有指向对象的连接空间. 对象:被分配的一块内存,存储其所代表的值. ...

  7. dubbo源码分析3——SPI机制中的ExtensionLoader类的objectFactory属性分析

    ExtensionLoader类是整个SPI的核心类,每个SPI都会对应一个ExtensionLoader类实例,这个类的构造方法如下: private ExtensionLoader(Class&l ...

  8. SharePoint 2013: Workflow Manager Backend 服务意外地终止

    一.环境:SharePoint 2013 + Workflow Manager 1.0 二.错误描述: Workflow Manager Backend 服务意外地终止,这种情况已经出现了 42106 ...

  9. Vue 实战项目开发流程

    一 基础配备 ## 一.环境搭建 #### 1.安装node - 去[官网](https://nodejs.org/zh-cn/)下载node安装包 - 傻瓜式安装 - 万一安装后终端没有node环境 ...

  10. (并发编程)RLock(与死锁现象),Semaphore,Even事件,线程Queue

    一.死锁现象与递归锁所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在 ...