🗒️Python

type
status
date
slug
summary
tags
category
icon
password
😀
这里写文章的前言: 一个简单的开头,简述这篇文章讨论的问题、目标、人物、背景是什么?并简述你给出的答案。
可以说说你的故事:阻碍、努力、结果成果,意外与转折。
 

📝 主旨内容

Python 2.x 和 Python 3.x 中 print 函数语法方面的区别

python 下载模块

https://pypi.org/
在搜索框输入模块名
选择download files下载
使用说明在project description
使用YUM 下载 RPM包 yum install --downloadonly --downloaddir=/tmp python-pip
下载requests
离线安装pymysql模块
pip list #列出当前有哪些模块 安装方法一:
 
 

python1 ---- 简介

发布时间 : 2022-01-12 19:06
字数: 821 阅读 :

python 简介

Python 由荷兰数学和计算机科学研究学会的 Guido van Rossum 于 199e 年代初设计,作为一门叫做 ABc 语言的替代品。 python 之父:吉多 · 范罗苏姆(Guido van Rossum),是一名荷兰计算机程序员。 python 语法简洁,对初学者友好。具有非常多并且强大的第三方库,使得程序员在开发中得心应手。 python 程序员的信仰:人生苦短,我用 python。 从业方向:python 全栈开发工程师、python 爬虫工程师、自动化运维、自动化测试、数据分析、人工智能。

python 版本

python2.x 版本官方 2020 年停止支持更新,源码不规范,重复较多。 python3.x 版本功能更强大且修复了很多 bug,源码清晰,简单。

编译型与解释型语言区别

编译型:开发完成,一次性把所有的代码进行编译成机器成识别的二进制码,在运行 代表语言:C,C++ 优点:执行速度快。 缺点:开发速度慢,调试周期长。
解释型:代码从上到下一行一行解释并运行。 代表语言:python,php 优点:开发效率快,调试周期短。 缺点:执行速度相对慢。

python 解释器

1.Cpython(官方推荐) 把 python 代码转化为 c 语言能识别的二进制码 2.Jpython 把 python 代码转化为 java 语言能识别的二进制码 3.PyPy 将所有代码一次性编译成二进制码,加快执行效率(模仿编译型语言的一款 python 解释器) 4. 其他语言解释器 把 python 代码转化为其他语言能识别的二进制

Python 之禅 by Tim Peters

优美胜于丑陋(Python 以编写优美的代码为目标) 明了胜于晦涩(优美的代码应当是明了的,命名规范,风格相似) 简洁胜于复杂(优美的代码应当是简洁的,不要有复杂的内部实现) 复杂胜于凌乱(如果复杂不可避免,那代码间也不能有难懂的关系,要保持接口简洁) 扁平胜于嵌套(优美的代码应当是扁平的,不能有太多的嵌套) 间隔胜于紧凑(优美的代码有适当的间隔,不要奢望一行代码解决问题) 可读性很重要(优美的代码是可读的) 即便假借特例的实用性之名,也不可违背这些规则(这些规则至高无上) 不要包容所有错误,除非你确定需要这样做(精准地捕获异常,不写 except:pass 风格的代码) 当存在多种可能,不要尝试去猜测 而是尽量找一种,最好是唯一一种明显的解决方案(如果不确定,就用穷举法) 虽然这并不容易,因为你不是 Python 之父(这里的 Dutch 是指 Guido ) 做也许好过不做,但不假思索就动手还不如不做(动手之前要细思量) 如果你无法向人描述你的方案,那肯定不是一个好方案;反之亦然(方案测评标准) 命名空间是一种绝妙的理念,我们应当多加利用(倡导与号召)

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 438803792@qq.com
文章标题: python1 —- 简介
字数: 821
本文作者: Final233
发布时间: 2022-01-12, 19:06:00
最后更新: 2021-12-31, 02:30:06

python2 ---- 变量与数据类型

发布时间 : 2022-01-12 19:06
字数: 817 阅读 :1

变量和赋值

  • 什么是变量
    • 一个实体的指代
      • 查看变量内存地址 ```null id(x)
      • 可重新赋值,在别的语言中,常量是不可以重新赋值的 ```null x = 3
        • 被重新赋值之后的值去哪了? 被系统回收了
        • Python 的常量 python 没有常量这个数据类型 程序员之间的约定:如果这个变量的命名都是大写字母,那么就视为一个常量

      Python 的六大基本类型

      注:强调基本的原因数据类型和数据结构指向的范围更加广泛,不要产生错误的认知,形成思维定势
      • 通过type()函数来查看当前变量的数据类型
      • int(整数)
        • float(浮点数)
          • 因为计算机内部只认识 1 和 0,所以浮点数强调的时小数的表现形式
        • string(字符串,字符序列)
          • 在有些语言中,单个字符也是一个基本的数据类型(char)
          • 有序的
          • 如何表示字符串 ```null ’‘""’’’’’’""""""
            • 转义字符 告知 python 解释器。我们当前要表示的是一个字符或者是特殊字符
              • 通过\来转义 ```null “2\n” “2\n3”
            • boolean(布尔值) 用来表示True或者False
              • True等价于 1
              • False等价于 0
            • bytes(二进制序列) 二进制的表示形式
              • None(空)
                • 有了 False 和 0 为什么还要有 None 因为 Falsd 和 0 有时候也代表了一种结果
                  • Python 的四大基本数据结构

              • list(列表)
                • 什么是列表?
                • 用来装载不同数据类型的数据集结构
                • 列表的特点
                  • 有序
                  • 可以装载任意数据类型
                  • 可以更改的
                • 如何表示list
                • 通过list() 新建一个列表```null list(“hello world”)
                  • 通过[]声明一个列表```null a=[1,2,3]
                  • tuple(元组)
                    • 什么是元组?
                    • 可以简单地认为,元组就是不可修改的列表,常用来表示记录。
                    • 元组的特点?
                      • 有序的
                      • 可以装载任意数据类型
                      • 不可更改
                    • 如何表示tuple #声明单个元素的元组,要添加逗号 a = (1,) ```
                      • 通过tuple()新建一个元组 ```null tuple(“hello world”)
                        • 通过(,)来声明一个元组 ``` bash a = (1,2,3)
                    • dict(字典)
                      • 什么是字典?
                      • 字典也叫hashtable,通过hash(散列) 函数将传入的 key 值生成地址来查找valuekey->hash函数 > 返回了value的地址 > 通过地址返回value
                      • 字典的特点?
                        • 无序的 python3.6 是有序的,无视这一点
                        • 字典中的 key 必须是可 hash 的,也就是不可更改的,唯一的
                        • 可以更改的
                      • 字典表达方式
                      • 通过dict()来创建字典 ```null dict(a=2)
                        • 通过{}来声明一个字典 ```null a={“a”:2}
                        • set(集合)
                          • 什么是set
                          • set其实是没有value的字典
                          • 集合的特点
                            • 无序的
                            • 集合中的key必须是可hash
                            • 可以更改的
                            • 元素是唯一的
                          • 如何表示set
                            • 通过set()来创建集合 ```null {1,2,4,4}
                              • 通过{}来表示 ```null {1,2,4,4}

                            转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 438803792@qq.com http://localhost:4000/2022/01/12/python2%20—-%20%E5%8F%98%E9%87%8F%E4%B8%8E%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B/

                            python3 ---- 函数、运算符与数据类型的常用方法

                            发布时间 : 2022-01-12 19:06
                            字数: 4.6k 阅读 :1

                            Python 函数的基本介绍

                            • 什么是函数? 函数是一段可以直接被另外一段程序或代码引用的程序或代码,也叫做子程序,方法.
                              • 可重复使用
                              • 可互相调用
                            • 函数的目的
                              • 为了代码段的复用
                            • Python中如何定义一个函数?
                              • 函数的组成
                                • 参数列表
                                  • 必需参数 当前参数必须按顺序传入
                                • 关键字参数 根据关键字参数传参可以无视顺序
                                  • 默认参数
                                  • 不定长参数 在装饰器中会大量应用 可以接受任意长度的参数.
                                  • 代表了省略,省略了参数tuple(元组)
                                  • * 省略了关键字参数dict(字典)
                                    • 函数体 函数中的逻辑体
                                    • 返回值
                                    • 默认返回 None

                                  Python 运算符

                                  • 算术运算
                                    • 加法 +
                                    • 减法 -
                                    • 乘法 *
                                    • 除 /
                                    • 整除 //
                                    • 取余数 %
                                    • x 的 y 次幂 x ** y
                                    • 开方(没有提供直接的运算符) x ** (1/2)
                                  • 赋值运算 通过 = 赋值 a=1 ```
                                    • 比较运算 比较的是两个对象的字面值,字面值暂时可以简单地理解为输出值
                                      • <
                                      • <=
                                      • \=
                                      • \== 等于
                                      • != 不等于
                                    • 标识号比较运算 比较两个变量的内存地址
                                      • is
                                      • is not
                                      •  
                                      • 赋值类型为 str,int 时考虑 Python 常量池 内存地址是一样的,中文不在常量池当中```null a=“test_1” b=“test_1” id(a) Out[6]: 2135370818480 id(b) Out[7]: 2135370818480 a is b Out[8]: True
                                        • a = ‘你好’ b = ‘你好’ id(a) Out[12]: 2135370954384 id(b) Out[13]: 2135370954768 a is b Out[11]: False
                                    • 成员运算判断元素是指在当前序列当中
                                      • in```null a=[1,2,3] 1 in a Out[15]: True b =[1,2] b in a Out[17]: False
                                        • not in
                                      • 布尔运算 判断当前语句的结果是 True 还是 False
                                        • and 只有两边都是 True 才返回 True
                                        • or 两边表达式有一个 True 返回的结果为 True
                                          • 短路 表达式 A or 表达式 B 当表达式 A 为 True 时,表达式 B 就不会运行
                                      • 逻辑取反 not
                                      • 位运算 属于二进制运算
                                        • ~
                                        • ^
                                        • <<
                                        • &
                                        • |

                                      位运算与运算符优先级

                                      • 自定义优先级 如果不确定优先级,出于可读性和避免未知的 BUG,我们都应该用()来自定义优先级
                                        • 通过() (not b and c) or (d and e)

                                      字符串和字节序列及编码解码问题

                                      字符串(字符序列)和字节序列

                                      • 字符
                                        • 由于历史原因,将字符定义为 unicode 字符还不够准确,但是未来字符的定义一定是 unicode 字符
                                      • 字节 字符的二进制表现形式
                                      • 码位 计算机显示的实际上是码位
                                        • 编码
                                          • 字节序列(bytes)-> 字符序列(string)–解码(decode)```null len(‘\u4f60\u597d’) Out[6]: 2 b=“你好”.encode(“utf-8”) b Out[13]: b’\xe4\xbd\xa0\xe5\xa5\xbd’
                                            • 字符序列(string)-> 字节序列(bytes)–编码(encode)```null b.decode(“utf”) Out[14]: ‘你好’
                                            • 编码错误
                                              • 乱码与混合码,通常是人为的错误,两种不同的编码方式,在一种编码方式下进行译码
                                                • 检查编码 没有办法通过字节序列来得出编码格式,都是统计学来预估当前的编码 ``` bash b = “你”.encode(“utf-8”) + “好”.encode(“gbk”) b Out[5]: b’\xe4\xbd\xa0\xba\xc3’
                                                • b.decode(“utf-8”) Traceback (most recent call last):```null File “C:\ProgramData\Anaconda3\lib\site-packages\IPython\core\interactiveshell.py”, line 3437, in run_code exec(code_obj, self.user_global_ns, self.user_ns) File “”, line 1, in b.decode(“utf-8”)
                                                  UnicodeDecodeError: ‘gbk’ codec can’t decode byte 0xc3 in position 4: incomplete multibyte sequence 安装 chardet pip install chardet 导入 charet import chardet chardet.detect(b) Out[11]: {‘encoding’: ‘ISO-8859-1’, ‘confidence’: 0.73, ‘language’: ‘’} #confience 表示精度,一般在 0.9 相当准确了 chardet.detect(“你”.encode(“utf-8”)) #可以看到此编码不太准确,所以仅供参考 Out[13]: {‘encoding’: ‘ISO-8859-1’, ‘confidence’: 0.73, ‘language’: ‘’} chardet.detect(“你好”.encode(“utf-8”)) Out[14]: {‘encoding’: ‘utf-8’, ‘confidence’: 0.7525, ‘language’: ‘’} ```
                                                • 解决乱码和混合编码
                                                  • 忽略错误编码 ```null b_2=“你好”.encode(“utf-8”) + “啊”.encode(“gbk”) b_2.decode(“utf-8”,errors=‘ignore’) Out[18]: ‘你好’
                                                    • 利用鬼符来替换,特殊字符来替换,表示知道当前错误编码 ```null b_2.decode(“utf-8”,errors=‘replace’) Out[21]: ‘你好��’
                                                • Create(创建)
                                                  • 不可变的数据类型 ```null a=“a” id(a) Out[23]: 1809422010288 a=a+“b” id(a) Out[25]: 1809520718768
                                                  • +=
                                                    • Retrieve(检索)
                                                      • 根据索引 获取字符在计算机语言当中,索引值是从 0 开始计数
                                                        • find 和 index(获取目录字符的索引值)
                                                          • startwith 和 endwith,从头 / 尾进行匹配
                                                            • UPDATE(更新)
                                                              • replace(替换),返回的是新的字符串,全局替换```null a=“hello werld, hello werld” a.replace(“wer”,“wor”) Out[48]: ‘hello world, hello world’
                                                                • split(分割)```null a=“<>, <>, <<c++>>”a.split(“,”) Out[50]: [‘<>’, ‘java<< >>’,c’]
                                                                  • join(拼接)```null b = a.split(“,”) “,”.join(b) Out[53]: ‘<>, <>, <<c++>>’
                                                                    • DELETE(删除)```null a =“hello, world” a Out[55]: ‘hello, world’ a.strip() Out[56]: ‘hello, world’
                                                                      • lstrip 和 rstrip 删除前后空格字符```null a.lstrip() Out[60]: ‘hello, world’ a.rstrip() Out[61]: ‘hello, world’

                                                                  字符串的输出和输入

                                                                  • 保存到文件 ```null
                                                                    • output=open(“output.txt”,“w”,encoding=“utf-8”) context=“hello, world”
                                                                      output.write(context)
                                                                      output.close()
                                                                  • 读取文件 ```null input = open(“output.txt”, “r”, encoding=“utf-8”) content = input.read() print(content) content_2 = input.read() print(content_2)
                                                                    • 追加文件 ```null output = open(“output.txt”, “a”, encoding=“utf-8”) context = “\nhello, python” output.write(context) output.close()

                                                                      字符串的格式化输出

                                                                      • format
                                                                        • 按传入参数默认顺序 ```null a=“ping” b=“pong” print(“play pingpong: {}, {}”.format(a, b)) play pingpong: ping, pong
                                                                          • 按指定参数索引,达到到重复性输出 ```null print(“play pingpong: {0}, {1}, {0}, {1}”.format(a, b)) play pingpong: ping, pong, ping, pong
                                                                            • 关键词参数 ```null print(“play pingpong: {a}, {b}, {a}, {b}”.format(a=‘ping’, b=‘pong’)) play pingpong: ping, pong, ping, pong
                                                                              • 推荐使用此方法,这样可读性更好,但仅能在 3.6 版本之上使用```null print(f“play pingpong: {a}, {b}”)
                                                                                • 小数的表示 ```null 2 表示 保留两位 f 表示 float print(“{:.2f}”.format(3.141592)) 3.14
                                                                                • %```null “playing %s %s” % (“ping”,“pong”) Out[3]: ‘playing ping pong’

                                                                                  变量与引用

                                                                                  了解变量和引用

                                                                                  • 变量 简单来说指向一个实体
                                                                                  • 引用 简单来说指向同一个内存地址
                                                                                    • 基础数据结构的 CRUD 操作

                                                                                  • List(列表)list 中存的元素是引用
                                                                                    • create(增加)
                                                                                      • append 末尾添加元素
                                                                                        • 和 +=拼接两个列表,返回一个新的列表 ```null l1=[‘a’] l2=[‘b’] l3=l1+l2 id(l1) Out[19]: 1184852612864 id(l2) Out[20]: 1184852093440 id(l3) Out[21]: 1184852614400 l1 Out[22]: [‘a’] l2 Out[23]: [‘b’] l3 Out[24]: [‘a’, ‘b’]+= a='a' id(a) Out[28]: 1184775915440 a+='b' a Out[30]: 'ab' id(a) Out[31]: 1184869746800 l=['a'] id(l) Out[33]: 1184852815424 l+=['b'] id(l) Out[35]: 1184852815424 l Out[36]: ['a', 'b']和 *= a='a' id(a) Out[38]: 1184775915440 l=[a]*10 id(l[0]) Out[40]: 1184775915440 id(l[9]) Out[41]: 1184775915440 l Out[42]: ['a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a'] 赋值语句之后,a已经是一个新的对象,可以看到内存地址改变了 a='b' id(a) Out[44]: 1184775821808 l Out[45]: ['a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a']insert 指定位置添加元素 l=["a"] l.insert(0,'b') l Out[48]: ['b', 'a'] l.insert(10,'z') l Out[50]: ['b', 'a', 'z']
                                                                                        • Retrieve(检索)
                                                                                          • 索引取值,所有序列都支持索引取值
                                                                                          • 切片 ```null your_list[start:end:step]
                                                                                            • 取一段区间 your_list[start:end]
                                                                                              取最后一个值 your_list[-1] 此值会少 1 位 your_list[len(your_list)]
                                                                                              间隔 步长 your_list[1:10:2] 取 1 到 10 的基数
                                                                                              l=list(range(20)) l Out[56]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19] l[0:10] Out[57]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] l[11:-1] Out[62]: [11, 12, 13, 14, 15, 16, 17, 18] l[11:len(l)] Out[63]: [11, 12, 13, 14, 15, 16, 17, 18, 19] l[-1] Out[64]: 19
                                                                                              l[1:10:2] Out[65]: [1, 3, 5, 7, 9]
                                                                                          • index```null l=[‘a’,‘b’,‘c’] l Out[68]: [‘a’, ‘b’, ‘c’] l.index(‘b’) Out[70]: 1
                                                                                            • 在值为 b 的插入一个元素,查找下标在插入 l.insert(l.index(‘b’),‘test’) l Out[72]: [‘a’, ‘test’, ‘b’, ‘c’]
                                                                                        • Update(更新)
                                                                                          • 索引赋值 ```null your_list[下标值]=‘新值’
                                                                                            • l Out[73]: [‘a’, ‘test’, ‘b’, ‘c’] id(l) Out[74]: 1184869994688 l[0]=“a_1” l[l.index(‘test’)]=“a_2” l Out[78]: [‘a_1’, ‘a_2’, ‘b’, ‘c’] id (l) Out[79]: 1184869994688
                                                                                        • 切片赋值
                                                                                        • DELETE(删除)
                                                                                          • pop() 从末尾删除元素并返回,适用于消息队列 ```null l Out[86]: [‘a’, ‘b’, ‘c’] x=l.pop() x Out[88]: ‘c’ l Out[89]: [‘a’, ‘b’]
                                                                                            • clear() 清除当前列表的元素,不会改变列表的内存地址,若重新赋值,会改变列表的当前地址 ```null l Out[90]: [‘a’, ‘b’] id(l) Out[91]: 1184869994688 l.clear() id(l) Out[93]: 1184869994688 l=[] id(l) Out[95]: 1184870031424
                                                                                            • 排序
                                                                                              • sort 修改本身的元素
                                                                                                • sorted 不修改本身,返回处理结果,排序后返回新列表
                                                                                                  • reversed 倒序之后返回新列表
                                                                                                    • tuple 不可变的列表
                                                                                                      • Create 无
                                                                                                      • Retrieve
                                                                                                        • 索引取值
                                                                                                        • index
                                                                                                        • 切片 ```null t=(1,2,3) t.index(1) Out[118]: 0 t[0:1] Out[119]: (1,)
                                                                                                        • Update 无
                                                                                                        • Delete 无
                                                                                                      • dict 字典 CURD
                                                                                                        • Create
                                                                                                          • 键对值赋值
                                                                                                          • update 提供合并字典功能 ```null d={} id(d) Out[122]: 1184870022336 d[‘a’]=1 d2={“b”:2,“c”:3} d.update(d2) d Out[126]: {‘a’: 1, ‘b’: 2, ‘c’: 3} id(d) Out[127]: 1184870022336
                                                                                                            • setdefault 如果字典中没有当前 key,那么设置默认值,相当于没有 key,新增并设置默认值 ```null d Out[128]: {‘a’: 1, ‘b’: 2, ‘c’: 3} d.setdefault(‘a’,0) Out[129]: 1 d Out[130]: {‘a’: 1, ‘b’: 2, ‘c’: 3} d.setdefault(‘d’,0) Out[132]: 0 d Out[133]: {‘a’: 1, ‘b’: 2, ‘c’: 3, ‘d’: 0}
                                                                                                            • Retrieve
                                                                                                              • 键对值访问
                                                                                                              • get 键对值访问缺失 key 会报错,而 get 不会,返回 null,且可以指定默认值
                                                                                                                • keys() 返回所有的 key
                                                                                                                  • values() 返回所有的 values
                                                                                                                    • item() 返回所有键对值
                                                                                                                    • Update
                                                                                                                      • 键对值赋值 ```null d Out[158]: {‘a’: 1, ‘b’: 2, ‘c’: 3, ‘d’: 0} d[‘a’]=11 d Out[160]: {‘a’: 11, ‘b’: 2, ‘c’: 3, ‘d’: 0}
                                                                                                                        • update```null d.update({“b”:22,“c”:33}) d Out[163]: {‘a’: 11, ‘b’: 22, ‘c’: 33, ‘d’: 0}
                                                                                                                        • Delete
                                                                                                                          • pop(key) 删除当前元素并返回 value```null d Out[164]: {‘a’: 11, ‘b’: 22, ‘c’: 33, ‘d’: 0} d.pop(‘a’) Out[165]: 11 d Out[166]: {‘b’: 22, ‘c’: 33, ‘d’: 0}
                                                                                                                            • popitem() 对于人来说无序的,相当于随机返回一个 item```null Out[165]: 11 d Out[166]: {‘b’: 22, ‘c’: 33, ‘d’: 0} d.popitem() Out[167]: (‘d’, 0) d Out[168]: {‘b’: 22, ‘c’: 33}
                                                                                                                              • clear()```null d.clear() d Out[172]: {}
                                                                                                                            • set() 函数创建一个无序不重复元素集,可进行关系测试,删除重复数据,还可以计算交集、差集、并集等
                                                                                                                              • Create
                                                                                                                                • add```null s=set() s.add(“a”) s Out[175]: {‘a’}
                                                                                                                                • Retrieve 检索
                                                                                                                                  • 运算符 in 过滤,成员检测 ```null s Out[179]: {‘a’} ‘a’ in s Out[181]: True
                                                                                                                                  • Update
                                                                                                                                    • update
                                                                                                                                      • union
                                                                                                                                      • Delete
                                                                                                                                        • remove 和 discard discard 缺失元素时不会报错,而 remove 会报错 ```null s Out[193]: {‘a’, ‘b’, ‘c’} s.remove(“a”) s Out[195]: {‘b’, ‘c’} s.discard(“e”) s.remove(“e”) 若值不存在会报错 Traceback (most recent call last): File “C:\ProgramData\Anaconda3\lib\site-packages\IPython\core\interactiveshell.py”, line 3437, in run_code exec(code_obj, self.user_global_ns, self.user_ns) File “”, line 1, in s.remove(“e”) KeyError: ‘e’
                                                                                                                                          • pop() 无序删除并返回元素 删除和返回的无序元素

                                                                                                                                  练习

                                                                                                                                  完成四大基础数据结构的 CRUD 操作

                                                                                                                                  转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 438803792@qq.com http://localhost:4000/2022/01/12/python3%20—-%20%E5%87%BD%E6%95%B0%E3%80%81%E8%BF%90%E7%AE%97%E7%AC%A6%E4%B8%8E%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B%E7%9A%84%E5%B8%B8%E7%94%A8%E6%96%B9%E6%B3%95/

                                                                                                                                  Python4 ---- 流程控制、循环语句、异常处理、函数的高级用法

                                                                                                                                  Python 的逻辑控制语句

                                                                                                                                  • if - elif - else
                                                                                                                                    • 循环语句
                                                                                                                                      • for 遍历一个中迭代对象 (暂时理解为 list)
                                                                                                                                        • 获取索引值和值
                                                                                                                                          • while 一定要有逻辑判断语句来退出 while 循环,否则可能会死循环,占用系统额外资源,但也要看应用场景
                                                                                                                                            • 跳出循环
                                                                                                                                              • break 停止当前循环
                                                                                                                                              • continue 跳过当前循环,立即执行下一个循环语句单元 ```null l = [1, 3, 5, 6, 7] for i in l: if i == 3: continue else: print(f“search element: {i}”) print(“—-”)
                                                                                                                                                • pass 跳过当前条件判断中的执行语句,后续语句继续执行

                                                                                                                                            Python 的异常与处理

                                                                                                                                            • 异常 程序遇到严重错误时, 会终止程序的运行并抛出异常
                                                                                                                                              • 捕获异常
                                                                                                                                                • Exception所有异常的基类, 所有的异常都是 Exception 的子类
                                                                                                                                                • *处理异常颗粒度要细一点, 尽量不要捕获基类 Exception, 尤其是数据处理的时候.**(避免会有脏数据污染)
                                                                                                                                                • 常见的异常
                                                                                                                                                  • IndexError 索引值超过了列表长度
                                                                                                                                                    • KeyError 找不到 Key
                                                                                                                                                      • ValueError 传入的参数错误
                                                                                                                                                        • TypeError 类型错误, 常见于运算
                                                                                                                                                          • SyntaxError 语法报错, 检查自己的语法有没有写错
                                                                                                                                                          • IndentationError 缩进错误
                                                                                                                                                            • 混用 tab 和 space(空格)
                                                                                                                                                            • 缩进长度不对
                                                                                                                                                      • 如何处理异常
                                                                                                                                                        • 处理
                                                                                                                                                        • 抛出新异常 (捕获而不能处理,继续返回错误)
                                                                                                                                                          • 重新抛出 (会返回两次错误)
                                                                                                                                                            • 忽略 (不推荐)pass用来指示当前处理语句没有正式写完, 尽量不要忽略异常, 否则代码的健壮度会很差, 造成不可预知的 bug.
                                                                                                                                                          • 自定义异常

                                                                                                                                                            练习

                                                                                                                                                            • 用 for 循环和 while 来完成简单的计数 ``` bash #for def foo(x):```null l1 = range(1, x) sum = 0 for i in l1: sum += i print(f’1 到 {x - 1} 相加的和是: {sum}’)
                                                                                                                                                              f(n) = f(n-1) + f(n-2)
                                                                                                                                                              a = 1 b = []
                                                                                                                                                              def foo(): a = 2 b.append(2)
                                                                                                                                                              foo() print(a) print(b)
                                                                                                                                                              def make_averager(): series = [] def averager(value): series.append(value) total = sum(series) return total / len(series) return averager
                                                                                                                                                              my_avg = make_averager() print(my_avg(1)) print(my_avg(2))
                                                                                                                                                              def cache_deco(func): # 保存 n 执行后的结果 a = {} # 判断当前 cache a 中是否有结果, 有的话就直接返回, 没有就执行以下 result = func(n) return result
                                                                                                                                                              @cache_deco def fibo(n): pass
                                                                                                                                                              ```

                                                                                                                                                              转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 438803792@qq.com http://localhost:4000/2022/01/12/Python4%20—-%20%E6%B5%81%E7%A8%8B%E6%8E%A7%E5%88%B6%E3%80%81%E5%BE%AA%E7%8E%AF%E8%AF%AD%E5%8F%A5%E3%80%81%E5%BC%82%E5%B8%B8%E5%A4%84%E7%90%86%E3%80%81%E5%87%BD%E6%95%B0%E7%9A%84%E9%AB%98%E7%BA%A7%E7%94%A8%E6%B3%95/

                                                                                                                                                              Python5 ---- 常用模块与面向对象

                                                                                                                                                              导入第三方模块

                                                                                                                                                              • 导包的层级关系
                                                                                                                                                                • 模块 (module) 以文件为载体, 包含各类对象
                                                                                                                                                                • 包 (package) 以文件夹为载体, 包含了各类模块
                                                                                                                                                                • 库 (lib) 包含了各类包
                                                                                                                                                              • import 库
                                                                                                                                                              • from 库 / 模块 import 模块 / 函数
                                                                                                                                                              • 导包的命名冲突 通过as这个关键词来给当前模块 / 函数取个别名 ```null from datetime import datetime as p_datetime

                                                                                                                                                                时间模块 time

                                                                                                                                                                调用的都是系统级的接口, 提供时间的访问和转换的功能
                                                                                                                                                                • 查看时间
                                                                                                                                                                  • 获取当前时间
                                                                                                                                                                    • 时间戳
                                                                                                                                                                      • 时间的格式化输出
                                                                                                                                                                        • 运算 将时间对象转换为list, 对相应的时间重新赋值后, 通过time.struct_time生成一个新的时间对象
                                                                                                                                                                          • 时间休眠 当前程序休眠 n 秒

                                                                                                                                                                          时间模块 datetime

                                                                                                                                                                          封装了 time, 提供了更高级和更友好的接口
                                                                                                                                                                          • 查看时间
                                                                                                                                                                            • 时间格式的转换
                                                                                                                                                                              • datetime.datetime -> str
                                                                                                                                                                                • str -> datetime.datetime
                                                                                                                                                                                  • datetime.datetime -> timestamp
                                                                                                                                                                                    • timestamp -> datetime.datetime
                                                                                                                                                                                    • 时间运算
                                                                                                                                                                                      • timedelta 只作用于datetime.datetime格式

                                                                                                                                                                                      课后作业

                                                                                                                                                                                      • 通过datetime模块完成时间戳, datetime.datetime对象, 格式化字符串三者之间的转换 ``` bash import datetime
                                                                                                                                                                                      now = datetime.datetime.now()
                                                                                                                                                                                      time_str = now.strftime(“%Y-%m-%d %H:%M:%S”)
                                                                                                                                                                                      str_time = datetime.datetime.strptime(time_str, “%Y-%m-%d %H:%M:%S”)
                                                                                                                                                                                      time_smp = now.timestamp()
                                                                                                                                                                                      smp_time = datetime.datetime.fromtimestamp(time_smp)

                                                                                                                                                                                      类的创建, 实例化, 初始化

                                                                                                                                                                                      • 什么是类类就是拥有相同功能或者相同属性的对象集合
                                                                                                                                                                                      • 类的创建
                                                                                                                                                                                        • object是所有类的基类 ```null class GoGamer(object): subject = ‘go’
                                                                                                                                                                                          • print(GoGamer)
                                                                                                                                                                                      • 类的实例化实例就是抽象概念的具象化
                                                                                                                                                                                        • 类的初始化 类创建一个新实例的时候会默认调用__init__这样一个特殊方法
                                                                                                                                                                                          • 关于self 指代还未实例化的实例

                                                                                                                                                                                        面向对象

                                                                                                                                                                                        • 面向过程
                                                                                                                                                                                          • 程序 = 数据结构 + 算法
                                                                                                                                                                                          • 强调的是一个实现的细节
                                                                                                                                                                                        • 面向对象完成对越来越庞大项目代码以及对外公开接口的归类和重 (chong) 用, 是一种更高级的抽象.
                                                                                                                                                                                          • 通过什么手段来完成上述目的?
                                                                                                                                                                                            • 继承
                                                                                                                                                                                              • 处理多继承冲突 ```
                                                                                                                                                                                                • 查看MRO(mehotd resolution order)
                                                                                                                                                                                                  • 指定类方法的调用顺序 ``` class C(A, B):
                                                                                                                                                                                                    • 指定当前前一个类,可用 mro 属性查看,简单来说就是获取当前解释顺序传入当前糨的 index+1,索引加 1
                                                                                                                                                                                                • 多态 方式为覆盖和重载
                                                                                                                                                                                                  • 覆盖 (子类和父类之间的, 是垂直的关系) 子类可以继承父类的所有属性和方法, 但是同时子类也可以重写父类的属性和方法, 达到自定义的目的.
                                                                                                                                                                                                    • 重载 (类中的方法和方法之间的, 是水平关系)Python 中式没有重载, 但是可以用装饰器来实现该功能,不推荐
                                                                                                                                                                                                  • 封装 把客观事物封装成抽象的类, 隐藏实现细节, 使得代码模块化,简单来说定义公开的接口,仅关心获取接口的功能或数据,不关心如何实现

                                                                                                                                                                                              课后作业

                                                                                                                                                                                              • 用类封装一个MyMath类, 实现加, 减, 乘, 除, 幂, 开方 ``` class MyMath:

                                                                                                                                                                                                贴标签不是一个特别好的抽象, 原因他没有一个普适性

                                                                                                                                                                                                class Developer: programing_language = None busy = True
                                                                                                                                                                                                class Developer: programing_language = None busy = True __case = “doing something”
                                                                                                                                                                                                d_python = Developer() d_python.programing_language = “python” d_java = Developer() d_java.programing_language = “java”
                                                                                                                                                                                                print(d_java.programing_language) print(d_python.programing_language)
                                                                                                                                                                                                class Developer: programing_language = None busy = True case = “doing something” def init(self, hairs): self.hairs = hairs
                                                                                                                                                                                                class MyMath:
                                                                                                                                                                                                list 实现了增删改查的接口, 只要有一个接口没有实现那就不属于 list tuple 只提供了查的接口
                                                                                                                                                                                                list 扮演者列表的角色, 但同时也是一个序列, 序列并不是一个实体类.
                                                                                                                                                                                                class MyDict(dict): def iadd(self, other): self.update(other) return self
                                                                                                                                                                                                import abc class Mixin: def sign(self): pass
                                                                                                                                                                                                class Gamer: @abc.abstractmethod def sign(self): pass
                                                                                                                                                                                                class GoGamer(Mixin, Gamer): pass
                                                                                                                                                                                                class Swimmer(Mixin, Gamer): pass
                                                                                                                                                                                                • 为上节课自定义类添加以下功能:
                                                                                                                                                                                                  • 添加类属性
                                                                                                                                                                                                  • 添加类私有属性
                                                                                                                                                                                                  • 添加类方法或者类的私有属性
                                                                                                                                                                                                  • __init__方法中初始化实例属性
                                                                                                                                                                                                  • __init__方法中绑定私有实例属性
                                                                                                                                                                                                  • 在自定义类中实现__str__, 自定义输出格式 ``` bash class People: name = None #类属性、实例属性 gender = None __age = 18 #私有属性
                                                                                                                                                                                                    • def init(self, name, gender):
                                                                                                                                                                                                      @classmethod def get_age(cls): #类方法
                                                                                                                                                                                                      def str(self):
                                                                                                                                                                                                value = People(‘张三’, ‘男’) print(f” 年龄:{People.get_age()}”) print(value.str())
                                                                                                                                                                                                ```

                                                                                                                                                                                                转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 438803792@qq.com http://localhost:4000/2022/01/12/Python5%20—-%20%E5%B8%B8%E7%94%A8%E6%A8%A1%E5%9D%97%E4%B8%8E%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1/

                                                                                                                                                                                                Python6 ---- 线程与进程、网络编程、生成器与迭代器、协程、异步IO

                                                                                                                                                                                                requests 模块的介绍

                                                                                                                                                                                                • requests 的作用 通过 python 来模拟请求网址
                                                                                                                                                                                                • 一个模拟请求由以下四个部分组成
                                                                                                                                                                                                  • url
                                                                                                                                                                                                  • method
                                                                                                                                                                                                  • body
                                                                                                                                                                                                  • headers
                                                                                                                                                                                                • 模拟请求百度

                                                                                                                                                                                                  理解多线程和多进程

                                                                                                                                                                                                  • 什么是进程? 什么是线程?
                                                                                                                                                                                                    • 进程: 可以简单地认为是一个程序. 进程是操作系统分配资源的最小单位.
                                                                                                                                                                                                    • 线程: 一个进程可以有多个线程, 每个线程可以独立完成一些任务. 线程是操作系统进行运算调度的最小单位.
                                                                                                                                                                                                  • 多线程 demo
                                                                                                                                                                                                    • 多进程 demo
                                                                                                                                                                                                      • 多线程
                                                                                                                                                                                                        • 等待任务完成后回到主进程 通过调用Thread对象的join方法
                                                                                                                                                                                                          • 如何拿到返回结果
                                                                                                                                                                                                            • 赋值到全局变量当中, 添加到可变对象之中 ```null result = [] def request_baidu(index): … result.append(response) if name == “main”: thread_array = [] for i in range(10): t = Thread(target=request_baidu, args=(i, )) thread_array.append(t) t.start() for t in thread_array: t.join() print(“done!”) print(result)
                                                                                                                                                                                                          • 多进程
                                                                                                                                                                                                            • 等待任务完成后回到主进程 通过调用Process对象的join方法
                                                                                                                                                                                                            • 如何拿到返回结果 无法通过全局变量存储返回结果,线程与进程返回的结果是不一样的 多进程相当于启动了多个程序, 共同执行了同一份代码, 他们之间的内存地址完全不一样 ```null import requests import time from threading import Thread from multiprocessing import Process
                                                                                                                                                                                                              • result = [] print(f“主进程 result 内存地址: {id(result)}”)
                                                                                                                                                                                                                def request_baidu(index): time.sleep(2) url = “https://www.baidu.com/
                                                                                                                                                                                                                if name == “main”: process_array = [] for i in range(10): p = Process(target=request_baidu, args=(i, )) process_array.append(p) p.start() for p in process_array: p.join() print(“done!”) print(result)
                                                                                                                                                                                                          • 多进程和多线程的异同点
                                                                                                                                                                                                            • 相同点
                                                                                                                                                                                                              • 都是对cpu工作时间段的描述, 只是颗粒度不同. 简单地说就是多进程和多线程都会调用cpu资源的, 但是进程可以启动多个线程去执行.
                                                                                                                                                                                                              • linux内核态不区分进程和线程
                                                                                                                                                                                                            • 不同点
                                                                                                                                                                                                              • 进程有自己的独立地址空间, 建立数据表来维护代码段, 堆栈段和数据段, 而线程共享进程中的资源, 使用相同的地址空间, 所以线程间的切换快得多.
                                                                                                                                                                                                              • 因为线程共享进程的全局变量, 静态变量等对象, 线程间的通信更为方便, 而进程间的通信更加复杂, 需要以ipc的方式进行.
                                                                                                                                                                                                              • 多进程要比多线程要健壮. 进程之间一般不会相互影响, 而多线程有一条线程崩溃, 会导致整个进程跟着发生崩溃或者无法正常退出等.

                                                                                                                                                                                                          全局解释器锁 (GIL)

                                                                                                                                                                                                          • 计算密集型 主要占用cpu资源
                                                                                                                                                                                                          • IO 密集型IO就是input output, 需要等待的一些任务
                                                                                                                                                                                                            • 网络请求会有网络延迟
                                                                                                                                                                                                            • 和数据库交互需要等待数据库查询事件
                                                                                                                                                                                                            • 读写硬盘
                                                                                                                                                                                                          • 多进程在处理计算密集型程序的时候比多线程块 由于全局解释器锁的存在, 一个进程下, 只允许一个线程执行Python程序的字节码 (当前代码文件的二进制表示). 简单地说, 创建的 10 个线程其实在争夺一个cpu资源. 但是遇到io操作会让渡cpu资源.
                                                                                                                                                                                                          • 如何绕过 GIL?
                                                                                                                                                                                                            • 将多线程方法改为多进程
                                                                                                                                                                                                            • 将计算密集型任务转移给 C 扩展
                                                                                                                                                                                                            • 分布式计算引擎spark, Apache
                                                                                                                                                                                                            • 使用PyPy解释器, 工业上几乎没人这么用, 因为PyPy并不成熟.

                                                                                                                                                                                                          课后作业

                                                                                                                                                                                                          • 利用Python实现一个多线程程序
                                                                                                                                                                                                          • 将多线程程序改为多进程程序

                                                                                                                                                                                                          进程间通信 (IPC)

                                                                                                                                                                                                          • 文件 通过读写文件来进行变量, 数据, 信息的传递
                                                                                                                                                                                                            • 读写冲突 两个进程同时进行写, 或者一个写一个读, 造成了冲突.
                                                                                                                                                                                                            • 解决读写冲突
                                                                                                                                                                                                              • 互斥锁```null from multiprocessing import Process, Lock
                                                                                                                                                                                                                • def save_to_file(index, lock): with lock: with open(“test.log”, “a”, encoding=“utf-8”) as f: f.write(str(index) + “\n”)
                                                                                                                                                                                                                  if name == “main”: process_array = [] lock = Lock() for i in range(10): p = Process(target=save_to_file, args=(i, lock)) process_array.append(p) p.start() for p in process_array: p.join() print(“done!”)
                                                                                                                                                                                                          • 套接字 (socket - 插座)通过一个协议, 连接两个进程. 主要就是网络请求.
                                                                                                                                                                                                            • 进程 A 向百度云上传文件, 进程 B 向百度云下载文件, 不会有冲突.
                                                                                                                                                                                                              notion image
                                                                                                                                                                                                              socket.png
                                                                                                                                                                                                          • 管道 (了解)用文件的内存缓冲区作为管道, 实现进程间通信
                                                                                                                                                                                                            • 匿名管道 主进程和子进程进行交互
                                                                                                                                                                                                            • 具名管道 和匿名管道原理是一样的, 不是不相关的进程也可以互相访问 ipc_pipeline.png
                                                                                                                                                                                                              • notion image
                                                                                                                                                                                                          • 消息队列 就是一个存在内核内存空间中的列表
                                                                                                                                                                                                            • redis 就是消息队列 + socket
                                                                                                                                                                                                          • 共享内存 (了解) 进程访问内核态同一块内存
                                                                                                                                                                                                            • 信号量 (了解) 不是用来传递数据的, 是用来传递消息
                                                                                                                                                                                                              • 进程 B 要等到进程 A 执行到某一步操作后, 才会启动 进程 A-> 发消息 -> 内核 -> 转发信息 -> 进程 B

                                                                                                                                                                                                            线程间通信

                                                                                                                                                                                                            线程间通信强调的是线程之间传递对象引用
                                                                                                                                                                                                            • 共享变量
                                                                                                                                                                                                              • 线程安全 线程有 GIL 锁, 但是拿到 GIL 锁不代表可以一直执行下去 现代计算机多线程也是 A 执行一会儿, B 执行一会儿这样交替执行
                                                                                                                                                                                                                • 解决线程安全 将重要指令包装成原子操作 (不可分割的).
                                                                                                                                                                                                                  • 加互斥锁 ``` import requests import time from threading import Thread,Lock
                                                                                                                                                                                                                  • zero = 0 lock = Lock()
                                                                                                                                                                                                                    def foo():
                                                                                                                                                                                                                    if name == “main“:
                                                                                                                                                                                                                    ```

                                                                                                                                                                                                              课后作业

                                                                                                                                                                                                              • 多进程锁, 多线程锁都要自己实现一遍
                                                                                                                                                                                                              • 多进程通过 Queue 来实现进程通信
                                                                                                                                                                                                              • 把上述概念熟记并理解

                                                                                                                                                                                                              迭代器和生成器

                                                                                                                                                                                                              • 迭代器 概念上: 迭代器可以用来表示一个数据流, 提供了数据的惰性返回功能(只有我们主动去使用 next 方法调用, 才会返回值) 实现上: 实现了__next__接口的对象
                                                                                                                                                                                                                • 传统声明一个列表, 里面的元素会立即写进内存当中, 占用大量内存.
                                                                                                                                                                                                                  迭代器可以一次只返回一个元素, 占用内存非常小, 在读取大文件和大的数据集合的时候特别有用
                                                                                                                                                                                                                • 通过iter方法返回一个迭代器对象
                                                                                                                                                                                                                  • 通过next方法主动获取迭代器中的值
                                                                                                                                                                                                                  • 生成器 生成器是一种特殊的迭代器, 在迭代器惰性返回数据的基础上, 提供了额外的功能, 实现了程序的暂停.
                                                                                                                                                                                                                    • 声明一个生成器 只要函数体中有yield关键词, 它就是一个生成器
                                                                                                                                                                                                                      • yield 翻译为让渡, 我们可以简单理解为暂停并返回右边的值
                                                                                                                                                                                                                  • 生成器和迭代器的区别? 同样提供了惰性返回的功能, 迭代器侧重于提供数据的惰性返回功能, 生成器侧重于指令的惰性返回功能

                                                                                                                                                                                                                  协程

                                                                                                                                                                                                                  • 协程的原理协程的实现原理就是生成器的实现原理, 在生成器的基础上又提供了传递值的功能.
                                                                                                                                                                                                                    • 通过send方法向生成器传递值, 以下例子中, b 就是通过 send 方法赋值为 2 对生成器进行send操作一定要调用next方法预激, 使其停留在第一个 yield 位置
                                                                                                                                                                                                                      • notion image
                                                                                                                                                                                                                    • 用协程实现计算平均数的函数
                                                                                                                                                                                                                      • yieldyield from
                                                                                                                                                                                                                        • yield from 实现的协程异步程序晦涩难懂, 在 python3.4 引用 asyncio 标准库之后被弃用yield from 用来驱动子程序中的循环并返回最终值

                                                                                                                                                                                                                    异步 I/O

                                                                                                                                                                                                                    • asyncio(异步)
                                                                                                                                                                                                                      • Python3.4 引入的标准库, 替换 yield from 实现协程异步 IO, 可以更好地实现异步程序 实现原理: 自动维护了一个事件队列, 然后循环访问事件来完成异步的消息维护.
                                                                                                                                                                                                                      • 当前异步实际上有没有提高效率, 也关乎到你调用的第三方是不是异步的.
                                                                                                                                                                                                                        • 这也是当前 python 异步的一个痛点, 就是丰富的第三方库不是都支持 asyncio 的.
                                                                                                                                                                                                                      • 小技巧: 获取异步完成之后的所有返回值 ```null result = loop.run_until_complete(asyncio.gather(*task_array)) print(result)

                                                                                                                                                                                                                      课后作业

                                                                                                                                                                                                                      • 什么是迭代器? 什么是生成器? 两者有什么区别?
                                                                                                                                                                                                                      • 协程的实现原理.
                                                                                                                                                                                                                      • asyncio实现原理
                                                                                                                                                                                                                      • 用协程实现一个计算平均数的函数
                                                                                                                                                                                                                      • 编写一个asyncio异步程序

                                                                                                                                                                                                                        Python7 ---- TCP-IP协议与抓包

                                                                                                                                                                                                                        发布时间 : 2022-01-12 19:06
                                                                                                                                                                                                                        字数: 2k 阅读 :1

                                                                                                                                                                                                                        输入网址后发生了什么

                                                                                                                                                                                                                        • 输入url 统一资源定位器uniform resource locator
                                                                                                                                                                                                                          • url组成 ```null https: 协议:
                                                                                                                                                                                                                            • file:
                                                                                                                                                                                                                          • url作用 定位指定的资源.
                                                                                                                                                                                                                            • url 是 uri 的一个子集, uri 是唯一标识符的意思. 身份证可以是 uri, 但不是 url.
                                                                                                                                                                                                                        • DNS 解析 域名系统Domain Name System, 将域名解析为IP地址
                                                                                                                                                                                                                          • 域名解析流程 域名 (www.baidu.com) -> DNS服务器 -> 返回真实的IP地址36.152.44.96:443 -> 通过IP地址访问服务器
                                                                                                                                                                                                                        • 客户端与服务器建立连接. 客户端和服务端要互相确认身份, 建立连接通道后再发送数据
                                                                                                                                                                                                                        • 客户端正式向服务端发送请求.
                                                                                                                                                                                                                        • 服务端处理请求并返回结果
                                                                                                                                                                                                                        • 浏览器接收到响应后, 做相应的渲染

                                                                                                                                                                                                                        TCP/IP 五层协议

                                                                                                                                                                                                                        notion image
                                                                                                                                                                                                                        img
                                                                                                                                                                                                                        notion image
                                                                                                                                                                                                                        img
                                                                                                                                                                                                                        notion image
                                                                                                                                                                                                                        img
                                                                                                                                                                                                                        • 应用层 为进程 (客户端应用) 和进程 (服务器应用) 之间提供服务. 应用层协议定义了应用之间进行数据交互的方式.
                                                                                                                                                                                                                          • 应用层协议
                                                                                                                                                                                                                            • HTTP/HTTPS(超文本传输协议)
                                                                                                                                                                                                                            • DNS(域名系统)
                                                                                                                                                                                                                            • FTP(文件传输协议)
                                                                                                                                                                                                                            • SMTP(邮箱传输协议)
                                                                                                                                                                                                                        • 传输层 负责向两个主机应用进程的通信提供服务.
                                                                                                                                                                                                                          • 一个主机可以开启不同的应用, 同不同的服务器之间进行通信, 但是都是共用一个传输服务来发送和接受信息 进程 <—> 进程
                                                                                                                                                                                                                        • 传输层协议
                                                                                                                                                                                                                          • TCP(传输控制协议)提供面向连接, (尽可能) 可靠的数据传输服务.
                                                                                                                                                                                                                            • 一对一
                                                                                                                                                                                                                            • 文件传输 (FTP)
                                                                                                                                                                                                                            • 浏览网页 (HTTP)
                                                                                                                                                                                                                          • UDP(用户数据协议)提供无连接的, 不保证数据传输的可靠性
                                                                                                                                                                                                                            • 一对多, 一对一, 多对多…
                                                                                                                                                                                                                            • 直播
                                                                                                                                                                                                                            • 实况游戏,FPS
                                                                                                                                                                                                                        • 网络层 决定了数据的转寄和路径选择, 封装和分组运输层产生的报文段 / 用户数据段
                                                                                                                                                                                                                          • 主机 <—> 主机
                                                                                                                                                                                                                          • 网络层协议
                                                                                                                                                                                                                            • IP 协议
                                                                                                                                                                                                                              • 公网 IP 也就是指的传统 IP 地址, 是唯一的.
                                                                                                                                                                                                                              • 局域网 IP ipconfig
                                                                                                                                                                                                                        • 数据链路层 负责两台主机之间的数据传输, 向网路层提供数据传输服务
                                                                                                                                                                                                                          • 网卡 <—> 网卡
                                                                                                                                                                                                                          • 数据链路层的作用 比特流在传输媒介上传输时肯定有误差, 数据链路层的作用就是检错和纠错
                                                                                                                                                                                                                            • 流量控制
                                                                                                                                                                                                                            • 差错检测
                                                                                                                                                                                                                            • 差错控制
                                                                                                                                                                                                                        • 物理层 物理层再局部局域网上传送数据帧, 在设备节点传输比特流
                                                                                                                                                                                                                          • 光纤 <—> 光纤
                                                                                                                                                                                                                          • 物理层和数据链路层 ```null 物理层才是真正传输数据的, 数据链路层是用来检查数据完整性的.

                                                                                                                                                                                                                          课后作业

                                                                                                                                                                                                                          • 讲清楚浏览器地址栏敲下url发生了什么? 客户端请求一个域名 客户端请求 DNS,域名解析为 IP 返回给客户端 客户端向服务端发送请求,建立连接 服务端处理请求,返回结果 客户端浏览器渲染结果
                                                                                                                                                                                                                          • 五层协议有哪五层, 举例说明. 应用层:http/https/ftp 传输层:TCP/UDP 网络层:数据包的路径选择 数据链路层:提供传输服务 物理层:物理上传输数据帧

                                                                                                                                                                                                                          理解 TCP/IP 协议

                                                                                                                                                                                                                          • 什么是 TCP/IP 协议TCP/IP并不是单个协议, 而是指一组协议的集合, 又称TCP/IP协议族.
                                                                                                                                                                                                                          • TCP/IP 的作用 起到了应用和硬件的之间承上启下的作用.

                                                                                                                                                                                                                            TCP/IP 三次握手

                                                                                                                                                                                                                            为了建立可靠的TCP连接, 尽可能地保证数据传输的正确性.
                                                                                                                                                                                                                            notion image
                                                                                                                                                                                                                            • 三次握手的过程
                                                                                                                                                                                                                              • 客户端向服务端发送带有SYN(同步序列编号)标识的数据包 ————————–服务端确认了客户端的发送能力正常
                                                                                                                                                                                                                              • 服务端向客户端发送了带有SYN-ACK(确认字符)标识的数据包———————–服务端确认了自己接受能力是正常
                                                                                                                                                                                                                              • 客户端向服务端返回带有ACK标识的数据包———————————————–服务端确认了自己发送能力, 客户端接受正常
                                                                                                                                                                                                                            • 第 2 次握手已经传回了ACK, 为什么服务端还要返回SYN? 通知客户端, 接收到的信号确实是发送的信号, 表明了客户端到服务端的通信是正常的.

                                                                                                                                                                                                                            TCP/IP 四次挥手

                                                                                                                                                                                                                            notion image
                                                                                                                                                                                                                            • 四次挥手的过程
                                                                                                                                                                                                                              • 我们以客户端作为主动关闭方来描述四次挥手过程
                                                                                                                                                                                                                              • 客户端向服务端发送了一个FIN(finish)数据包————————————- 关闭客户端到服务端的连接通道
                                                                                                                                                                                                                              • 服务端收到FIN后, 返回了ACK数据包—————————————————- 服务端已经知道了客户端到服务端的连接通道已关闭
                                                                                                                                                                                                                              • 服务端发送FIN数据包至客户端, 关闭与客户端的连接——————————目的是关闭服务端到客户端的连接通道
                                                                                                                                                                                                                              • 客户端返回ACK数据包确认——————————————————————通知服务端客户端已经知道了服务端到客户端之间的连接通道已关闭

                                                                                                                                                                                                                            HTTPS

                                                                                                                                                                                                                            notion image
                                                                                                                                                                                                                            • https 加密的过程
                                                                                                                                                                                                                              • 客户端向服务端发送通信请求
                                                                                                                                                                                                                              • 服务端返回给客户端证书和密钥
                                                                                                                                                                                                                              • 客户端通过 CA 中心验证证书的真实性
                                                                                                                                                                                                                              • 客户端完成认证之后, 使用公钥对发送数据进行加密, 发送给服务端.
                                                                                                                                                                                                                                • 非对称加密 ```null 16 = 2_ 8 也可以是 4 _ 4 公钥就是拿到了 16 这个结果 私钥就是某个因数 2 通过这样的方式才可以得出唯一解 8
                                                                                                                                                                                                                                • 服务端收到加密后的请求数据后, 使用私钥进行解密.
                                                                                                                                                                                                                                • 服务器和客户端使用对称加密进行通信
                                                                                                                                                                                                                              • 中间人攻击
                                                                                                                                                                                                                                • notion image
                                                                                                                                                                                                                                  插入到客户端和服务端之间的通信, 对服务端伪造客户端, 对客户端伪造服务端, 拦截通信产生的数据.
                                                                                                                                                                                                                                • 产生的条件 我们的客户端要主动信任中间人的证书

                                                                                                                                                                                                                              课后作业

                                                                                                                                                                                                                              • 讲述 TCP/IP 三次握手
                                                                                                                                                                                                                              • 讲述 TCP/IP 四次挥手
                                                                                                                                                                                                                              • 讲述 HTTPS 加密的过程

                                                                                                                                                                                                                              抓包

                                                                                                                                                                                                                              抓包其实就是中间人攻击, 只是我们会主动信任像 fiddler 这样的代理软件. 对于服务端, 它伪装成客户端. 对于客户端, 它伪装成服务端.
                                                                                                                                                                                                                              • web 端抓包 现代互联网环境几乎都是 https 协议的网站
                                                                                                                                                                                                                                • 信任证书
                                                                                                                                                                                                                                  • notion image
                                                                                                                                                                                                                                    Qi3lw.png
                                                                                                                                                                                                                              • App 端抓包
                                                                                                                                                                                                                                • 打开远程终端连接
                                                                                                                                                                                                                                  • notion image
                                                                                                                                                                                                                                    QinkU.png
                                                                                                                                                                                                                                  Rules -> Options -> Connections -> Allow remote computes to connect
                                                                                                                                                                                                                                • 把手机 / 模拟器的代理指向 fiddler
                                                                                                                                                                                                                                  • wifi 调出设置的时候要长按
                                                                                                                                                                                                                                  • 查看当前 fiddler 所在 pc 本地局域网 ip
                                                                                                                                                                                                                                    • ipconfig/ifconfig
                                                                                                                                                                                                                                • 在代理项中填写 ip 地址和 fiddler 端口, 默认是 8888
                                                                                                                                                                                                                                • 信任证书
                                                                                                                                                                                                                                • App 有一定的反爬措施, 第一件事就是修改请求协议
                                                                                                                                                                                                                                  • 双向验证 需要客户端也带上证书
                                                                                                                                                                                                                                • 解决请求协议上的反爬措施
                                                                                                                                                                                                                                  • 安装 VirtualXposed_0.18.2, JustTrustMe

                                                                                                                                                                                                                              模拟请求

                                                                                                                                                                                                                              • PostMan 简单使用
                                                                                                                                                                                                                                • GET
                                                                                                                                                                                                                                • POST
                                                                                                                                                                                                                                  • form_data 参数表单
                                                                                                                                                                                                                                  • x-www-form-urlencoded 如果 headers 中 content-type 为x-www-form-urlencoded, 那么我们需要在当前选项下填写参数
                                                                                                                                                                                                                                  • raw请求的真实 body 内容
                                                                                                                                                                                                                              需要注意下 x-www-form-urlencoded POST 时的问题,需要赶写 raw 进行一层转换,才能获取到真实的数据,或者直接使用 raw

                                                                                                                                                                                                                              课后作业

                                                                                                                                                                                                                              • 学会用 fiddler 抓包 https 请求
                                                                                                                                                                                                                              • 学会用 fiddler 抓包手机 app 中的请求
                                                                                                                                                                                                                              • 学会使用 postman 模拟 GET, POST 请求.

                                                                                                                                                                                                                              转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 438803792@qq.com http://localhost:4000/2022/01/12/Python7%20—-%20TCP-IP%E5%8D%8F%E8%AE%AE%E4%B8%8E%E6%8A%93%E5%8C%85/

                                                                                                                                                                                                                              Python8 ---- 数据库基础

                                                                                                                                                                                                                              发布时间 : 2022-01-12 19:06
                                                                                                                                                                                                                              字数: 2.1k 阅读 :2

                                                                                                                                                                                                                              数据库的基本介绍

                                                                                                                                                                                                                              • 关系型数据库 创建在关系模型基础上的数据库, 用来存储和管理结构化的数据.
                                                                                                                                                                                                                                • 关系模型 QmLj4.jpg
                                                                                                                                                                                                                                  • 在关系型数据库当中, 可以用三张数据表来表示
                                                                                                                                                                                                                                    1. 学生表
                                                                                                                                                                                                                                    1. 图书表
                                                                                                                                                                                                                                    1. 借阅表 (记录行为)
                                                                                                                                                                                                                                    notion image
                                                                                                                                                                                                                                • 关系型数据库的特点 (也就是事务的特点)
                                                                                                                                                                                                                                  • ACID
                                                                                                                                                                                                                                    • Atomic(原子性) 指事务的操作是不可分割的, 要么完成, 要么不完成. 不存在其他的中间态
                                                                                                                                                                                                                                      • Consistence(一致性) 事务 A 和事务 B 同时运行, 无论谁先结束, 数据库都会到达一致.
                                                                                                                                                                                                                                        • Isolation(隔离性) 解决多个事务同时对数据进行读写和修改的能力.
                                                                                                                                                                                                                                        • Duration(持久性) 当某个事务一旦提交, 无论数据库崩溃还是其他原因, 该事务的结果都能够被持久化地保存下来.
                                                                                                                                                                                                                                      • 适用场景 考虑到事务和日志
                                                                                                                                                                                                                                        • 对数据完整性有要求.
                                                                                                                                                                                                                                        • 存储的数据结构化完整.
                                                                                                                                                                                                                                        • 单个数据库服务实例可以满足需求.
                                                                                                                                                                                                                                          • 建立集群方案, 大多需要适用企业版, 企业版收费高昂.
                                                                                                                                                                                                                                        • 读表操作远远大于写表操作.
                                                                                                                                                                                                                                    • 非关系型数据库 (Nosql, not noly sql) 创建在Nosql系统存储 (键对值) 基础上的数据库, 既可以存储结构化的数据, 也可以存储非结构化的数据.

                                                                                                                                                                                                                                    Mysql 数据库的安装 (服务端)

                                                                                                                                                                                                                                    数据库分为服务端和客户端
                                                                                                                                                                                                                                    • windows
                                                                                                                                                                                                                                      • ubuntu
                                                                                                                                                                                                                                        • mac

                                                                                                                                                                                                                                          Navicat 的安装和使用 (客户端)

                                                                                                                                                                                                                                          • windows&ubuntu
                                                                                                                                                                                                                                            • mac

                                                                                                                                                                                                                                              Mysql 数据库的基本使用

                                                                                                                                                                                                                                              • 连接
                                                                                                                                                                                                                                                • localhost
                                                                                                                                                                                                                                                  • 填写主机的时候就是填写 ip 地址 localhost 对应的地址约等于127.0.0.1
                                                                                                                                                                                                                                              • 数据库 (database)
                                                                                                                                                                                                                                                • Create
                                                                                                                                                                                                                                                  • 设置字符集
                                                                                                                                                                                                                                                    • utf8utf8mb4mysqlutf8字符是不全的, utf8mb4才是和我们 python 中的utf-8字符集一致.
                                                                                                                                                                                                                                                    • 排序规则 选择默认的utf8mb4_general_ci
                                                                                                                                                                                                                                                • Retrieve
                                                                                                                                                                                                                                                  • Update
                                                                                                                                                                                                                                                    • Delete
                                                                                                                                                                                                                                                    • 数据表 (table)
                                                                                                                                                                                                                                                      • Create
                                                                                                                                                                                                                                                        • Retrieve
                                                                                                                                                                                                                                                          • Update
                                                                                                                                                                                                                                                            • Delete
                                                                                                                                                                                                                                                              • 只删除数据, 不删除表 ```null truncate 表名

                                                                                                                                                                                                                                                            课后作业

                                                                                                                                                                                                                                                            • 什么是关系型数据表, 什么是非关系型数据表, 他们有什么区别, 各有什么应用场景.
                                                                                                                                                                                                                                                            • 什么是事务, 事务的特点.
                                                                                                                                                                                                                                                            • 完成 Mysql 服务端和 Navicat 的安装.
                                                                                                                                                                                                                                                            • 完成数据库和数据表的基础操作.

                                                                                                                                                                                                                                                            常用的数据类型

                                                                                                                                                                                                                                                            • int 数字范围2**32 ~ 2**32-1
                                                                                                                                                                                                                                                            • bigint 数字范围2**63 ~ 2 ** 63-1
                                                                                                                                                                                                                                                            • float
                                                                                                                                                                                                                                                              • double
                                                                                                                                                                                                                                                                • decimal涉及金额的时候使用 decimal

                                                                                                                                                                                                                                                                • char 表示固定长度的字符串, 长度为 255 个字节
                                                                                                                                                                                                                                                                  • 中文字符占据 3~4 个字节
                                                                                                                                                                                                                                                                • varchar 表示不定长的字符串, 长度为0~65535个字节
                                                                                                                                                                                                                                                                • TEXT 长文本类型, 最大长度占据64kb
                                                                                                                                                                                                                                                                  • 在 mysql 中一般不建议使用大文体来存储,推荐使用 Nosql 键值存储,除非需求

                                                                                                                                                                                                                                                                • datetime如果当前时区发生更改, datetime 类型不会发生更改, 与存入的日期保持一致
                                                                                                                                                                                                                                                                • timestamp 如果当前时区发生更改, timestamp 类型会跟着时区更改.

                                                                                                                                                                                                                                                                常用的运算符

                                                                                                                                                                                                                                                                • 算术运算符
                                                                                                                                                                                                                                                                  • +
                                                                                                                                                                                                                                                                  • /
                                                                                                                                                                                                                                                                  • div 取商 ```null SELECT 5 div 3
                                                                                                                                                                                                                                                                    • mod 取余 ```null SELECT 5 mod 3
                                                                                                                                                                                                                                                                    • 比较运算符
                                                                                                                                                                                                                                                                      • `=````null 类似 python 中的 ==
                                                                                                                                                                                                                                                                        • SELECT 1 =1
                                                                                                                                                                                                                                                                      • !=
                                                                                                                                                                                                                                                                      • >>=
                                                                                                                                                                                                                                                                      • <<=
                                                                                                                                                                                                                                                                      • between 与 `not between````null SELECT 2 not between 1 and 3
                                                                                                                                                                                                                                                                        • is nullis not null 用来判断当前是否有记录
                                                                                                                                                                                                                                                                      • 逻辑运算符
                                                                                                                                                                                                                                                                        • NOT
                                                                                                                                                                                                                                                                        • AND
                                                                                                                                                                                                                                                                        • OR
                                                                                                                                                                                                                                                                        • XOR(了解) 异或, 两个值一个 True, 一个为 False, 当前表达式才为 True

                                                                                                                                                                                                                                                                      常用的函数

                                                                                                                                                                                                                                                                      • 算术运算
                                                                                                                                                                                                                                                                        • SUM 求和
                                                                                                                                                                                                                                                                        • AVG 平均数
                                                                                                                                                                                                                                                                        • MAX 和 MIN```null 对字符串进行操作时, 类似 python 的排序, 是根据 ascii 码来排序的.
                                                                                                                                                                                                                                                                          • COUNT```null 计算当前记录数 SELECT count(*) from test
                                                                                                                                                                                                                                                                          • 字符处理
                                                                                                                                                                                                                                                                            • CHAR_LENGTH```null SELECT CHAR_LENGTH(“test”)
                                                                                                                                                                                                                                                                              • FORMAT 格式化 ```null SELECT FORMAT(0.333333,2)
                                                                                                                                                                                                                                                                                • LEFT 和 RIGHT```null SELECT right(“abcdefg”, 2)
                                                                                                                                                                                                                                                                                  • TRIM```null SELECT trim(“abcdefg”)

                                                                                                                                                                                                                                                                                  课后作业

                                                                                                                                                                                                                                                                                  • 通过 navicat 建表, 包含当前常用的数据类型.```null INSERT INTO test(float_field, double_field) values(123.22, 123123.22)
                                                                                                                                                                                                                                                                                    • 练习常用的运算符
                                                                                                                                                                                                                                                                                    • 练习常用的函数
                                                                                                                                                                                                                                                                                    > 创建表的时候尽量加上 create_time 字段, 为 create_time 设置默认值 CURRENT_TIMESTAMP

                                                                                                                                                                                                                                                                                    CRUD 操作

                                                                                                                                                                                                                                                                                    • Create(增)
                                                                                                                                                                                                                                                                                      • 单条插入
                                                                                                                                                                                                                                                                                        • 多条插入
                                                                                                                                                                                                                                                                                        • Retrieve(查)
                                                                                                                                                                                                                                                                                          • 获取所有记录
                                                                                                                                                                                                                                                                                            • 条件查询 (WHERE, AND , OR)
                                                                                                                                                                                                                                                                                              • 模糊匹配 (LIKE, %)
                                                                                                                                                                                                                                                                                                • 模糊匹配有性能问题, 表记录如果比较多, 查询速度很慢
                                                                                                                                                                                                                                                                                              • 限制返回条数 (LIMIT)
                                                                                                                                                                                                                                                                                                • 过滤重复值 (DISTINCT) 对查询的结果进行过滤.
                                                                                                                                                                                                                                                                                                  • 如果指定多个字段, 会对多个字段联合进行过滤
                                                                                                                                                                                                                                                                                                • 排序问题对查询的结果进行排序
                                                                                                                                                                                                                                                                                                  • 升序 (ASC) 数据库默认是升序的
                                                                                                                                                                                                                                                                                                    • 降序 (DESC)
                                                                                                                                                                                                                                                                                                    • 获取查询结果的条数 (COUNT)
                                                                                                                                                                                                                                                                                                    • Update(更新)
                                                                                                                                                                                                                                                                                                      • Delete(删除)

                                                                                                                                                                                                                                                                                                        集合操作

                                                                                                                                                                                                                                                                                                        notion image
                                                                                                                                                                                                                                                                                                        • 并集UNION 子语句 SELECT 必须拥有相同数量的列 (字段), 且列的数据类型也相同
                                                                                                                                                                                                                                                                                                          • 若多个字段,也会对多个字段进行匹配
                                                                                                                                                                                                                                                                                                        • 交集 (JOIN, INNER JOIN)
                                                                                                                                                                                                                                                                                                          • 差集(LEFT JOIN, RIGHT JOIN)
                                                                                                                                                                                                                                                                                                            • A 对 B 的差集 (LEFT JOIN)
                                                                                                                                                                                                                                                                                                              • B 对 A 的差集 (RIGHT JOIN)
                                                                                                                                                                                                                                                                                                              • 补集
                                                                                                                                                                                                                                                                                                                • A 与 B 的补集 = A 与 B 的并集 - A 与 B 的交集
                                                                                                                                                                                                                                                                                                                  A 与 B 的补集 = A 对 B 的差集 + B 对 A 的差集 √

                                                                                                                                                                                                                                                                                                              课后作业

                                                                                                                                                                                                                                                                                                              • 练习 CRUD 操作
                                                                                                                                                                                                                                                                                                              • 练习集合操作

                                                                                                                                                                                                                                                                                                              转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 438803792@qq.com http://localhost:4000/2022/01/12/Python8%20—-%20%E6%95%B0%E6%8D%AE%E5%BA%93%E5%9F%BA%E7%A1%80/

                                                                                                                                                                                                                                                                                                              Python9 ---- 数据库进阶

                                                                                                                                                                                                                                                                                                              tip: 通过 desc 表名命令查看当前表信息
                                                                                                                                                                                                                                                                                                              tip2: as 关键字可以为我们的字段或者表取别名

                                                                                                                                                                                                                                                                                                              Mysql 约束

                                                                                                                                                                                                                                                                                                              顾名思义就是对表中的数据进行限定, 目的是保证数据的正确性, 有效性和完整性
                                                                                                                                                                                                                                                                                                              • 主键约束primary key
                                                                                                                                                                                                                                                                                                                • 什么是主键 关系表中记录的唯一标识(不能为 null, 不可重复)
                                                                                                                                                                                                                                                                                                                  • 选取和业务无关的字段, 常用的主键就是自增 id
                                                                                                                                                                                                                                                                                                                    数据库引擎会通过主键建立索引, 索引是一个有序结构, 我们希望当前主键的值不要改变, 避免重新建立索引, 影响性能.
                                                                                                                                                                                                                                                                                                                • 添加主键
                                                                                                                                                                                                                                                                                                                  • 建表时添加
                                                                                                                                                                                                                                                                                                                    • 通过可视化界面操作 (建议)
                                                                                                                                                                                                                                                                                                                  • 主键的长度限制767bytes, 对应的长度为767/4=191
                                                                                                                                                                                                                                                                                                                    • bytes 表示字节, 一个 utf8mb4 按四个字节算, 所以长度最大为 191
                                                                                                                                                                                                                                                                                                                  • 自增键必须为主键
                                                                                                                                                                                                                                                                                                                    • 联合主键 主键其实只能有一个, 如果在图形界面当中选择多个字段作为主键, 那么程序会自动帮我们创建联合主键
                                                                                                                                                                                                                                                                                                                    • 修改主键
                                                                                                                                                                                                                                                                                                                      • 添加主键 ``null ALTER TABLE store_perf ADD PRIMARY KEY (id`)
                                                                                                                                                                                                                                                                                                                        • 移除主键 ```null ALTER TABLE store_perf DROP PRIMARY KEY
                                                                                                                                                                                                                                                                                                                          • 添加联合主键 ``null ALTER TABLE store_perf ADD PRIMARY KEY (id,store_name`)
                                                                                                                                                                                                                                                                                                                        • 非空约束 (空白和 null 是两个概念)NOT NULL
                                                                                                                                                                                                                                                                                                                          • 只能约束程序层面上没有操作该表中的某个字段, 不能约束人行为上对其赋值为空白字符.
                                                                                                                                                                                                                                                                                                                        • 唯一约束UNIQUE
                                                                                                                                                                                                                                                                                                                          • NULL 可以重复
                                                                                                                                                                                                                                                                                                                            比如统计店铺业绩, 该店铺不可以重复, 那就可以使用唯一约束
                                                                                                                                                                                                                                                                                                                        • 外键约束foreign key
                                                                                                                                                                                                                                                                                                                          • 外键的作用 保持数据的一致性和完整性, 通过外键来表达主表和从表的关系, 避免冗余字段.
                                                                                                                                                                                                                                                                                                                          • 为什么现在不用外键了?
                                                                                                                                                                                                                                                                                                                            • 性能问题 插数据需要校验
                                                                                                                                                                                                                                                                                                                            • 并发问题 在高并发的事务场景下, 使用外键容易造成死锁.
                                                                                                                                                                                                                                                                                                                            • 扩展性问题
                                                                                                                                                                                                                                                                                                                              • 外键就相当于把对象之间的关系交给数据库来维护, 如果遇到分库分表, 外键是不生效的.
                                                                                                                                                                                                                                                                                                                              • 作数据迁移时, 触发器, 存储过程和外键都很难迁移, 增加了维护成本.
                                                                                                                                                                                                                                                                                                                            • 维护成本
                                                                                                                                                                                                                                                                                                                              • 需要有专业 DBA 来维护庞大的数据库关系
                                                                                                                                                                                                                                                                                                                        • default 默认约束, 默认会填充当前字段.
                                                                                                                                                                                                                                                                                                                          • 如果我们没有给一个有默认约束的字段 create_time 值, 那么该字段会默认填充 CURRENT_TIMESTAMP

                                                                                                                                                                                                                                                                                                                        分组查询GROUP BY

                                                                                                                                                                                                                                                                                                                        将数据按某个字段进行分组, 配合SUM, AVG, COUNT, MAX, MIN等聚合函数做统计使用

                                                                                                                                                                                                                                                                                                                        课后作业

                                                                                                                                                                                                                                                                                                                        • 简单使用 Mysql 约束, 并举例说明使用场景.
                                                                                                                                                                                                                                                                                                                        • 练习使用分组查询.

                                                                                                                                                                                                                                                                                                                        变量声明

                                                                                                                                                                                                                                                                                                                        • 服务器系统变量
                                                                                                                                                                                                                                                                                                                          • 通过@@来调用系统变量 ```null
                                                                                                                                                                                                                                                                                                                            • SHOW VARIABLES SELECT @@date_format
                                                                                                                                                                                                                                                                                                                        • 用户变量
                                                                                                                                                                                                                                                                                                                          • 通过@来调用用户变量 ```null
                                                                                                                                                                                                                                                                                                                            • SELECT @yesterday
                                                                                                                                                                                                                                                                                                                              SET @yesterday=subdate(CURRENT_DATE, 1);
                                                                                                                                                                                                                                                                                                                              SET @yesterday=DATE_FORMAT(@yesterday, “%Y/%m/%d”);
                                                                                                                                                                                                                                                                                                                              SET @amount=0.4; SET @amount=CAST(@amount as DECIMAL(15, 3)); SELECT @amount
                                                                                                                                                                                                                                                                                                                        • 局部变量
                                                                                                                                                                                                                                                                                                                          • 不需要@前缀
                                                                                                                                                                                                                                                                                                                          • 需要事先进行变量类型的声明和初始化

                                                                                                                                                                                                                                                                                                                        存储过程

                                                                                                                                                                                                                                                                                                                        简单地认为是SQL中的函数
                                                                                                                                                                                                                                                                                                                        • 声明一个存储过程
                                                                                                                                                                                                                                                                                                                          • 创建存储过程
                                                                                                                                                                                                                                                                                                                            • 每一句语句结束之后都要添加分号 `;````null CREATE PROCEDURE stat_store_perf(days INT) BEGIN DECLARE t_date VARCHAR(255); set t_date = DATE_FORMAT(subdate(CURRENT_DATE, days), ‘%Y-%m-%d’); SELECT count(*) as 店铺数, FORMAT(AVG(amount), 2) as 平均业绩, SUM(amount) as 总业绩, MAX(amount) as 最大业绩, MIN(amount) as 最小业绩, department as 部门 FROM store_perf WHERE sta_date=t_date GROUP BY department; END
                                                                                                                                                                                                                                                                                                                          • 调用存储过程
                                                                                                                                                                                                                                                                                                                            • 删除存储过程

                                                                                                                                                                                                                                                                                                                              触发器

                                                                                                                                                                                                                                                                                                                              和存储过程一样, 都是嵌入到mysql中的一段程序, 区别就是存储过程需要显式调用, 而触发器式根据对表的相关操作自动激活执行.
                                                                                                                                                                                                                                                                                                                              • 创建触发器
                                                                                                                                                                                                                                                                                                                                • 触发器的应用 多用来检查字段
                                                                                                                                                                                                                                                                                                                                • 查看触发器
                                                                                                                                                                                                                                                                                                                                  • 建议通过客户端删除
                                                                                                                                                                                                                                                                                                                                • 删除触发器
                                                                                                                                                                                                                                                                                                                                  • 建议通过客户端删除

                                                                                                                                                                                                                                                                                                                                课后作业

                                                                                                                                                                                                                                                                                                                                • 重点掌握用户变量, 练习变量的赋值和使用
                                                                                                                                                                                                                                                                                                                                • 练习存储过程 (能自行完整地写出一个函数)
                                                                                                                                                                                                                                                                                                                                • 练习触发器 (只要求操作几次)

                                                                                                                                                                                                                                                                                                                                用 python 连接数据库

                                                                                                                                                                                                                                                                                                                                • pymysql
                                                                                                                                                                                                                                                                                                                                  • 连接数据库
                                                                                                                                                                                                                                                                                                                                    • 数据库设置
                                                                                                                                                                                                                                                                                                                                      • 连接
                                                                                                                                                                                                                                                                                                                                      • 执行 SQL 语句
                                                                                                                                                                                                                                                                                                                                        • 单条执行
                                                                                                                                                                                                                                                                                                                                          • 执行时间 15.31s
                                                                                                                                                                                                                                                                                                                                        • 多条执行
                                                                                                                                                                                                                                                                                                                                          • 如果其中有一条记录报错, 那么整个 values 插入都会失败
                                                                                                                                                                                                                                                                                                                                          • 获取返回值
                                                                                                                                                                                                                                                                                                                                            • 返回的是一个元组, 元组中表示记录的也是一个元组

                                                                                                                                                                                                                                                                                                                                          索引和优化

                                                                                                                                                                                                                                                                                                                                          • 创建索引 CREATE INDEX store_name_index ON store_perf(store_name) ```
                                                                                                                                                                                                                                                                                                                                            • 未建索引: 0.287s
                                                                                                                                                                                                                                                                                                                                              建了索引后: 0.016s
                                                                                                                                                                                                                                                                                                                                            • 设置索引的字段不可以超过 191 个字符长度, 也就是 767 个 bytes ``` CREATE INDEX 索引名 ON 表名 (字段 1, 字段 2…)
                                                                                                                                                                                                                                                                                                                                          • 创建联合索引
                                                                                                                                                                                                                                                                                                                                            • 查看索引
                                                                                                                                                                                                                                                                                                                                              • 删除索引
                                                                                                                                                                                                                                                                                                                                                • 查看当前查询语句有没有命中索引
                                                                                                                                                                                                                                                                                                                                                  • EXPLAIN 语句查看当前语句执行性能
                                                                                                                                                                                                                                                                                                                                                  • 如果 key 有值, 说明命中了索引, 且 key 值为索引名
                                                                                                                                                                                                                                                                                                                                                • 单个字段可以命中联合索引吗? 联合索引涉及到一个叫左缀查询的规则
                                                                                                                                                                                                                                                                                                                                                  • 如果想命中索引, 查询语句中涉及到字段必须是联合索引创建时从左到右顺序
                                                                                                                                                                                                                                                                                                                                                  • 原理 在a_b_c_index这样一个联合索引当中, 实质执行中是先查出a的结果集, 然后再查bc的结果集 (第一个字段匹配,才匹配后面的子字段)
                                                                                                                                                                                                                                                                                                                                                • 索引的实现原理 B + 树, 一种特殊的链表, 用来实现二分查找.

                                                                                                                                                                                                                                                                                                                                                如何优化 mysql

                                                                                                                                                                                                                                                                                                                                                • 合理地建立索引
                                                                                                                                                                                                                                                                                                                                                  • 频繁作为查询条件的字段应该建立索引
                                                                                                                                                                                                                                                                                                                                                  • 唯一性太差的字段不适合单独建立索引
                                                                                                                                                                                                                                                                                                                                                  • 更新非常频繁的字段不适合建立索引
                                                                                                                                                                                                                                                                                                                                                  • 避免不经过索引的操作
                                                                                                                                                                                                                                                                                                                                                    • not in, !=等反向逻辑
                                                                                                                                                                                                                                                                                                                                                    • BETWEEN范围查找
                                                                                                                                                                                                                                                                                                                                                    • or逻辑两边都必须命中索引才会走索引
                                                                                                                                                                                                                                                                                                                                                    • 联合索引, 不按左缀查询规则
                                                                                                                                                                                                                                                                                                                                                • 加缓存
                                                                                                                                                                                                                                                                                                                                                  • 数据库缓存
                                                                                                                                                                                                                                                                                                                                                    • 用 redis 做缓存
                                                                                                                                                                                                                                                                                                                                                    • 换固态硬盘

                                                                                                                                                                                                                                                                                                                                                    事务

                                                                                                                                                                                                                                                                                                                                                    • 事务的提交, 回滚
                                                                                                                                                                                                                                                                                                                                                      • 业务中使用事务
                                                                                                                                                                                                                                                                                                                                                        • 将 class_2 中的同学转移到 class_1, 如果 SQL_2 报错, 会导致 class_2 中的同学丢失.

                                                                                                                                                                                                                                                                                                                                                      课后作业

                                                                                                                                                                                                                                                                                                                                                      • 练习pymysql的使用, 报错单语句执行, 多语句执行, 查询语句, 事务的使用 ``` bash import pymysql import random import time from base.fun.time_deco import time_deco
                                                                                                                                                                                                                                                                                                                                                      MYSQL_CONF = { “host”: “127.0.0.1”, “user”: “root”, “password”: “1”, “db”: “test” }
                                                                                                                                                                                                                                                                                                                                                      mysql_con = pymysql.connect(**MYSQL_CONF)
                                                                                                                                                                                                                                                                                                                                                      mysql_cursor = mysql_con.cursor()
                                                                                                                                                                                                                                                                                                                                                      @time_deco def create_table(): SQL = f”””CREATE TABLE if not exists store_perf (id int(11) NOT NULL AUTO_INCREMENT,store_name varchar(191) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL,department varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL,amount decimal(15, 2) NULL DEFAULT NULL,sta_date varchar(191) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL,create_time datetime(0) NOT NULL DEFAULT current_timestamp(), PRIMARY KEY (id) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; “”” mysql_cursor.execute(SQL) mysql_con.commit()
                                                                                                                                                                                                                                                                                                                                                      def delete_table(): SQL = ‘’’truncate table store_perf;’’’
                                                                                                                                                                                                                                                                                                                                                      @time_deco def insert_one(): for i in range(10 ** 2): store_name = f” 店铺_{i}” # 生成资金 amount = format(random.uniform(10 ** 3, 10 ** 6), ‘.2f’) department = f” 事业部_{random.randint(1, 10)}” sta_date = time.strftime(“%Y-%m-%d”)
                                                                                                                                                                                                                                                                                                                                                      @time_deco def insert_many(): values = [] for i in iter(range(10 ** 2)): store_name = f” 店铺_{i}” amount = format(random.uniform(10 ** 3, 10 ** 6), ‘.2f’) department = f” 事业部_{random.randint(1, 10)}” sta_date = time.strftime(“%Y-%m-%d”) values.append((store_name, amount, department, sta_date))
                                                                                                                                                                                                                                                                                                                                                      def get_shops(): SQL = “select store_name, amount, sta_date from store_perf where department=’事业部_1’ LIMIT 2” mysql_cursor.execute(SQL) # 获取返回值 query_set = mysql_cursor.fetchall() print(query_set)
                                                                                                                                                                                                                                                                                                                                                      if name == ‘main‘: # create_table() # delete_table() # insert_one() # insert_many() get_shops()
                                                                                                                                                                                                                                                                                                                                                      ```
                                                                                                                                                                                                                                                                                                                                                      • 练习索引的创建
                                                                                                                                                                                                                                                                                                                                                      • 将索引的内容背诵

                                                                                                                                                                                                                                                                                                                                                      转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 438803792@qq.com http://localhost:4000/2022/01/12/Python9%20—-%20%E6%95%B0%E6%8D%AE%E5%BA%93%E8%BF%9B%E9%98%B6/

                                                                                                                                                                                                                                                                                                                                                      Python10 ---- 前端基础与爬虫

                                                                                                                                                                                                                                                                                                                                                      一个请求的组成

                                                                                                                                                                                                                                                                                                                                                      • 请求行 (request line)
                                                                                                                                                                                                                                                                                                                                                        • URL
                                                                                                                                                                                                                                                                                                                                                        • 请求方法 (method)
                                                                                                                                                                                                                                                                                                                                                      • 请求头 (headers)
                                                                                                                                                                                                                                                                                                                                                        • user-agent 用来指示当前请求时从哪个终端发起的
                                                                                                                                                                                                                                                                                                                                                        • cookie 用来指示当前的用户信息和行为信息
                                                                                                                                                                                                                                                                                                                                                      • 请求体 (body)
                                                                                                                                                                                                                                                                                                                                                        • params(严格来说不算是请求体) 实际请求的时候会变成 URL 的一部分, 所以说 post 请求也可以用params
                                                                                                                                                                                                                                                                                                                                                          • urlencode 和 urldecode 请求头中指定的编码格式只对请求体是有效的, 不对 params 有效. 所以 urlencode 来保证 URL 不会发生编码问题.```null from urllib.parse import quote, unquote
                                                                                                                                                                                                                                                                                                                                                            • print(quote(“鼠标”)) print(unquote(“%E9%BC%A0%E6%A0%87”))
                                                                                                                                                                                                                                                                                                                                                        • data 携带额外的请求信息.

                                                                                                                                                                                                                                                                                                                                                      静态页面和动态页面

                                                                                                                                                                                                                                                                                                                                                      • 静态页面 纯粹的 HTML 文件, 简单地说当前的页面文件就存储在服务端, 我们请求的静态页面实际上就是请求对方服务器中的文件. 通过返回不同的 HTML 文件来完成不同请求的显示效果.
                                                                                                                                                                                                                                                                                                                                                        • 动态页面和静态页面的区分绝不是指页面上的动画效果
                                                                                                                                                                                                                                                                                                                                                        • 最见的就是各大企业网站
                                                                                                                                                                                                                                                                                                                                                      • 动态页面 动态页面是指除了 HTML 以外, 通过ajax在不直接刷新页面的前提下, 完成了和服务端的数据交互. 并通过javascript回调函数完成对页面内容的修改, ajax和服务端交互的数据格式通常为json
                                                                                                                                                                                                                                                                                                                                                        • 浏览商品
                                                                                                                                                                                                                                                                                                                                                          视频网站的瀑布流
                                                                                                                                                                                                                                                                                                                                                        • Ajax 在不直接刷新页面的前提下, 完成了和服务端的数据交互. 并通过javascript回调函数完成对页面内容的修改, ajax和服务端交互的数据格式通常为json.
                                                                                                                                                                                                                                                                                                                                                          • asynchronous JavaScript-XML 异步 javascript 和 xml 的缩写
                                                                                                                                                                                                                                                                                                                                                        • json js 对象标记法, 用来表示对象关系
                                                                                                                                                                                                                                                                                                                                                          • js 中的对象: {a: 1, b: null}
                                                                                                                                                                                                                                                                                                                                                          • json 的作用 是一种跨平台跨语言的传输对象格式, 可以保留一些基础的数据类型信息.
                                                                                                                                                                                                                                                                                                                                                            • 原来 json 只是作为前端和服务端传输数据的格式规范, 但是现在几乎所有热门语言都内置了 json, 所以可以称之为跨语言的传输格式

                                                                                                                                                                                                                                                                                                                                                      HTML, CSS 和 JS

                                                                                                                                                                                                                                                                                                                                                      html 和 js 决定了显示的内容, css 决定了怎么显示.
                                                                                                                                                                                                                                                                                                                                                      • HTML(HyperTextMarkup Language 超文本标记语言)
                                                                                                                                                                                                                                                                                                                                                        • HTML 的作用 定义网页的内容的含义和结构.
                                                                                                                                                                                                                                                                                                                                                          • tag(标签)<标签名>
                                                                                                                                                                                                                                                                                                                                                            • <html> 表示当前是一个 HTML 文档对象
                                                                                                                                                                                                                                                                                                                                                            • <head> 提供一些基础信息
                                                                                                                                                                                                                                                                                                                                                              • <body> 纯内容
                                                                                                                                                                                                                                                                                                                                                            • element(元素)<标签名> xxxxxxxxxx</ 标签名 >
                                                                                                                                                                                                                                                                                                                                                        • CSS(Cascading Style Sheets 层叠样式表) 能对网页中的元素位置的排版进行像素级别的控制. 页面的渲染主要就是通过css来完成的.
                                                                                                                                                                                                                                                                                                                                                        • JavaScript 通过<script></script>包裹, 主要完成数据的交互和对 DOM 树 (HTML 是一个结构化的数据文件, DOM 就是将结构化的数据转变成对象) 的修改.

                                                                                                                                                                                                                                                                                                                                                        浏览器渲染的过程

                                                                                                                                                                                                                                                                                                                                                        • 接收到 HTML 文件后开始构建 DOM(Doucment Object Model) 树.
                                                                                                                                                                                                                                                                                                                                                        • CSS 来计算 DOM 树各个节点的坐标, 大小等 CSS 属性, 开始布局.
                                                                                                                                                                                                                                                                                                                                                        • 开始加载媒体资源和页面渲染.

                                                                                                                                                                                                                                                                                                                                                        课后作业

                                                                                                                                                                                                                                                                                                                                                        • 完成京东搜索页面的请求并保存为 HTML 格式文件 (10 个即可, 请求频繁容易被封)```null f = open(“search_keyword.html”, “w”, encoding=“utf-8”)
                                                                                                                                                                                                                                                                                                                                                          • 完成京东详情页面的请求并保存为 HTML 格式文件 (10 个即可, 请求频繁容易被封) ``` bash import requests
                                                                                                                                                                                                                                                                                                                                                          def request_jd(keyword): url = “https://search.jd.com/Search" params = { “keyword”: keyword } # 请求头 headers = { # 指客户端使用什么软件访问,或发起的 # cookice 用户或设备的身份信息,仅有真实的身份才会有 cookice “user-agent”: “Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36” } # 请求体 params 严格说不属于请求体,而 data 是,可以携带额外的请求信息. response = requests.get(url=url, params=params, headers=headers) # response.text # 获取 str 类型的响应内容 # response.content #获取 bytes 类型的响应内容 #有乱码可调试 # response.json() # 获取 json 格式数据 result = response.text # print(result) file_name = keyword with open(f’search_keyword_{file_name}.html’, “w”, encoding=”utf-8”) as f: f.write(result + “\n”)
                                                                                                                                                                                                                                                                                                                                                          if name == ‘main‘: task_array = [“鼠标”, “键盘”, “显卡”, “耳机”] for i in task_array: request_jd(i) # request_jd(‘鼠标’)

                                                                                                                                                                                                                                                                                                                                                          css-selector

                                                                                                                                                                                                                                                                                                                                                          尽量避免解析路径中包含位置信息 chrome 页面中内置了 Jquery 环境, 用 $ 符号来表示
                                                                                                                                                                                                                                                                                                                                                          • 直接定位元素
                                                                                                                                                                                                                                                                                                                                                            • 通过 id 进行定位
                                                                                                                                                                                                                                                                                                                                                              • 通过 class 进行定位
                                                                                                                                                                                                                                                                                                                                                                • 通过属性名进行定位
                                                                                                                                                                                                                                                                                                                                                                • 获取兄弟节点
                                                                                                                                                                                                                                                                                                                                                                  • 获取当前节点的下一个节点
                                                                                                                                                                                                                                                                                                                                                                    • dom 提供的接口, 不属于 css-selector 语法
                                                                                                                                                                                                                                                                                                                                                                      • 通过 css-selector(不建议)
                                                                                                                                                                                                                                                                                                                                                                      • 获取当前节点的上一个节点
                                                                                                                                                                                                                                                                                                                                                                        • dom 提供的接口, 不属于 css-selector 语法 ```null tmp = $(“li[data-sku=‘2136538’]”)[0] tmp.previousElementSibling
                                                                                                                                                                                                                                                                                                                                                                      • 获取父子节点
                                                                                                                                                                                                                                                                                                                                                                        • 获取父节点
                                                                                                                                                                                                                                                                                                                                                                          • dom 提供的接口, 不属于 css-selector 语法
                                                                                                                                                                                                                                                                                                                                                                          • 获取子节点
                                                                                                                                                                                                                                                                                                                                                                            • 获取所有子节点
                                                                                                                                                                                                                                                                                                                                                                              • 遍历所有符合条件的元素
                                                                                                                                                                                                                                                                                                                                                                                • dom 提供的接口, 不属于 css-selector 语法
                                                                                                                                                                                                                                                                                                                                                                                • 获取第一个子节点
                                                                                                                                                                                                                                                                                                                                                                                  • 获取最后一个子节点
                                                                                                                                                                                                                                                                                                                                                                                    • 获取第 N 个子节点
                                                                                                                                                                                                                                                                                                                                                                                  • 模糊匹配
                                                                                                                                                                                                                                                                                                                                                                                    • 匹配开头^
                                                                                                                                                                                                                                                                                                                                                                                      • 匹配结尾$
                                                                                                                                                                                                                                                                                                                                                                                        • 匹配子集
                                                                                                                                                                                                                                                                                                                                                                                      • 获取文本值
                                                                                                                                                                                                                                                                                                                                                                                        • 获取属性值

                                                                                                                                                                                                                                                                                                                                                                                          BeautifulSoup

                                                                                                                                                                                                                                                                                                                                                                                          • 安装
                                                                                                                                                                                                                                                                                                                                                                                            • 使用 BeautifulSoup
                                                                                                                                                                                                                                                                                                                                                                                              • 直接定位元素 略,因 select 已经满足当前定位的需求了
                                                                                                                                                                                                                                                                                                                                                                                              • 去除空白字符
                                                                                                                                                                                                                                                                                                                                                                                                • 获取兄弟节点
                                                                                                                                                                                                                                                                                                                                                                                                  • 获取上一个节点
                                                                                                                                                                                                                                                                                                                                                                                                    • 获取下一个节点
                                                                                                                                                                                                                                                                                                                                                                                                    • 获取父子节点
                                                                                                                                                                                                                                                                                                                                                                                                      • 获取父节点
                                                                                                                                                                                                                                                                                                                                                                                                        • 获取子节点
                                                                                                                                                                                                                                                                                                                                                                                                        • 模糊匹配 略
                                                                                                                                                                                                                                                                                                                                                                                                        • 获取文本值
                                                                                                                                                                                                                                                                                                                                                                                                          • 获取属性值

                                                                                                                                                                                                                                                                                                                                                                                                            课后作业

                                                                                                                                                                                                                                                                                                                                                                                                            • 练习 css-selector
                                                                                                                                                                                                                                                                                                                                                                                                            • 练习用 beautifulsoup 进行页面解析

                                                                                                                                                                                                                                                                                                                                                                                                            一个小又全的爬虫项目

                                                                                                                                                                                                                                                                                                                                                                                                            • 任务生成者 生成爬虫任务的组件, 最大的作用就是建立生产消费者模型, 将生产者和消费者剥离, 可以达到程序暂停重启的功能.
                                                                                                                                                                                                                                                                                                                                                                                                            • 配置文件 当前爬虫项目的基础配置信息, 目的就是统一化配置, 避免重复修改.
                                                                                                                                                                                                                                                                                                                                                                                                            • 主函数 / 调度器 以逻辑控制流协同各个组件, 完成爬取工作, 具有一定的调度功能
                                                                                                                                                                                                                                                                                                                                                                                                            • 下载器 用来和目标服务器进行交互, 获取数据的组件
                                                                                                                                                                                                                                                                                                                                                                                                            • 解析器 用来解析非结构化的页面内容, 获取想要的数据.
                                                                                                                                                                                                                                                                                                                                                                                                            • 存储器 用来持久化解析后的数据
                                                                                                                                                                                                                                                                                                                                                                                                              • 数据库
                                                                                                                                                                                                                                                                                                                                                                                                              • 存为本地文件, 比较推荐的格式为 json, 结构严谨的可以保存为 csv

                                                                                                                                                                                                                                                                                                                                                                                                            课后作业

                                                                                                                                                                                                                                                                                                                                                                                                            • 搭建第一个爬虫项目
                                                                                                                                                                                                                                                                                                                                                                                                            • 为当前爬虫项目添加代理
                                                                                                                                                                                                                                                                                                                                                                                                            • 扩展: 将当前项目改造成多线程
                                                                                                                                                                                                                                                                                                                                                                                                            • 扩展 2: 将当前项目改造成多进程
                                                                                                                                                                                                                                                                                                                                                                                                            • 扩展 3: 通过 aiohttp, aiomysql 将项目改造成协程.

                                                                                                                                                                                                                                                                                                                                                                                                            转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 438803792@qq.com http://localhost:4000/2022/01/12/Python10%20—-%20%E5%89%8D%E7%AB%AF%E5%9F%BA%E7%A1%80%E4%B8%8E%E7%88%AC%E8%99%AB/

                                                                                                                                                                                                                                                                                                                                                                                                            Python11 ---- Scrapy框架基础

                                                                                                                                                                                                                                                                                                                                                                                                            路径管理

                                                                                                                                                                                                                                                                                                                                                                                                            路径

                                                                                                                                                                                                                                                                                                                                                                                                            • 绝对路径 总是从根目录开始
                                                                                                                                                                                                                                                                                                                                                                                                              • 相对路径
                                                                                                                                                                                                                                                                                                                                                                                                                • ....代表当前目录, ..代表父目录
                                                                                                                                                                                                                                                                                                                                                                                                              • 工作目录
                                                                                                                                                                                                                                                                                                                                                                                                                • 当前执行命令所在的目录

                                                                                                                                                                                                                                                                                                                                                                                                              路径列表

                                                                                                                                                                                                                                                                                                                                                                                                              • 查看当前路径列表 只有在路径列表当中的包和模块才可以导入和调用
                                                                                                                                                                                                                                                                                                                                                                                                                • 路径搜索顺序
                                                                                                                                                                                                                                                                                                                                                                                                                  • 当前脚本路径, 也就是执行文件的目录
                                                                                                                                                                                                                                                                                                                                                                                                                  • PYTHONPATH路径
                                                                                                                                                                                                                                                                                                                                                                                                                  • 虚拟环境路径
                                                                                                                                                                                                                                                                                                                                                                                                                  • site-packages
                                                                                                                                                                                                                                                                                                                                                                                                                    • 安装的第三方库所在路径
                                                                                                                                                                                                                                                                                                                                                                                                                • 可以向路径列表添加路径

                                                                                                                                                                                                                                                                                                                                                                                                                  常见报错

                                                                                                                                                                                                                                                                                                                                                                                                                  • ModuleNotFoundError: No module named 'xxxx'
                                                                                                                                                                                                                                                                                                                                                                                                                    • 为什么在 pycharm 中不报错, 在命令行当中报错
                                                                                                                                                                                                                                                                                                                                                                                                                    • ModuleNotFoundError: No module named 'parser.search'; 'parser' is not a pac kage
                                                                                                                                                                                                                                                                                                                                                                                                                      • 自定义包和内置包名有冲突 修改包名即可
                                                                                                                                                                                                                                                                                                                                                                                                                      • 导入的不是一个包
                                                                                                                                                                                                                                                                                                                                                                                                                    • ModuleNotFoundError: No module named '__main__.jd_parser'; '__main__' is no t a package
                                                                                                                                                                                                                                                                                                                                                                                                                      • 入口程序不可以使用相对路径
                                                                                                                                                                                                                                                                                                                                                                                                                      • __main__ 主程序模块名会被修改为__main__
                                                                                                                                                                                                                                                                                                                                                                                                                    • ValueError: attempted relative import beyond top-level package
                                                                                                                                                                                                                                                                                                                                                                                                                      • 当前访问路径已经超过了 python 已知的最大路径
                                                                                                                                                                                                                                                                                                                                                                                                                      • 把工作目录加入到路径列表当中
                                                                                                                                                                                                                                                                                                                                                                                                                      • 进入到项目根目录下执行命令
                                                                                                                                                                                                                                                                                                                                                                                                                      • 上述两个操作相当于将项目根目录加入到路径列表当中

                                                                                                                                                                                                                                                                                                                                                                                                                    注意事项

                                                                                                                                                                                                                                                                                                                                                                                                                    • 确定入口程序, 没有一个锚定的路径就没有办法做相对路径的管理
                                                                                                                                                                                                                                                                                                                                                                                                                    • 将项目根目录加入到入口程序当中
                                                                                                                                                                                                                                                                                                                                                                                                                    • 进入到项目根目录下执行命令
                                                                                                                                                                                                                                                                                                                                                                                                                    • 项目目录结构不要嵌套的太深
                                                                                                                                                                                                                                                                                                                                                                                                                    • 脚本文件或者临时运行单个模块中的方法, 可以将根目录临时添加到路径列表当中

                                                                                                                                                                                                                                                                                                                                                                                                                    课后作业

                                                                                                                                                                                                                                                                                                                                                                                                                    • 用命令行启动jd_crawler
                                                                                                                                                                                                                                                                                                                                                                                                                    • /test目录中增加parser_test.py模块做解析测试. ``` bash 简单来说就是获取当前的工作目录,在执行程序 import sysimport ossys.path.append(os.getcwd())from jd_parser.search import parse_jd_item
                                                                                                                                                                                                                                                                                                                                                                                                                    with open(r”test/search.html”, “r”, encoding=”utf-8”) as f: html = f.read() result = parse_jd_item(html) print(result)
                                                                                                                                                                                                                                                                                                                                                                                                                    D:\python> python .\jd_crawler\main.py
                                                                                                                                                                                                                                                                                                                                                                                                                    pip install scrapy
                                                                                                                                                                                                                                                                                                                                                                                                                    scrapy startproject jd_crawler_scrapy
                                                                                                                                                                                                                                                                                                                                                                                                                    import scrapy
                                                                                                                                                                                                                                                                                                                                                                                                                    class JdSearch(scrapy.Spider): name = “jd_search”
                                                                                                                                                                                                                                                                                                                                                                                                                    D:\python\jd_crawler_scrapy> scrapy crawl jd_search
                                                                                                                                                                                                                                                                                                                                                                                                                    H:\PyCharmProjects\tutorials_2\jd_crawler\main.py
                                                                                                                                                                                                                                                                                                                                                                                                                    jd_crawler\main.py
                                                                                                                                                                                                                                                                                                                                                                                                                    sys.path.append(os.getcwd())
                                                                                                                                                                                                                                                                                                                                                                                                                    import sys print(sys.path)
                                                                                                                                                                                                                                                                                                                                                                                                                    sys.path.append(r”H:\PyCharmProjects\tutorials_2”)
                                                                                                                                                                                                                                                                                                                                                                                                                    Pycharm 会自动将当前项目的根目录添加到路径列表当中
                                                                                                                                                                                                                                                                                                                                                                                                                    from tutorial_2.jd_crawler.jd_parser.search import parse_jd_item
                                                                                                                                                                                                                                                                                                                                                                                                                    top-level package 指的是上述 from 导入命令中的首路径 tutorial_2, 而不是根据目录结构

                                                                                                                                                                                                                                                                                                                                                                                                                    Scrapy 爬虫框架介绍

                                                                                                                                                                                                                                                                                                                                                                                                                    • 什么是 scrapy 基于twisted搭建的异步爬虫框架. scrapy 爬虫框架根据组件化设计理念和丰富的中间件, 使其成为了一个兼具高性能和高扩展的框架
                                                                                                                                                                                                                                                                                                                                                                                                                    • scrapy 提供的主要功能
                                                                                                                                                                                                                                                                                                                                                                                                                      • 具有优先级功能的调度器
                                                                                                                                                                                                                                                                                                                                                                                                                      • 去重功能
                                                                                                                                                                                                                                                                                                                                                                                                                      • 失败后的重试机制
                                                                                                                                                                                                                                                                                                                                                                                                                      • 并发限制
                                                                                                                                                                                                                                                                                                                                                                                                                      • ip 使用次数限制
                                                                                                                                                                                                                                                                                                                                                                                                                      • ….
                                                                                                                                                                                                                                                                                                                                                                                                                    • scrapy 的使用场景
                                                                                                                                                                                                                                                                                                                                                                                                                      • 不适合 scrapy 项目的场景
                                                                                                                                                                                                                                                                                                                                                                                                                        • 业务非常简单, 对性能要求也没有那么高, 那么我们写多进程, 多线程, 异步脚本即可.
                                                                                                                                                                                                                                                                                                                                                                                                                        • 业务非常复杂, 请求之间有顺序和失效时间的限制.
                                                                                                                                                                                                                                                                                                                                                                                                                        • 如果你不遵守框架的主要设计理念, 那就不要使用框架
                                                                                                                                                                                                                                                                                                                                                                                                                      • 适合使用 scrapy 项目
                                                                                                                                                                                                                                                                                                                                                                                                                        • 数据量大, 对性能有一定要求, 又需要用到去重功能优先级功能的调度器
                                                                                                                                                                                                                                                                                                                                                                                                                    • scrapy 组件
                                                                                                                                                                                                                                                                                                                                                                                                                      • notion image
                                                                                                                                                                                                                                                                                                                                                                                                                      • ENGINESPIDERS中获取初始请求任务Requests
                                                                                                                                                                                                                                                                                                                                                                                                                      • ENGINE得到Requests之后发送给SCHEDULER, SCHEDULER对请求进行调度后产出任务.
                                                                                                                                                                                                                                                                                                                                                                                                                      • Scheduler返回下一个请求任务给ENGINE
                                                                                                                                                                                                                                                                                                                                                                                                                      • ENGINE将请求任务交给DOWNLOADER去完成下载任务, 途径下载器中间件.
                                                                                                                                                                                                                                                                                                                                                                                                                      • 一旦下载器完成请求任务, 将产生一个Response对象给ENGINE, 途径下载器中间件
                                                                                                                                                                                                                                                                                                                                                                                                                      • ENGINE收到Response对象后, 将该对象发送给SPIDERS去解析和处理, 途径爬虫中间件
                                                                                                                                                                                                                                                                                                                                                                                                                      • SPIDER解析返回结果
                                                                                                                                                                                                                                                                                                                                                                                                                        • 将解析结果ITEMS发送给ENGINE
                                                                                                                                                                                                                                                                                                                                                                                                                        • 生成一个新的REQUESTS任务发送给ENGINE
                                                                                                                                                                                                                                                                                                                                                                                                                      • 如果ENGINE拿到的是ITEMS, 那么就会发送给ITEM PIPELINES做数据处理, 如果是REQUESTS则发送给SCHEDULER
                                                                                                                                                                                                                                                                                                                                                                                                                      • 周而复始, 直到没有任务产出

                                                                                                                                                                                                                                                                                                                                                                                                                    Scrapy 教程

                                                                                                                                                                                                                                                                                                                                                                                                                    • 安装
                                                                                                                                                                                                                                                                                                                                                                                                                      • 创建项目 建议创建一个独立的项目
                                                                                                                                                                                                                                                                                                                                                                                                                        • 目录结构
                                                                                                                                                                                                                                                                                                                                                                                                                          • spiders(目录) 建议:初学者前期可分开,后期有需求在合并 存放SPIDERS项目文件, 一个 scrapy 项目下可以有多个爬虫实例
                                                                                                                                                                                                                                                                                                                                                                                                                          • items 解析后的结构化结果. 一种约束,必要值
                                                                                                                                                                                                                                                                                                                                                                                                                          • middlewares 下载器中间件和爬虫中间件的地方
                                                                                                                                                                                                                                                                                                                                                                                                                          • piplines 处理 items 的组件, 一般都在 pipelines 中完成 items 插入数据表的操作
                                                                                                                                                                                                                                                                                                                                                                                                                          • settings 统一化的全局爬虫配置文件
                                                                                                                                                                                                                                                                                                                                                                                                                          • scrapy.cfg 项目配置文件
                                                                                                                                                                                                                                                                                                                                                                                                                        • scrapy 爬虫 demo
                                                                                                                                                                                                                                                                                                                                                                                                                          • 启动爬虫
                                                                                                                                                                                                                                                                                                                                                                                                                          需要到 Scrapy 根目录下去执行

                                                                                                                                                                                                                                                                                                                                                                                                                          课后作业

                                                                                                                                                                                                                                                                                                                                                                                                                          • 背诵scrapy组件流程 (必考)
                                                                                                                                                                                                                                                                                                                                                                                                                          • 完成 scrapy 项目的 demo

                                                                                                                                                                                                                                                                                                                                                                                                                          Scrapy 的启动和 debug

                                                                                                                                                                                                                                                                                                                                                                                                                          • 命令行
                                                                                                                                                                                                                                                                                                                                                                                                                            • 启动脚本

                                                                                                                                                                                                                                                                                                                                                                                                                              Scrapy Item

                                                                                                                                                                                                                                                                                                                                                                                                                              只是对解析的结构化结果进行一个约束, 在到达 pipeline 前就可以检查出数据错误.

                                                                                                                                                                                                                                                                                                                                                                                                                              Scrapy 的设置

                                                                                                                                                                                                                                                                                                                                                                                                                              • ROBOTTEXT_OBEY 获取对方网站是否允许爬虫获取数据的信息.
                                                                                                                                                                                                                                                                                                                                                                                                                                • 设置中间件
                                                                                                                                                                                                                                                                                                                                                                                                                                  • 数字越小, 离ENGINE越近
                                                                                                                                                                                                                                                                                                                                                                                                                                • 设置 PIPELINE
                                                                                                                                                                                                                                                                                                                                                                                                                                  • 请求限制
                                                                                                                                                                                                                                                                                                                                                                                                                                    • CONCURRENT_REQUESTS 请求并发数, 通过控制请求并发数达到避免或者延缓 IP 被封禁 假设值为 32,1 秒浏览 32 个页面,这一般是不可能的
                                                                                                                                                                                                                                                                                                                                                                                                                                      • CONCURRENT_REQUESTS_PER_DOMAIN 控制每个域名请求的并发数 若队列是混合队列可使用此值,可以控制每一个域名的并发数,一般不会这样做,场景较少
                                                                                                                                                                                                                                                                                                                                                                                                                                    • CONCURRENT_REQUESTS_IP 控制每个IP请求的次数. 通过这样的方式可以过掉一些对 IP 封禁严格的网站 假设有一个 IP 地址池,可以对 IP 进行并发次数的控制,简单来说就是 IP 请求次数上限控制
                                                                                                                                                                                                                                                                                                                                                                                                                                    • CONCURRENT_ITEMS 默认为 100, 控制处理item的并发数. 如果我存入的数据库性能比较差, 通过这样的方式解决防止数据库崩溃的情况 (控制存入数据库并发数)
                                                                                                                                                                                                                                                                                                                                                                                                                                    • DOWNLOAD_DELAY 默认为 0, 控制请求的频率. 在调度完一个请求后, 休息若干秒. timesleep 延迟
                                                                                                                                                                                                                                                                                                                                                                                                                                      • Scrapy 会自动帮我们进行随机休息 (DOWNLOAD_DELAY - 0.5, DOWNLOAD_DELAY + 0.5)
                                                                                                                                                                                                                                                                                                                                                                                                                                    • DOWNLOAD_TIMEOUT控制每个请求的超时时间. 通过这样的方式解决 IP 代理池质量差的问题.
                                                                                                                                                                                                                                                                                                                                                                                                                                      • REDIRECT_ENABLE 默认为True, 建议修改为False, 因为大部分情况下, 重定向都是识别出你当前身份有问题, 重定向到log in页面
                                                                                                                                                                                                                                                                                                                                                                                                                                    • 重试机制
                                                                                                                                                                                                                                                                                                                                                                                                                                      • RETRY_ENABLE 默认为True, 建议改成False, 然后自己重写重试中间件
                                                                                                                                                                                                                                                                                                                                                                                                                                        • RETRY_TIMES 控制重新次数, RETRY_TIMES 其实是当前项目的兜底配置
                                                                                                                                                                                                                                                                                                                                                                                                                                          • 如果当前请求失败后永远会重试, 正好你请求的接口是收费的, 万一有一天报错, 那么产生的费用是巨大的.
                                                                                                                                                                                                                                                                                                                                                                                                                                        • RETRY_HTTP_CODES 408 请求超时 429 太多请求 500 无处处理该请求 502 后端服务器问题 503 服务器过载,拒绝客户端连接或在队列中 504 后端服务器问题
                                                                                                                                                                                                                                                                                                                                                                                                                                        • 过滤器
                                                                                                                                                                                                                                                                                                                                                                                                                                          • 设置中指定过滤器
                                                                                                                                                                                                                                                                                                                                                                                                                                            • Spider 中打开过滤器
                                                                                                                                                                                                                                                                                                                                                                                                                                              • 过滤器
                                                                                                                                                                                                                                                                                                                                                                                                                                              • LOG
                                                                                                                                                                                                                                                                                                                                                                                                                                                • LOG_ENABLE 默认为True, 是否使用 log
                                                                                                                                                                                                                                                                                                                                                                                                                                                • LOG_FILE 设置保存的 log 文件目录
                                                                                                                                                                                                                                                                                                                                                                                                                                                • LOG_LEVEL(按严重程序排序)
                                                                                                                                                                                                                                                                                                                                                                                                                                                  • CRITICAL
                                                                                                                                                                                                                                                                                                                                                                                                                                                  • ERROR
                                                                                                                                                                                                                                                                                                                                                                                                                                                  • WARNING
                                                                                                                                                                                                                                                                                                                                                                                                                                                  • INFO
                                                                                                                                                                                                                                                                                                                                                                                                                                                  • DEBUG

                                                                                                                                                                                                                                                                                                                                                                                                                                              Scrapy 的中间件

                                                                                                                                                                                                                                                                                                                                                                                                                                              • 请求头中间件
                                                                                                                                                                                                                                                                                                                                                                                                                                                • 重试中间件

                                                                                                                                                                                                                                                                                                                                                                                                                                                  课后作业

                                                                                                                                                                                                                                                                                                                                                                                                                                                  • 将 jd_crawler_scrapy 完善.
                                                                                                                                                                                                                                                                                                                                                                                                                                                  • 完成代理中间件的编写 (查阅文档).
                                                                                                                                                                                                                                                                                                                                                                                                                                                  • 理解并重写重试中间件
                                                                                                                                                                                                                                                                                                                                                                                                                                                  • 理解并重写过滤器

                                                                                                                                                                                                                                                                                                                                                                                                                                                  转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 438803792@qq.com http://localhost:4000/2022/01/12/Python11%20—-%20Scrapy%E6%A1%86%E6%9E%B6%E5%9F%BA%E7%A1%80/

                                                                                                                                                                                                                                                                                                                                                                                                                                                  🤗 总结归纳

                                                                                                                                                                                                                                                                                                                                                                                                                                                  总结文章的内容

                                                                                                                                                                                                                                                                                                                                                                                                                                                  📎 参考文章

                                                                                                                                                                                                                                                                                                                                                                                                                                                  • 一些引用
                                                                                                                                                                                                                                                                                                                                                                                                                                                  • 引用文章
                                                                                                                                                                                                                                                                                                                                                                                                                                                   
                                                                                                                                                                                                                                                                                                                                                                                                                                                  💡
                                                                                                                                                                                                                                                                                                                                                                                                                                                  有关Notion安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~
                                                                                                                                                                                                                                                                                                                                                                                                                                                  WSLNetwork
                                                                                                                                                                                                                                                                                                                                                                                                                                                  Loading...
                                                                                                                                                                                                                                                                                                                                                                                                                                                  目录