一个相对完整的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. linux 备份与恢复

  2. Django学习手册 - ORM 外键

    Django 外键创建 关键语法: models.ForeignKey("UserGroup",to_field="gid",default=1,on_dele ...

  3. BootStrap表单验证用户名重复

    html: <div class="form-group"> <label for="username" class="contro ...

  4. Sql server—— for xml path简单用法(可以按照分组把相同组的列中的不同的值,像字符串一样拼接在一起显示在分组之后的列中。)

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAI8AAACWCAIAAABo2EyXAAAKeklEQVR4nO2dy27rNh7G+U7CFIrfZX

  5. 【转】python包导入细节

    [转]python包导入细节 包导入格式 导入模块时除了使用模块名进行导入,还可以使用目录名进行导入.例如,在sys.path路径下,有一个dir1/dir2/mod.py模块,那么在任意位置处都可以 ...

  6. Keepalived详解(五):Keepalived集群中MASTER和BACKUP角色选举策略【转】

    一.Keepalived集群中MASTER和BACKUP角色选举策略 在keepalived集群中,其实并没有严格意义上的主.备节点,虽然可以在keepalived配置文件中设置state选项为MAS ...

  7. ES6学习笔记八(module模块export)

    1.导出export,导入import组合 知识点1:导出export lesson2.js export let A=; export function test(){ console.log('t ...

  8. vsftp、ftps 搭建

    今天公司某个产品预上线,该产品需要向政府某部门提供一些数据. 该部门提交数据需要使用ftps,苦逼的我只能是测试环境搭建一套,用来测试提交数据. 先自行科普下ftps. 一.搭建vsftp 安装vsf ...

  9. Android Day1

    [2013-10-04 9:49]  复习第一课. Building Your First App; 1.安装好SDK 后,启动Eclipse,新建一个Android工程.设置使用默认. 2.检查文件 ...

  10. 026_nginx引用lua遇到的坑

    server { listen 80; listen 443 ssl; server_name www.jyall.com; access_log /data/log/nginx/*.www.jyal ...