上节课,我们学习了什么是网络、网络的发展历程和常见网络协议。这节课,我们重点学习一下HTTP协议和怎么用python请求、解析HTTP数据。
## 什么是HTTP
![](https://www.simplilearn.com/ice9/blog/wp-content/uploads/2014/12/Why-HTML-is-important-for-content-writers.gif)
HTTP是**超文本传输协议**的简称。所谓**超文本**,就是在互联网上传输的信息。我们在浏览器里浏览的网页,就是使用超文本标记语言HTML实现的,下章我们会详细介绍HTML。
![](http://2.bp.blogspot.com/_4l9wMe5bbSk/TMpvwVcMT3I/AAAAAAAAAK4/sCEjRQCkF1o/s1600/Client+Server+communication.GIF)
典型的HTTP传输如下:客户端(浏览器)对指定的url发起http请求。url指定的服务端在接收到请求后,将自己的数据(经常是html或json)返回给客户端。
我们分别看一下发起请求和请求响应的部分。
一个典型的请求头如下:
~~~
GET / HTTP/1.0
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5)
Accept: */*
~~~
![](https://www.safaribooksonline.com/library/view/restful-net/9780596155025/httpatomoreillycomsourceoreillyimages224471.png)
我们去请求服务端数据时,有`get`,`post`,`put`,`delete`4种方式,其中 get和post较为常用。
请求的响应数据格式如下:
~~~
HTTP/1.0 200 OK
Content-Type: text/plain
Content-Length: 137582
Expires: Thu, 05 Dec 1997 16:00:00 GMT
Last-Modified: Wed, 5 August 1996 15:55:28 GMT
Server: Apache 0.84
<html>
<body>Hello World</body>
</html>
~~~
回应的格式是"头信息 + 一个空行(\r\n) + 数据"。其中,第一行是"协议版本 + 状态码(status code) + 状态描述"。
这里有个非常重要的,状态码。具体含义如下:
![](http://aviraer.info/images/2018/HTTP%E7%8A%B6%E6%80%81%E7%A0%81%E7%B1%BB%E5%88%AB.png)
## 什么是URL
## python的request模块
在python中,我们使用`requests`模块来发起发起http请求。
1. request 安装
我们可以使用`pip install requests`命令安装requests包。
2. 请求数据demo
~~~
r = requests.get('https://api.github.com/events')
~~~
调用 requests的get方法发起请求,请求参数是目标地址。
3. post请求的参数
post请求时的附带参数可以这样模拟:
~~~
requests.post('http://baidu.com', data = {'key':'value'})
~~~
get请求的参数
~~~
payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.get("http://baidu.com", params=payload)
print(r.url)
~~~
4. 获取请求返回数据
~~~
r = requests.get('https://api.github.com/events')
print(r.text)
~~~
5. 返回结果json解码
~~~
r = requests.get('https://api.github.com/events')
print(r.json())
~~~
6. 设置超时(秒单位)
~~~
requests.get('http://github.com', timeout=3)
~~~
## 代码实例
下面,我们来看一个python通过http请求获取天气的小demo,看代码:
~~~
import requests
from tkinter import *
def queryWeather():
city = cityEntry.get()
headers = {'Authorization': 'APPCODE 2c571bbe36b24e9aa3cadaaee4d0adbf'}
r = requests.get(
'https://saweather.market.alicloudapi.com/spot-to-weather?area='+city+'&need3HourForcast=0&needAlarm=0&needHourData=0&needIndex=0&needMoreDay=0',
headers=headers)
weather = r.json()['showapi_res_body']['now']['weather']
weatherLabel = Label(root, text=weather)
weatherLabel.pack()
return weather
root=Tk()
cityEntry = Entry(root)
cityEntry.pack()
button = Button(root,text='查询天气', command=queryWeather)
button.pack()
root.mainloop()
~~~
代码的第二行,我们往http的header里设置了请求码,用来做鉴权。当获得数据后,我们首先将结果转为json格式。然后读取返回数据的当前天气字段。
request模块里还有更多的方法来发起复杂HTTP请求,我们在具体项目使用时再一起学习。
**阿达老师-孩子身边的编程专家**
*完整课程请关注阿达老师,主页里有完整的课程目录和观看地址*
- 课程介绍
- 搭建环境
- 什么是计算机
- 程序是怎么运行的
- 安装python
- 项目实例-安装IDE
- 变量和简单数据类型
- 数据&变量
- 数字
- 字符串
- 布尔类型
- 项目实例
- 容器-列表
- 容器
- 列表
- 项目实例
- 容器-字典
- 定义字典
- 项目实例
- 数据类型总结
- 条件语句
- python条件语句
- 项目实例
- 循环语句
- for循环
- while循环
- 项目实例
- 函数
- 5.0函数定义
- 5.2函数实战
- 6.文件系统
- 6.1 文件系统介绍&python查找文件
- 6.2 用python读写文件
- 7. python操作时间
- 8.面向对象
- 8.1 类和对象
- 8.2 继承和重写
- 8.3 面向对象项目实战
- 9 GUI编程
- 9.1 GUI基础
- 9.2 备忘清单GUI版
- 10.网络
- 10.1 网络的发展
- 10.2 python http
- 11.web开发
- 11.1 web基础&HTML
- 11.2 CSS&JavaScript
- 11.3 网页计算器
- 11.3 网站开发实战-播客搭建
- 11.3 python-web
- 12. 项目实战-数据处理
- 13. 项目实战-AI入门
- 13.1 环境搭建
- 心得
- 13.2 Tensorflow的瓜怎么吃
- 14 pygame
- 14.1 pygame Helloworld
- 14.4 pygame 动画基础 Animation
- 从0开始学python第14.5节 pygame 加载图片和声音
- 从0开始学python第14.6节 pygame.sprite(上)
- 14.7 pygame.sprite模块(下)
- 14.8 pygame射击游戏(一)
- pygame射击游戏(二)
- 14.8 pygame射击游戏(三)
- 14.8 pygame射击游戏(四)
- 14.8 pygame射击游戏(五)