python http请求与响应

python urllib包

python内置了urllib包来处理http请求,主要是一下几个模块:

名称功能
urllib.error处理异常模块
urllib.parse解析url模块
urllib.request请求url模块
urllib.response响应模块
urllib.robotparser解析 robots.txt文件

主要方法

  • urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
    打开url或者对象

get请求

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import urllib
# import urllib2 # python3中没有 urllib2 用urllib.request替代

# get请求
resu = urllib.request.urlopen('https://hao.360.cn', data=None, timeout=10)
data = resu.read().decode()

#打开文件
fo = open('test.txt','a+',encoding = 'utf-8') # 打开文件 这里网络数据流的编码需要和写入的文件编码一致
fo.write(data)   # 写入文件
fo.close()       # 关闭文件

如果get的请求携带参数需要通过url方式传值

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import urllib
import json

def getExpressInfo(num):
    """
    通过快递单号获取快递详情方法
    :param num: Numbers 快递单号
    :return: mixed      快递详细
    """
    # get请求
    url = 'http://www.kuaidi100.com/autonumber/autoComNum?text=' + num # get请求通过url传值
    basicInfo = urllib.request.urlopen(url, data=None, timeout=10) # python3应该可以通过检测data是否携带参数来判断是get请求还是post请求
    data = json.loads(basicInfo.read().decode()) #解析返回对象获取

    comInfo = data['auto'][0]['comCode'] # 获取快递公司信息

    # 通过公司名称和快递单号请求快速100的API
    url2 = 'http://api.kuaidi100.com/api?id=be2205c7c55b54eb&com=' + comInfo + '&nu=' + num
    result = urllib.request.urlopen(url2, data=None, timeout=10)
    expressInfo = result.read().decode()

    print(expressInfo)
    #返回快递信息
    return(expressInfo)


num = '280688688407' # 快递单号

#调用快递信息方法
getExpressInfo(num)

post请求

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import urllib
import json

url = 'http://www.daily.com/ABC/ABC/ABC'
values = {
            "abc":"XXXXX",
            "efg":"XXXXX"
            }

headers = {'Content-Type': 'application/json'} # 设置请求头 告诉服务器请求携带的是json格式的数据
request = urllib.request.Request(url=url, headers=headers, data=json.dumps(values).encode(encoding='UTF8')) # 需要通过encode设置编码 要不会报错

response = urllib.request.urlopen(request) # 发送请求

logInfo = response.read().decode() # 读取对象 将返回的二进制数据转成string类型
print(logInfo)

备注:以上的是针对python3.5版本的,python2.7所使用的模块有很大的区别
(模块的源码没详细看,写的不对的地方,高手莫喷,多多指导!)

    原文作者:张老三168
    原文地址: https://www.jianshu.com/p/9a9dd097d282
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞