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)