python操作网络,即打开一个网站,或者请求一个http接口,可以通过使用python自带的标准模块urllib或第三方库requests实现
一、使用urllib模块操作网络
urllib模块是一个标准模块,直接import urllib即可,在python3里面只有urllib模块,在python2里面有urllib模块和urllib2模块。使用urlib模块发送请求实例如下:
1 from urllib import request
2 from urllib import parse
3 import json
4
5 #1、发送get请求
6 url = 'http://api.xxxx.cn/api/user/stu_info'
7 data = {'stu_name':'xiaohei'}
8 tmpData = parse.urlencode(data) #将数据格式变成Kv k=v
9 tmpUrl=url +'?'+tmpData #将接口url和参数拼接
10 res = request.urlopen(tmpUrl) #请求接口
11 resForRead=res.read() #通过read方法获取返回值结果,返回值结果是bytes
12 print(type(resForRead))
13 resForString= resForRead.decode() #通过decode方法将bytes转成string
14 print(type(resForString))
15 resForDict = json.loads(resForString) #通过json 将字符串转换为字典
16 print(resForDict)
17
18 #2、发送post请求
19 url='http://api.xxx.cn/api/user/login'
20 data={"username":"nhy","passwd":"123456"}
21 tempData= parse.urlencode(data) #k=v
22 #post 和 get的区别 在于urlopen时,get发的是接口和参数的拼接字符
23 res=request.urlopen(url,tempData.encode())#post 请求 参数1 为接口地址,参2 为请求参数,参数要求bytes类型
24 print(res.read().decode())
二、使用requests库操作网络
上面是使用python自带的urllib模块去请求一个网站,或者接口,但是urllib模块太麻烦了,传参数的话,都得是bytes类型,返回数据也是bytes类型,还得解码,想直接把返回结果拿出来使用的话,还得用json,发get请求和post请求,也不通,使用比较麻烦,还有一个比较方便的模块:requests模块,它使用比较方便,需要安装,pip install requests即可。
发送一个请求,分为以下三步
- 1.1 组装请求: 请求可能包含url,params(url参数),data(请求数据),headers(请求头),cookies等,最少必须有url
- 1.2发送请求,获取响应:支持get,post等各种方法发送,返回的是一个响应对象
- 1.3. 解析响应: 输出响应文本
具体实例如下:
1 import requests
2
3
4 #1、发送get请求 组装参数
5 url = 'http://api.xxxx.cn/api/user/stu_info'
6 data = {'stu_name':'xiaohei'}
7 # res =requests.get(url,data).text #发送get请求,并获取响应结果,text解析响应返回结果是一个字符串
8 res =requests.get(url,data).json() #发送get请求,并获取响应结果,json解析响应返回结果是一个字典
9 print(res) #输出响应的文本
10
11 #2、传统表单类post请求(x-www-form-urlencoded)
12 url='http://api.xxx.cn/api/user/login'
13 data={"username":"niuhany","passwd":"aA123456"} #post请求发送的数据,字典格式
14 res=requests.post(url,data).json() #通过post方法传递
15 print(res)
16 print(type(res))
17
18 #json类的post请求(application/json)
19 url ='http://api.xxxx.cn/api/user/add_stu'
20 data={"name":"dsxl123","grade":"一班","phone":18388888888} #data类型支持字典和字符串
21 res = requests.post(url,json=data).json()#接口入参要求是json格式,可以通过在post请求中指定json
22 print(res)
23
24 #添加cookie的post请求
25 cookie={"nhyang":"160eb8812a08731ca9ce9c1ab6c6bc0f"}
26 url="http://api.xxx.cn/api/user/gold_add"
27 data={"stu_id":1,"gold":10000}
28 res=requests.post(url,data,cookies=cookie).text#通过cookies进行cookie的传递
29 print(res)
30
31 #添加header的get请求
32 url="http://api.xxx.cn/api/user/all_stu"
33 header={"Referer":"http://api.nnzhp.cn/"}
34 res =requests.get(url,headers=header).text
35 print(res)
36
37 #传文件到服务器
38 url='http://api.xxx.cn/api/file/file_upload'
39 #通过files参数将文件传递到服务器
40 res=requests.post(url,files={"file":open('tools.py')})
41 print(res)