Python之requests模块讲解

先看看requests的几种请求类型

  1. get请求:requests.get(‘url’)
  2. post请求:requests.post(“url/post”)
  3. put请求:requests.put(“url/put”)
  4. delete请求:requests.delete(“url/delete”)
  5. head请求:requests.head(“url/get”)
  6. options请求:requests.options(“url/get”)

Response对象使用.

GET 请求

  1. 发送无参数的get请求 设置超时时间 timeout 单位秒
r = requests.get('http://www.baidu.com', timeout=1)
# r.url                             #打印输出该 URL
# r.headers                         #以字典对象存储服务器响应头,但是这个字典比较特殊,字典键不区分大小写,若键不存在则返回None
# r.status_code                     #返回连接状态,200正常。
# r.text                            #默认以unicode形式返回网页内容,也就是网页源码的字符串。
# r.content                         #以字节形式(二进制)返回。字节方式的响应体,会自动为你解码 gzip 和 deflate 压缩。
# r.json()                          #把网页中的json数据转成字典并将其返回。
# r.encoding                        #获取当前的编码
# r.encoding = 'ISO-8859-1'         #指定编码,r.text返回的数据类型,写在r.text之前。
r = requests.get('http://www.baidu.com', timeout=1)
  1. 发送带参数的请求.
payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.get("https://www.baidu.com/", params=payload)
print(r.url)
#打印结果: https://www.baidu.com/?key2=value2&key1=value1

# 你还可以将一个列表作为值传入
payload = {'key1': 'value1', 'key2': ['value2', 'value3']}
r = requests.get('http://www.baidu.com/', params=payload)
print(r.url)
#打印结果:http://www.baidu.com/?key2=value2&key2=value3&key1=value1

  1. 定制请求头
url = 'https://www.baidu.com/s?wd=python'
headers = {
        'Content-Type': 'text/html;charset=utf-8',
        'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'
    }
r = requests.get(url,headers=headers)
  1. 会话保执
    经常很多请求只有在登录后才能进行,实现登录效果一般的做法是执行登录请求,然后从返回结果中提取sessionid放入自定义cookie中。
    这种方法在requests中也行得通,但requests提供了更为简单的方法,直接使用request.Session类来请求即可,其保持登录的原理是保留之前请求中服务端通过set-cookie等设置的参数。
s = Session()
url='http://docs.python-requests.org/en/master/'
# 所有方法和直接使用requests时一样用即可
s.get(url)
  1. 自定义Cookie
    实验发现如果自定义header中定义了cookies那么此处设置的cookies不生效
    headers 和 cookies 如果同时存在,会取headers里的值,cookies单独设置的则不会生效

headers = {
    'Content-Type': 'application/x-www-form-urlencoded',
    'Cookie': 'name=selfinheader'
}

cookies = {'name1': 'cookie1', 'name2': 'cookies2'}
github_url = 'http://docs.python-requests.org/en/master/'
r = requests.get(github_url, headers=headers, cookies=cookies)

POST 请求

HTTP 协议规定 POST 提交的数据必须放在消息主体(entity-body)中,但协议并没有规定数据必须使用什么编码方式,服务端通过是根据请求头中的Content-Type字段来获知请求中的消息主体是用何种方式进行编码,再对消息主体进行解析。具体的编码方式包括:

  1. 最常见post提交数据的方式,以form表单形式提交数据: application/x-www-form-urlencoded
  2. 以json串提交数据: application/json
  3. 一般使用来上传文件:multipart/form-data

实例如下:

  1. 以form形式发送post请求
# Reqeusts支持以form表单形式发送post请求,只需要将请求的参数构造成一个字典,然后传给requests.post()的data参数即可
payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.post("http://httpbin.org/post", data=payload)
print(r.text)


'''
打印结果:
{
  "args": {}, 
  "data": "", 
  "files": {}, 
  "form": {
    "key1": "value1", 
    "key2": "value2"
  }, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Content-Length": "23", 
    "Content-Type": "application/x-www-form-urlencoded", 
    "Host": "httpbin.org", 
    "User-Agent": "python-requests/2.19.1", 
    "X-Amzn-Trace-Id": "Root=1-5eba5051-d6224e54e7bb8c34aacabf50"
  }, 
  "json": null, 
  "origin": "218.76.158.236", 
  "url": "http://httpbin.org/post"
}

'''

  1. 以json形式发送post请求
# 可以将一 json串传给requests.post()的data参数,
url = 'http://httpbin.org/post'
payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.post(url, data=json.dumps(payload))
print(r.headers.get('Content-Type'))
# 打印结果:application/json
  1. 以multipart形式发送post请求
# Requests也支持以multipart形式发送post请求,只需将一文件传给requests.post()的files参数即可,文本文件report.txt的内容只有一行:Hello world!,从请求的响应结果可以看到数据已上传到服务端中。

url = 'http://httpbin.org/post'
files = {'file': open('report.txt', 'rb')}
r = requests.post(url, files=files)
print(r.text)
'''
打印结果:
{
...
  "files": {
    "file": "hello world"
  }, 
  "form": {}, 
  "headers": {
    "Content-Type": "multipart/form-data; boundary=6db46af64e694661985109da21c8fe9b", 

  }, 
  "json": null, 
  "origin": "223.72.217.138", 
  "url": "http://httpbin.org/post"
  ...
}
'''

封装函数

import requests, json
import time
import random
import string
from urllib import parse
from hashlib import md5

# 请求接口共用方法
def request_fun(url, paramArr, headers, mode='get'):
    # 接口签名验证参数
    app_id = paramArr.get('app_id')
    paramArr['time_stamp'] = int(time.time())
    paramArr['nonce_str'] = ''.join(random.sample(string.ascii_letters + string.digits, 16))
    paramArrSign = json.dumps(paramArr, sort_keys=True)
    # urlencode仅支持字典类型的数据,同时不存在urldecode方法
    paramStr = parse.urlencode(json.loads(paramArrSign))
    paramArr['api_sign'] = (md5(paramStr.encode('utf8')).hexdigest()).upper()

    resultData = None
    # 执行请求
    try:
        if mode == 'post':
            resultJson = requests.post(url, params=paramArr, headers=headers, timeout=5).json()
        else:
            resultJson = requests.get(url, params=paramArr, headers=headers, timeout=5).json()

        resultStatus = resultJson['status']
        if resultStatus != 'success':
            print('接口输出错误;错误详情:')
            print(url)
            print(resultJson)
        else:
            # 返回数据
            resultData = resultJson['data']
    except requests.exceptions.RequestException as e:
        print(e)
        print('请求超时')
    return resultData

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值