Python学习网络编程

一、urllib模块

python操作网络,也就是打开一个网站,或者请求一个http接口,使用urllib模块。

urllib模块是一个标准模块,直接import urllib即可。在python3里面只有urllib模块,在python2里面有urllib模块和urllib2模块

import json
from urllib import request
from urllib import parse
# from urllib.request import urlopen
# from urllib.parse import urlencode
# urlencode 可以转化key-value键值对为xx=11这样的格式

pay_url = 'http://szz.nnzhp.cn/pay'
balance_url = 'http://szz.nnzhp.cn/get_balance'
balance_data = {'user_id': 1}
# 发送get请求
new_balance_data = parse.urlencode(balance_data)  # 把请求参数变成xx=11这样的  user_id = 1
balance_req = request.urlopen(balance_url + '?' + new_balance_data)  # 发送get请求
print(balance_req.read().decode())# 获取接口返回的结果,返回的结果是bytes类型的,需要使用decode方法解码,变成一个字符串

# 发送post请求
pay_data = {"user_id": 1, "price": "999"}
new_pay_data = parse.urlencode(pay_data)  # 把请求参数变成xx=11这样的
pay_req = request.urlopen(pay_url, new_pay_data.encode())  # 发送post请求,传入参数的话
# 参数必须是bytes类型,所以需要先encode一下,变成bytes类型
print(pay_req.read().decode())  # 获取接口返回的结果,返回的结果是bytes类型的
# 需要使用decode方法解码,变成一个字符串
res = json.loads(pay_req.read().decode()) # 因为返回的是一个json串,想把json串转成字典的话,使用json模块转成一个字典
print(res)

二、requests模块

上面是使用python自带的urllib模块去请求一个网站,或者接口。但是urllib模块太麻烦了:

1)传参数都得是bytes类型;

2)返回数据也是bytes类型还要解码;

3)想直接把返回结果拿出来使用的话,还得用json;

4)发get请求和post请求也不同,使用比较麻烦。

还有一个比较方便的模块比urllib模块方便很多就是requests模块,使用pip install requests安装即可,下面是requests模块的实例

1、发送get、post请求

import requests
pay_url = 'http://szz.nnzhp.cn/pay'
balance_url = 'http://szz.nnzhp.cn/get_balance'
balance_data = {'user_id': 1}
pay_data = {"user_id": 1, "price": "999"}

# 发送get请求,并获取返回结果,text获取的结果是一个字符串
balance_res = requests.get(balance_url, balance_data).text
print(balance_res)

# 发送get请求,并获取返回结果,json()方法获取的结果直接是一个字典
balance_res = requests.get(balance_url, balance_data).json()
print(balance_res)

# 调用post方法
pay_res = requests.post(pay_url, pay_data).json()
print(pay_res)

注:http传的时候是urlencode编码,requests会将中文参数转urlencode编码

2、post请求:入参类型为json串,使用json参数指定

# ====入参是json串的====
url='http://szz.nnzhp.cn/api/user/add_stu'
data =  {
    "name":"requests_name",
    "grade":"天蝎座",
    "phone":17712532946,
    "sex":"",
    "age":28,
    "addr":"河南省济源市北海大道32号"
  }
res = requests.post(url,json=data) #入参是json类型的
print(res.json())

3、post请求:添加cookie,使用cookies参数指定

# ======添加cookie=====
url = 'http://api.nnzhp.cn/setmoney2'
data = {'userid': 1, "money": 9999}
cookie = {'token': "token12345"}
res = requests.post(url, data, cookies=cookie)  # 使用cookies参数指定cookie
print(res.json())

4、post请求:添加权限验证,auth参数

# =====添加权限验证=====
url = 'http://api.nnzhp.cn/setmoney'
data = {'userid': 1, "money": 91999}
res = requests.post(url, data, auth=('admin', '123456')).json()
# 使用auth参数指定权限验证的账号密码,auth传的是一个元组
print(res)

5、post请求:发送header

# =====发送header======
url = 'http://api.nnzhp.cn/getuser2'
data = {'userid': 1}
header = {'Content-Type': "application/json"}
res = requests.post(url, headers=header).json()
# 指定headers参数,添加headers

6、post请求:下载文件

# ======下载文件=====
url6='https://aliimg.changba.com/cache/photo/855e5493-f018-44db-8892-c8660649327b_640_640.jpg'
res = requests.get(url6,verify=False) #verify=False如果是https的话加上这个

with open('tu.jpg','wb') as fw:  #二进制文件需要用wb
    fw.write(res.content) #下载文件

7、post请求:上传文件

# ======上传文件=====
url = 'http://api.nnzhp.cn/uploadfile'
data = {'file':open('魔鬼中的天使.mp3','rb')} #二进制文件需要用rb
res = requests.post(url, files=data)
# 指定files参数,传文件,是一个文件对象
print(res.json())
print(res.status_code) #获取它的状态码 

8.response 返回内容

print(res.json())     #必须返回的是json才可以用
print(res.text)       #返回文本信息字符串方式的响应体,会自动根据响应头部的字符编码进行解码,下载文件的话text就不行了
print(res.content)    #用来下载文件文件用的,返回的是二进制会自动为你解码 gzip 和 deflate 压缩
print(res.headers)    #获取到返回的所有header,以字典对象存储服务器响应头
print(res.cookies)    #获取到返回的所有cookie
print(res.status_code)  #获取到响应状态码
print(res.url)          #获取url
print(res.encoding)     #编码格式
print(res.raw)          #返回原始响应体        
原文地址:https://www.cnblogs.com/ddxxn/p/9714069.html