python 操作网络, 即打开一个网站, 或者请求一个 http 接口, 可以通过使用 python 自带的标准模块 urllib 或第三方库 requests 实现
一, 使用 urllib 模块操作网络
urllib 模块是一个标准模块, 直接 import urllib 即可, 在 python3 里面只有 urllib 模块, 在 python2 里面有 urllib 模块和 urllib2 模块. 使用 urlib 模块发送请求实例如下:
- from urllib import request
- from urllib import parse
- import JSON
- #1, 发送 get 请求
- url = 'http://api.xxxx.cn/api/user/stu_info'
- data = {'stu_name':'xiaohei'}
- tmpData = parse.urlencode(data) #将数据格式变成 Kv k=v
- tmpUrl=url +'?'+tmpData #将接口 url 和参数拼接
- res = request.urlopen(tmpUrl) #请求接口
- resForRead=res.read() #通过 read 方法获取返回值结果, 返回值结果是 bytes
- print(type(resForRead))
- resForString= resForRead.decode() #通过 decode 方法将 bytes 转成 string
- print(type(resForString))
- resForDict = JSON.loads(resForString) #通过 JSON 将字符串转换为字典
- print(resForDict)
- #2, 发送 post 请求
- url='http://api.xxx.cn/api/user/login'
- data={"username":"nhy","passwd":"123456"}
- tempData= parse.urlencode(data) #k=v
- #post 和 get 的区别 在于 urlopen 时, get 发的是接口和参数的拼接字符
- res=request.urlopen(url,tempData.encode())#post 请求 参数 1 为接口地址, 参 2 为请求参数, 参数要求 bytes 类型
- 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. 解析响应: 输出响应文本
具体实例如下:
- import requests
- #1, 发送 get 请求 组装参数
- url = 'http://api.xxxx.cn/api/user/stu_info'
- data = {'stu_name':'xiaohei'}
- # res =requests.get(url,data).text #发送 get 请求, 并获取响应结果, text 解析响应返回结果是一个字符串
- res =requests.get(url,data).JSON() #发送 get 请求, 并获取响应结果, JSON 解析响应返回结果是一个字典
- print(res) #输出响应的文本
- #2, 传统表单类 post 请求 (x-www-form-urlencoded)
- url='http://api.xxx.cn/api/user/login'
- data={"username":"niuhany","passwd":"aA123456"} #post 请求发送的数据, 字典格式
- res=requests.post(url,data).JSON() #通过 post 方法传递
- print(res)
- print(type(res))
- #JSON 类的 post 请求 (application/JSON)
- url ='http://api.xxxx.cn/api/user/add_stu'
- data={"name":"dsxl123","grade":"一班","phone":18388888888} #data 类型支持字典和字符串
- res = requests.post(url,JSON=data).JSON()# 接口入参要求是 JSON 格式, 可以通过在 post 请求中指定 JSON
- print(res)
- #添加 cookie 的 post 请求
- cookie={"nhyang":"160eb8812a08731ca9ce9c1ab6c6bc0f"}
- url="http://api.xxx.cn/api/user/gold_add"
- data={"stu_id":1,"gold":10000}
- res=requests.post(url,data,cookies=cookie).text# 通过 cookies 进行 cookie 的传递
- print(res)
- #添加 header 的 get 请求
- url="http://api.xxx.cn/api/user/all_stu"
- header={"Referer":"http://api.nnzhp.cn/"}
- res =requests.get(url,headers=header).text
- print(res)
- #传文件到服务器
- url='http://api.xxx.cn/api/file/file_upload'
- #通过 files 参数将文件传递到服务器
- res=requests.post(url,files={"file":open('tools.py')})
- print(res)
来源: http://www.bubuko.com/infodetail-3279772.html