基于urllib.request封装http协议类

by:授客QQ1033553122

测试环境:

Python版本:Python 3.3

 

代码实践

#!/usr/bin/env python
# -*- coding:utf-8 -*-
 
__author__ = 'shouke'
 
import urllib.request
import http.cookiejar
import urllib.parse
 
class MyHttp:
    '''配置要测试请求服务器的ip、端口、域名等信息,封装http请求方法,http头设置'''
 
    def __init__(self, protocol, host, port, header = {}):
       # 从配置文件中读取接口服务器IP、域名,端口
        self.protocol = protocol
        self.host = host
        self.port = port
        self.headers = header  # http 
 
        #install cookie #自动管理cookie
        cj = http.cookiejar.CookieJar()
        opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))
        urllib.request.install_opener(opener)
 
    def set_host(self, host):
        self.host = host
 
    def get_host(self):
        return self.host
 
    def get_protocol(self):
        return self.protocol
 
    def set_port(self, port):
        self.port = port
 
    def get_port(self):
        return  self.port
 
    # 设置http
    def set_header(self, headers):
        self.headers = headers
 
    # 封装HTTP GET请求方法
    def get(self, url, params=''):
        url = self.protocol + '://' + self.host + ':' + str(self.port)  + url + params
 
        print('发起的请求为:%s' % url)
        request = urllib.request.Request(url, headers=self.headers)
        try:
            response = urllib.request.urlopen(request)
            response = response.read()
            return response
        except Exception as e:
            print('发送请求失败,原因:%s' % e)
            return None
 
    # 封装HTTP POST请求方法
    def post(self, url, data=''):
        url = self.protocol + '://' + self.host + ':' + str(self.port)  + url
 
        print('发起的请求为:%s' % url)
        request = urllib.request.Request(url, headers=self.headers)
        try:
            response = urllib.request.urlopen(request, data)
            response = response.read()
            return response
        except Exception as e:
            print('发送请求失败,原因:%s' % e)
            return None
 
    # 封装HTTP xxx请求方法
    # 自由扩展

案例1:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
 
__author__ = 'shouke'
 
from httpprotocol import MyHttp
 
if __name__ == '__main__':
    http = MyHttp('https', 'www.baifubao.com', 443)
    params = {"cmd":1059,"callback":"phone", "phone":"15850781443"}
    params = urllib.parse.urlencode(params)
response = http.get('/callback?', params)
print(response)
 
输出response内容如下:

b'phone({"meta":{"result":"0","result_info":"","jump_url":""},"data":{"operator":"\\u79fb\\u52a8","area":"\\u6c5f\\u82cf","area_operator":"\\u6c5f\\u82cf\\u79fb\\u52a8","support_price":{"100":"115","500":"507","1000":"1000","2000":"2000","3000":"2996","5000":"4994","10000":"9989","20000":"19979","30000":"29969","50000":"49948"}}})'

如上,返回Unicode编码的数据:“"\\u79fb\\u52a8",……”,

解决方法:输出前先解码,如下
response = response.decode('unicode_escape')
print(response)

解码后的输出如下:

phone({"meta":{"result":"0","result_info":"","jump_url":""},"data":{"operator":"移动","area":"江苏","area_operator":"江苏移动","support_price":{"100":"115","500":"507","1000":"1000","2000":"2000","3000":"2996","5000":"4994","10000":"9989","20000":"19979","30000":"29969","50000":"49948"}}})

案例2:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
 
__author__ = 'shouke'
 
from httpprotocol import MyHttp
 
if __name__ == '__main__':
     http = MyHttp('http', 'www.webxml.com.cn', 80)    #
header = {'Content-Type':'text/xml','charset':'utf-8'}
http.set_header(header)
    

     params = '''<soapenv:Envelope


xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"  xmlns:web="http://WebXml.com.cn/">


<soapenv:Header/>


<soapenv:Body>


<web:getSupportProvince/>


</soapenv:Body>


</soapenv:Envelope>'''


params = params.encode(encoding='UTF-8')
     response = http.post('/WebServices/WeatherWebService.asmx?', params)
     print(response)

说明:

1、params = params.encode(encoding='UTF-8') # 如果未添加该行代码,会报错如下:

POST data should be bytes or an iterable of bytes. It cannot be of type str.

2、
header = {'Content-Type':'text/xml','charset':'utf-8'}
http.set_header(header)
以上两行代码,为请求添加请求头,如果未添加,则会报错,如下:

HTTP Error 415: Unsupported Media Type

3、输出response,部分内容如下:
\xe7\x9b\xb4\xe8\xbe\x96\xe5\xb8\x82\xe7\x89\xb9\xe5\x88\xab\xe8\xa1\x8c\xe6\x94\xbf\xe5\x8c\xba……
 
如上,返回十六进制(\x表示16进制)的字符e7,9b等
解决方法:输出前先解码,如下
response = response.decode('utf-8')
print(response)
 
解码后的输出结果:
直辖市特别行政区……
 
案例3:
import json
 
from httpprotocol import MyHttp
 
if __name__ == '__main__':
http = MyHttp('http', 'info.so.360.cn', 80)
header = {'Content-Type':'application/x-www-form-urlencoded','charset':'utf-8'}
http = MyHttp('http', 'info.so.360.cn', 80)
http.set_header(header)
 
    url = '/index.php?g=Embody&m=Index&a=submit'
    parmas = '{"websitetype":"博客论坛","url":"http://blog.sina.com.cn/ishouke","email":"1033553122@40qq.com","checkcode":"rkqj"}'
    parmas = parmas.encode('utf-8')
    response = http.post(url,parmas)
    print(response.decode('utf-8'))
 
说明:如果服务器支持的内容类型(‘Content-Type’)为json则要修改请求头,如下
header = {'Content-Type':'application/json','charset':'utf-8'}
 

Python 基于urllib.request封装http协议类的更多相关文章

  1. Python Spider - urllib.request

    import urllib.request import urllib.parse import json proxy_support = urllib.request.ProxyHandler({' ...

  2. python之urllib.request.urlopen(url)报错urllib.error.HTTPError: HTTP Error 403: Forbidden处理及引申浏览器User Agent处理

    最近在跟着院内大神学习python的过程中,发现使用urllib.request.urlopen(url)请求服务器是报错: 在园子里找原因,发现原因为: 只会收到一个单纯的对于该页面访问的请求,但是 ...

  3. 通过python的urllib.request库来爬取一只猫

    我们实验的网站很简单,就是一个关于猫的图片的网站:http://placekitten.com 代码如下: import urllib.request respond = urllib.request ...

  4. python爬虫 - Urllib库及cookie的使用

    http://blog.csdn.net/pipisorry/article/details/47905781 lz提示一点,python3中urllib包括了py2中的urllib+urllib2. ...

  5. python爬虫---urllib库的基本用法

    urllib是python自带的请求库,各种功能相比较之下也是比较完备的,urllib库包含了一下四个模块: urllib.request   请求模块 urllib.error   异常处理模块 u ...

  6. python基于http协议编程:httplib,urllib和urllib2<转>

    httplib实现了HTTP和HTTPS的客户端协议,一般不直接使用,在python更高层的封装模块中(urllib,urllib2)使用了它的http实现. httplib.HTTPConnecti ...

  7. 基于小程序请求接口 wx.request 封装的类 axios 请求

    基于小程序请求接口 wx.request 封装的类 axios 请求 Introduction wx.request 的配置.axios 的调用方式 源码戳我 feature 支持 wx.reques ...

  8. Python urllib Request 用法

    转载自:https://blog.csdn.net/ywy0ywy/article/details/52733839 python2.7 httplib, urllib, urllib2, reque ...

  9. python中urllib, urllib2,urllib3, httplib,httplib2, request的区别

    permike原文python中urllib, urllib2,urllib3, httplib,httplib2, request的区别 若只使用python3.X, 下面可以不看了, 记住有个ur ...

随机推荐

  1. Swift5 语言指南(五) 基本运算符

    一个运营商是一个特殊的符号,或者你使用来检查,更改或合并值的短语.例如,加法运算符(+)添加两个数字,如,和逻辑AND运算符()组合两个布尔值,如.let i = 1 + 2&&if  ...

  2. HoloLens开发手记-凝视 Gaze

    在全息应用中,凝视是第一种输入形式,被用于定位物体(功能和PC的光标指针类似).凝视告诉你用户正在看向世界中的位置,让你能够确定他们的意图.在现实世界中,你通常会盯着你打算与之交互的物体.这种方式与凝 ...

  3. 记Booking.com iOS开发岗位线上笔试

    今晚参加了Booking的iOS职位线上笔试,结束后方能简单归纳一下. 关于测试内容: Booking采用了HackerRank作为测试平台,测试总时长为75分钟,总计4道题. 测试之前我很紧张,因为 ...

  4. Eruda 一个被人遗忘的调试神器

    Eruda 一个被人遗忘的调试神器 引言   日常工作中再牛逼的大佬都不敢说自己的代码是完全没有问题的,既然有问题,那就也就有调试,说到调试工具,大家可能对于 fiddler.Charles.chro ...

  5. Rpc简单入门

    RPC这个概念大家都应该很熟悉了,这里不在累述了:使用场景可以参考这篇,本篇主要分享下Thrift和Grpc在.Net Core环境下使用入门.Thirft或者Grps 都支持跨语言.跨平台的Rpc框 ...

  6. Linux编程 5 (目录重命名与移动mv,删除文件rm,目录创建mkdir删除rmdir,查看file,cat,more,tail,head)

    一. 文件重命名与移动(mv) 在linux中,重命名文件称为移动(moving).mv命令可以将文件和目录移动到另一个位置或重新命名. 1.1 使用mv重命名 下面在/usr/local下面创建一个 ...

  7. Android Studio中设置一个按钮的不同点击触发事件

    my_day_model = (RelativeLayout) v.findViewById(R.id.my_day_model);my_day_pic = (ImageView) v.findVie ...

  8. 当Elasticsearch遇见Kafka

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由michelmu发表于云+社区专栏 Elasticsearch作为当前主流的全文检索引擎,除了强大的全文检索能力和高扩展性之外,对多种 ...

  9. APUE习题3.2用dup实现dup2以及shell中重定向符号的使用

    习题3.2的要求是不使用fcntl()而编写一个同dup2()功能相同的函数.直觉上是不断使用dup()直到返回指定的文件描述符. #include <stdio.h>#include & ...

  10. 升级mac Mojave系统,git无法使用

    升级mac Mojave系统后 无法使用git,出现如下问题 xcrun: error: invalid active developer path (/Library/Developer/Comma ...