1.前情回顾
1.match 和 search 返回对象
2.findall 返回列表
3.sub返回的是替换之后的结果
4.split切割
5.贪婪和懒惰是相对的,而且是有前提的,需要满足全局的情况
6.\b在ASCII码中表示退格,有特殊的含义
在正则中也有特殊含义,匹配的是数字到非数字的边界("123!"匹配的是3和!之间),不是数据
\b 在ASCII是一个转义字符 表示退格 ASCII码8
在正则中也有特殊的含义 用以匹配 数字-非数字字符边界 而不匹配数据
单词边界符能够匹配中文符号、英文符号、空格、制表符、回车符号,以及各种边界
含义不一样 使用不一样
比如匹配字符串中\b字符 需要正则有\b且不加r
如果 需要匹配 数字-非数字字符边界 则应该使用r'\b'
re.match(r"h\f\b", "h\f\b").group() # 以下代码合法吗
re.match( "h\f\b", "h\f\b").group() # 以下代码合法吗
那到底什么时候不能用r,什么时候应该用r呢
如果匹配数据是ASCII码中转义字符的含义 那么不应该使用r字符
除此之外一般情况下都可以加上r字符
7.\r是将正则中的\变成\\
8.浏览器-服务器工作流程
浏览器 发起资源请求;显示资源
DNS服务器 将域名转换为IP地址
web服务器 提供网页资源 图片视频音频
1. 用户在浏览器地址栏输入资源网址 URL(协议 主机名 资源路径)
2. 浏览器把网址中主机名发送DNS服务器 进行域名解析 获取到IP地址
3. 通过IP地址 和 (协议)端口 连接服务器 connect
4. 向服务器发起资源请求(包括资源路径)
5. 服务器会读取资源请求 解析 发送对应的资源数据给浏览器
6. 浏览器解析数据并且进行显示
7. 如果网页显示还需要其他资源 重复执行56步 直到获取到所有的资源
2.HTTP协议(重点是格式)
2.1简单介绍
协议:规定了数据的格式,就是一种约定,让双方可以通信。
HTTP协议作用:
就是浏览器和服务器之间传输网页资源的数据采用的一种协议格式
超文本传输协议(HTTP协议)
应用层次的协议
基于请求响应模式
基于TCP
91年0.9版本
97年1.1版本(现在使用的版本)
超文本就是超文本标记语言写的HTML
HTTP协议是基于TCP实现的应用层协议
TCP/IP模型每一层的作用:
按照图片右侧的例子理解一下即可,了解,不需要死记硬背。
HTTP协议的工作模式:一次请求request和一次响应response的模式
浏览器主动发起请求,服务器才响应。
响应的数据是两部分:一部分是请求结果,一部分是数据
2.2HTTP请求报文格式
2.2.1谷歌浏览器
开发者模式(WindowsF12打开):
- Elements:查找网页源代码HTML中的任一元素,手动修改任一元素的属性和样式且能实时在浏览器里面得到反馈。
- Console:记录开发者开发过程中的日志信息,且可以作为与JS进行交互的命令行Shell。
- Sources:断点调试JS。
- Network:从发起网页页面请求Request后分析HTTP请求后得到的各个请求资源信息(包括状态、资源类型、大小、所用时间等),可以根据这个进行网络性能优化。
1# 请求报文第一行,请求行,分为三部分 2GET / HTTP/1.1 3 # 请求方法 GET 获取资源 浏览器向服务器请求资源 4 # POST 浏览器向服务器提交数据 5 # HEAD 验证前后台工作是否正常 6 # 资源请求路径(域名后面的就是请求路径) 7 # 如果浏览器的路径是/或者没有 那么请求路径是就是/ 8 # / 在web服务器中表示首页 9 # HTTP协议版本 10# 请求头 名称:值 11Host: www.baidu.com 12 #请求的主机名称 13Connection: keep-alive 14 # 连接方式 保持存活<长连接> close直接关闭<短连接> 15User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36 16 # 用户代理(浏览器身份) 适配网页(手机网页或者电脑网页):反爬Python3.5 17 # 爬虫的时候可以将自己伪装成其他用户 爬虫的时候不要将别人的网站弄奔溃 18Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 19 # 浏览器接受文件的类型 数据类型 20Accept-Encoding: gzip, deflate, br 21 # 可以接受的压缩算法 数据太大,网络传输过程中提高效率 22 # 可以节约带宽资源,提高网页传输效率 23Accept-Language: en-US,en;q=0.9 24 # 接受的语言 语言的优先级 25
课堂思考问题
请求行分为几部分、每一部分分别表示什么、请求头有什么特点、分别表示什么含义
2.2.2HTTP请求报文格式总结
请求行[方法 资源路径 版本 \r\n] \r\n代表换行符
请求头[名称:值\r\n]
空行[\r\n]
请求体[存储的是 浏览器提交给服务器的数据]
# 请求报文 GET /index.html HTTP/1.1\r\n Host: 127.0.0.1\r\n Connection: keep-alive\r\n Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r\n Accept-Encoding: gzip, deflate, sdch\r\n Accept-Language: zh-CN,zh;q=0.8\r\n \r\n
GET方法用以资源获取 一般都没有请求体,POST用以资源提交 一般都带请求体
GET方法用以资源获取 一般都没有请求体
请求行[GET 资源路径 版本 \r\n] \r\n代表换行符
请求头[名称:值\r\n]
空行[\r\n]
POST用以资源提交 一般都带请求体
请求行[POST 资源路径 版本 \r\n] \r\n代表换行符
请求头[名称:值\r\n]
空行[\r\n]
请求体[存储的是 浏览器提交给服务器的数据]
课堂思考问题:
1请求报文整个分为几部分,哪几部分
2post方法和get方法的请求报文有什么区别
3 常用的头部的意义
2.3响应报文
HTTP/1.1 200 OK start-line 起始行 状态行 响应行 版本 状态码 200成功 2xx表示成功 3xx表示重定向 302Found/307 Location: https://www.baidu.com/ 4xx 客户端错误 404 Not Found 表示用户端请求错误 5xx 服务器错误 503服务不可用 状态说明 # 响应头部说明 Connection: Keep-Alive 连接方式 HTTP/1.1默认 长连接 Content-Encoding: gzip 数据采用的压缩方式 解压缩 Content-Language:zh-CN 数据采用的语言 content-Length:1002 数据的长度,单位是字节 Content-Type: text/html(Content-Type: application/javascript;charset=UTF-8) 数据类型 charset=UTF-8表示数据采用的字符集是utf-8 有可能是网页有可能是图片 Date: Sun, 25 Nov 2018 04:10:00 GMT 日期时间 格林威治时间 0时区 北京时间 东八区 +8 Expires: Sun, 25 Nov 2018 04:09:33 GMT 代表过期时间 Server: BWS/1.1 服务器后台程序的名称 名称可以随便改 # Content-X头部一般都是标识后面的数据的属性
2.3.1HTTP响应报文格式总结
响应行[版本 状态码 说明\r\n]
响应头[名称 : 值\r\n]
空行[\r\n] 用来分割上下内容,表示响应头结束
响应体[存储的是 服务器发送给浏览器的数据 图片等网页资源]
2.4 验证HTTP响应报文格式
为了强化对响应报文的认识,这套格式,不是为了记住代码
import socket # 1 创建出 TCP套接字 IPv4 基于字节流 tcp_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 2 输入URL-->域名---DNS解析--->获取到服务器ip地址 # IP 和 端口 连接服务器 tcp_socket.connect(('tlias-stu.boxuegu.com',80)) # 3 组装请求报文,发送给服务器 请求行 + request_data = "GET / HTTP/1.1\r\n" +"Host:www.tlias-stu.boxuegu.com\r\n" + "\r\n" tcp_socket.send(request_data.encode()) # 4 接收响应报文 验证 response_data = tcp_socket.recv(4096) print(response_data) # 5 关闭和服务器的连接 - 短连接方式 tcp_socket.close()------------------------------------------------------ HTTP/1.1 200 OK\r\n Server: nginx/1.10.2\r\n Date: Sun, 25 Nov 2018 08:06:02 GMT\r\n Content-Type: text/html;charset=ISO-8859-1\r\n Content-Length: 2729\r\n Connection: keep-alive\r\n X-Application-Context: application:production:6303\r\n Last-Modified: Mon, 20 Aug 2018 06:01:44 GMT\r\n Accept-Ranges: bytes\r\n Content-Language: en-US\r\n Vary: Accept-Encoding\r\n \r\n <!DOCTYPE html><html><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1"><link rel=icon href=/favicon.ico><title>TLIAS\xe7\xa0\x94\xe8\xae\xa8\xe6\xb1\x87</title><link href=/css/chunk-07a5.d674c38c.css rel=prefetch><link href=/css/chunk-095e.15abea5b.css rel=prefetch><link href=/css/chunk-0f9f.415bfa1c.css rel=prefetch><link href=/css/chunk-1247.03e81ebe.css rel=prefetch><link href=/css/chunk-1bfa.d674c38c.css rel=prefetch><link href=/css/chunk-2a87.acf8c5c1.css rel=prefetch><link href=/css/chunk-3d0b.d674c38c.css rel=prefetch><link href=/css/chunk-40ec.d674c38c.css rel=prefetch><link href=/css/chunk-4762.d674c38c.css rel=prefetch><link href=/css/chunk-4b2e.c5eb09a1.css rel=prefetch><link href=/css/chunk-591c.fae7b595.css rel=prefetch><link href=/css/chunk-6be2.69dfb6f2.css rel=prefetch><link href=/css/chunk-6c19.d6ab9cf4.css rel=prefetch><link href=/css/chunk-6dcb.557aa669.css rel=prefetch><link href=/css/chunk-6f19.d674c38c.css rel=prefetch><link href=/css/chunk-7704.d674c38c.css rel=prefetch><link href=/css/chunk-8417.d674c38c.css rel=prefetch><link href=/css/chunk-882d.d674c38c.css rel=prefetch><link href=/css/chunk-8f38.abf43e65.css rel=prefetch><link href=/js/chunk-07a5.a94bf613.js rel=prefetch><link href=/js/chunk-095e.a3a72cc2.js rel=prefetch><link href=/js/chunk-0b75.f3f85fd8.js rel=prefetch><link href=/js/chunk-0f9f.05daa514.js rel=prefetch><link href=/js/chunk-1247.e84febb0.js rel=prefetch><link href=/js/chunk-1bfa.1da67777.js rel=prefetch><link href=/js/chunk-2a87.5d2fd4c1.js rel=prefetch><link href=/js/chunk-3d0b.d4a0e6b9.js rel=prefetch><link href=/js/chunk-40ec.be23cbb7.js rel=prefetch><link href=/js/chunk-4762.0c96e4a5.js rel=prefetch><link href=/js/chunk-4b2e.dfb6d161.js rel=prefetch><link href=/js/chunk-591c.77c06357.js rel=prefetch><link href=/js/chunk-6be2.06b40164.js rel=prefetch><link href=/js/chunk-6c19.3edf1e2d.js rel=prefetch><link href=/js/chunk-6dcb.d6226677.js rel=prefetch><link href=/js/chunk-6f19.e05576f1.js rel=prefetch><link href=/js/chunk-7704.9281e4d1.js rel=prefetch><link href=/js/chunk-8417.1d4c7b26.js rel=prefetch><link href=/js/chunk-882d.6b54c3c9.js rel=prefetch><link href=/js/chunk-8f38.8de796a5.js rel=prefetch><link href=/css/app.231297aa.css rel=preload as=style><link href=/css/chunk-vendors.849b725d.css rel=preload as=style><link href=/js/app.0b402d7b.js rel=preload as=script><link href=/js/chunk-vendors.849d86b7.js rel=preload as=script><link href=/css/app.231297aa.css rel=stylesheet><link href=/css/chunk-vendors.849b725d.css rel=stylesheet></head><body><div id=app></div><script src=/js/app.0b402d7b.js></script><script src=/js/chunk-vendors.849d86b7.js></script></body></html>
2.5 长连接和短连接
HTTP中基于TCP<面向连接>实现
短连接:
优点:管理多个连接 简单 容易实现
缺点:如果用户频繁操作,消耗大量的资源进行套接字的创建和销毁
由于在用户发起请求的时候才创建连接 容易造成用户体验差
Connection: close
长连接:
需要同时保持和大量客户端连接的存活 实现复杂 对应硬件的需求高
用户频繁操作 节约了大量的资源(不需要进行 大量资源的创建和销毁)
用户体验更好
现行web服务器常用的做法
Connection: Keep-Alive