📚Python学习必看,从入门到精通的完美指南,你值得拥有✨
📕Python,这个简洁而强大的语言,一直以其易学易用、开发速度快的特点吸引着广大开发者。今天,我要向大家推荐一本Python的经典著作——《疯狂Python讲义》。这本书不仅涵盖了Python的基础知识,还深入探讨了Python在游戏开发、网页开发等方面的应用,让我们一起来了解这本书吧!
【书籍简介】
《疯狂Python讲义》是由著名Python专家李刚老师所著,全书按照循序渐进的原则,通过大量实用的案例,帮助读者快速掌握Python编程的核心技能。这本书不仅包含了Python基础、进阶知识,还深入讲解了Python在游戏开发、网页开发等方面的应用,为读者展现了一个全面而深入的Python世界。
📘【亮点分析】
👋 内容丰富,覆盖面广
《疯狂Python讲义》几乎涵盖了Python编程的所有方面,从基础语法到高级应用,从游戏开发到网页开发,无所不包。无论你是初学者还是有一定经验的开发者,都能在这本书中找到适合自己的内容。
✨讲解细致,易于理解
这本书的讲解非常细致,每个知识点都配有生动的案例和详细的解析。无论是复杂的算法还是抽象的概念,都能以清晰易懂的方式呈现给读者。无论你的编程基础如何,都能轻松上手。
😎 实用性强,注重实践
《疯狂Python讲义》不仅注重理论知识的讲解,还提供了大量的实践案例。通过这些案例,读者可以更好地将理论知识应用到实际开发中,提高自己的编程技能。
🏆【推荐理由】
1️⃣ 体系完整,内容丰富:这本书涵盖了Python编程的各个方面,从基础到进阶,从理论到实践,帮助读者建立起完整的Python知识体系。
2️⃣ 讲解细致,易于理解:作者用通俗易懂的语言对每个知识点进行讲解,让读者轻松掌握Python编程的核心技能。
3️⃣ 实用性强,注重实践:这本书不仅提供了丰富的理论知识,还通过大量的实践案例帮助读者将理论知识应用到实际开发中。这对于培养读者的实际开发能力非常有帮助。
4️⃣ 适合初学者和有经验的开发者:这本书既适合初学者入门学习,也适合有经验的开发者深入学习。对于想要全面提升自己Python技能的朋友来说,这本书无疑是一本不可多得的宝典。
👍【结语】
《疯狂Python讲义》是一本非常实用的书籍,适合所有Python初学者和有一定经验的开发者阅读。通过阅读本书,我们可以更加深入地了解Python的精髓,掌握Python的核心知识,从而更好地应用Python解决实际问题。如果你正在寻找一本好的Python书籍,那么《疯狂Python讲义》绝对是一个不错的选择。
书籍信息
书名:疯狂Python讲义
作者:李刚
评分:7.6
出版日期:2019-01-01
出版社:电子工业出版社
ISBN:9787121351976
页数:648
定价:118
内容简介
《疯狂Python讲义》既是一本适合初学者入门Python的图书(一个8岁的小朋友在未出版前已学习了本书很多章节并动手写出了自己的程序);这也是一本适合Python就业的图书,因为本书涵盖了网络编程、数据分析、网络爬虫等大量企业实用的知识。
《疯狂Python讲义》全面而深入介绍了Python编程的相关内容,全书内容大致可分为四个部分,第一部分系统讲解了Python的基本语法结构、Python的函数编程、Python的类和对象、模块和包、异常处理等核心语法;第二部分主要介绍Python常用的内置模块和包,这部分包括Python的JSON、正则表达式支持、容器相关类、collections包、Tkinter GUI编程、IO编程、数据库编程、并发编程、网络通信编程等内容,这部分内容既是掌握Python编程的核心,也是Python进阶的关键基础;第三部分主要介绍Python开发工程化方面的内容,包括如何为Python程序编写符合格式的文档注释、提取文档注释生成帮助文档,为Python程序编写测试用例,程序打包等内容;第四部分则属于“Python项目实战”,这部分引入了pygame、Matplotlib、Pygal、Scrapy这些第三方的包,通过项目介绍了Python游戏开发、大数据展示、网络爬虫等热门技能,尤其是网络爬虫和大数据展示,绝对是当下Python最热的就业岗位。
与“疯狂体系”图书类似,虽然我会尽量让《疯狂Python讲义》的讲解通俗易懂(毕竟一个8岁的小朋友也能阅读此书),但我创作“疯狂体系”图书的初衷从来就不是“简单”和“入门”,本书所覆盖的Python的深度和广度,是很多书籍所不能比拟的,《疯狂Python讲义》涉及大量实用案例开发:五子棋游戏、画图板、桌面弹球、合金弹头、大数据展示、基于网络的各国GDP对比、基于爬虫的招聘热点分析、基于爬虫的高清图片下载、基于Scrapy+Seleninum的微博登录……设计这些案例的初衷不是“简单”和“入门”,而是让读者学以致用、激发编程自豪感,进而引爆内心的编程激情。因此那些仅图简单的读者,建议不要选择此书。《疯狂Python讲义》课后习题共包括110道循序渐进的Python练习题(面试题),读者可通过这些练习题巩固所学、为面试做准备。如果读者需要获取关于课后习题的解决方法、编程思路。
《疯狂Python讲义》为所有打算深入掌握Python编程的读者而编写,适合各种层次的Python学习者和工作者阅读,也适合作为大学教育、培训机构的Python教材。但如果只是想简单涉猎Python,则本书过于庞大,不适合阅读。
书籍目录
第1章 Python语言概述和开发环境 1
1.1 Python简介 2
1.1.1 Python简史 2
1.1.2 Python的特点 3
1.2 Python程序运行机制 3
1.3 开发Python的准备 4
1.3.1 在Windows上安装Python 5
1.3.2 在Linux上安装Python 6
1.3.3 在Mac OS X上安装Python 7
1.4 第一个Python程序 8
1.4.1 编辑Python源程序 8
1.4.2 使用IDLE运行Python程序 8
1.4.3 使用命令行工具运行Python程序 9
1.5 交互式解释器 11
1.6 本章小结 12
本章练习 12
第2章 变量和简单类型 13
2.1 单行注释和多行注释 14
2.2 变量 15
2.2.1 Python是弱类型语言 15
2.2.2 使用print函数输出变量 16
2.2.3 变量的命名规则 17
2.2.4 Python的关键字和内置函数 18
2.3 数值类型 19
2.3.1 整型 19
2.3.2 浮点型 21
2.3.3 复数 21
2.4 字符串入门 22
2.4.1 字符串和转义字符 22
2.4.2 拼接字符串 23
2.4.3 repr和字符串 23
2.4.4 使用input和raw_input获取用户输入 24
2.4.5 长字符串 25
2.4.6 原始字符串 26
2.4.7 字节串(bytes) 26
2.5 深入使用字符串 28
2.5.1 转义字符 28
2.5.2 字符串格式化 29
2.5.3 序列相关方法 31
2.5.4 大小写相关方法 32
2.5.5 删除空白 33
2.5.6 查找、替换相关方法 34
2.5.7 分割、连接方法 35
2.6 运算符 36
2.6.1 赋值运算符 36
2.6.2 算术运算符 37
2.6.3 位运算符 39
2.6.4 扩展后的赋值运算符 42
2.6.5 索引运算符 42
2.6.6 比较运算符与bool类型 42
2.6.7 逻辑运算符 44
2.6.8 三目运算符 45
2.6.9 in运算符 46
2.6.10 运算符的结合性和优先级 46
2.7 本章小结 47
本章练习 47
第3章 列表、元组和字典 49
3.1 序列简介 50
3.1.1 Python的序列 50
3.1.2 创建列表和元组 50
3.2 列表和元组的通用用法 51
3.2.1 通过索引使用元素 51
3.2.2 子序列 51
3.2.3 加法 52
3.2.4 乘法 52
3.2.5 in运算符 53
3.2.6 长度、最大值和最小值 53
3.2.7 序列封包和序列解包 54
3.3 使用列表 55
3.3.1 创建列表 55
3.3.2 增加列表元素 56
3.3.3 删除列表元素 57
3.3.4 修改列表元素 58
3.3.5 列表的其他常用方法 59
3.4 使用字典 61
3.4.1 字典入门 61
3.4.2 创建字典 62
3.4.3 字典的基本用法 63
3.4.4 字典的常用方法 64
3.4.5 使用字典格式化字符串 67
3.5 本章小结 67
本章练习 67
第4章 流程控制 68
4.1 顺序结构 69
4.2 if分支结构 69
4.2.1 不要忘记缩进 70
4.2.2 不要随意缩进 72
4.2.3 不要遗忘冒号 73
4.2.4 if条件的类型 73
4.2.5 if分支的逻辑错误 74
4.2.6 if表达式 75
4.2.7 pass语句 75
4.3 断言 76
4.4 循环结构 76
4.4.1 while循环 77
4.4.2 使用while循环遍历列表和元组 78
4.4.3 for-in循环 79
4.4.4 使用for-in循环遍历列表和元组 79
4.4.5 使用for-in循环遍历字典 80
4.4.6 循环使用else 81
4.4.7 嵌套循环 83
4.4.8 for表达式 84
4.4.9 常用工具函数 86
4.5 控制循环结构 87
4.5.1 使用break结束循环 88
4.5.2 使用continue忽略本次循环的剩下语句 89
4.5.3 使用return结束方法 89
4.6 牛刀小试 90
4.6.1 数字转人民币读法 90
4.6.2 绕圈圈 92
4.6.3 控制台五子棋 93
4.6.4 控制台超市系统 95
4.7 本章小结 98
本章练习 98
第5章 函数和lambda表达式 101
5.1 函数入门 102
5.1.1 理解函数 102
5.1.2 定义和调用函数 103
5.1.3 为函数提供文档 104
5.1.4 多个返回值 104
5.1.5 递归函数 105
5.2 函数的参数 106
5.2.1 关键字(keyword)参数 106
5.2.2 参数默认值 107
5.2.3 参数收集(个数可变的参数) 109
5.2.4 逆向参数收集 110
5.2.5 函数的参数传递机制 112
5.2.6 变量作用域 115
5.3 局部函数 118
5.4 函数的高级内容 119
5.4.1 使用函数变量 119
5.4.2 使用函数作为函数形参 120
5.4.3 使用函数作为返回值 121
5.5 局部函数与lambda表达式 122
5.5.1 回顾局部函数 122
5.5.2 使用lambda表达式代替局部函数 123
5.6 本章小结 124
本章练习 124
第6章 类和对象 125
6.1 类和对象 126
6.1.1 定义类 126
6.1.2 对象的产生和使用 127
6.1.3 对象的产生和使用 128
6.1.4 实例方法和自动绑定self 129
6.2 方法 132
6.2.1 类也能调用实例方法 132
6.2.2 类方法与静态方法 133
6.2.3 @函数装饰器 134
6.2.4 再论类命名空间 136
6.3 成员变量 137
6.3.1 类变量和实例变量 137
6.3.2 使用property函数定义属性 140
6.4 隐藏和封装 142
6.5 类的继承 144
6.5.1 继承的语法 144
6.5.2 关于多继承 145
6.5.3 重写父类的方法 146
6.5.4 使用未绑定方法调用被重写的方法 147
6.5.5 使用super函数调用父类的构造方法 147
6.6 Python的动态性 149
6.6.1 动态属性与__slots__ 149
6.6.2 使用type()函数定义类 151
6.6.3 使用metaclass 152
6.7 多态 153
6.7.1 多态性 154
6.7.2 检查类型 155
6.8 枚举类 156
6.8.1 枚举入门 157
6.8.2 枚举的构造器 158
6.9 本章小结 159
本章练习 159
第7章 异常处理 160
7.1 异常概述 161
7.2 异常处理机制 162
7.2.1 使用try...except捕获异常 162
7.2.2 异常类的继承体系 163
7.2.3 多异常捕获 166
7.2.4 访问异常信息 166
7.2.5 else块 167
7.2.6 使用finally回收资源 169
7.2.7 异常处理嵌套 171
7.3 使用raise引发异常 171
7.3.1 引发异常 171
7.3.2 自定义异常类 173
7.3.3 except和raise同时使用 173
7.3.4 raise不需要参数 174
7.4 Python的异常传播轨迹 175
7.5 异常处理规则 177
7.5.1 不要过度使用异常 177
7.5.2 不要使用过于庞大的try块 178
7.5.3 不要忽略捕获到的异常 179
7.6 本章小结 179
本章练习 179
第8章 Python类的特殊方法 180
8.1 常见的特殊方法 181
8.1.1 重写__repr__方法 181
8.1.2 析构方法:__del__ 182
8.1.3 __dir__方法 183
8.1.4 __dict__属性 184
8.1.5 __getattr__、__setattr__等 184
8.2 与反射有关的属性和方法 186
8.2.1 动态操作属性 187
8.2.2 __call__属性 188
8.3 与序列有关的特殊方法 189
8.3.1 与序列相关的方法 189
8.3.2 实现迭代器 191
8.3.3 扩展列表、元组和字典 192
8.4 生成器 193
8.4.1 创建生成器 193
8.4.2 生成器的方法 195
8.5 运算符重载的特殊方法 197
8.5.1 与数值运算符相关的特殊方法 197
8.5.2 与比较运算符相关的特殊方法 201
8.5.3 与单目运算符相关的特殊方法 202
8.5.4 与类型转换相关的特殊方法 203
8.5.5 与常见的内建函数相关的特殊方法 204
8.6 本章小结 205
本章练习 205
第9章 模块和包 206
9.1 模块化编程 207
9.1.1 导入模块的语法 207
9.1.2 定义模块 210
9.1.3 为模块编写说明文档 211
9.1.4 为模块编写测试代码 211
9.2 加载模块 212
9.2.1 使用环境变量 212
9.2.2 默认的模块加载路径 215
9.2.3 导入模块的本质 217
9.2.4 模块的__all__变量 218
9.3 使用包 219
9.3.1 什么是包 219
9.3.2 定义包 220
9.3.3 导入包内成员 222
9.4 查看模块内容 224
9.4.1 模块包含什么 224
9.4.2 使用__doc__属性查看文档 225
9.4.3 使用__file__属性查看模块的源文件路径 226
9.5 本章小结 226
本章练习 226
第10章 常见模块 227
10.1 sys 228
10.1.1 获取运行参数 230
10.1.2 动态修改模块加载路径 231
10.2 os模块 231
10.3 random 234
10.4 time 235
10.5 JSON支持 238
10.5.1 JSON的基本知识 238
10.5.2 Python的JSON支持 241
10.6 正则表达式 244
10.6.1 Python的正则表达式支持 245
10.6.2 正则表达式旗标 250
10.6.3 创建正则表达式 251
10.6.4 子表达式 253
10.6.5 贪婪模式与勉强模式 255
10.7 容器相关类 256
10.7.1 set和frozenset 257
10.7.2 双端队列(deque) 259
10.7.3 Python的堆操作 262
10.8 collections下的容器支持 265
10.8.1 ChainMap对象 265
10.8.2 Counter对象 267
10.8.3 defaultdict对象 269
10.8.4 namedtuple工厂函数 270
10.8.5 OrderedDict对象 272
10.9 函数相关模块 273
10.9.1 itertools模块的功能函数 273
10.9.2 functools模块的功能函数 276
10.10 本章小结 283
本章练习 283
第11章 图形界面编程 285
11.1 Python的GUI库 286
11.2 Tkinter GUI编程的组件 287
11.3 布局管理器 293
11.3.1 Pack布局管理器 293
11.3.2 Grid布局管理器 296
11.3.3 Place布局管理器 297
11.4 事件处理 299
11.4.1 简单的事件处理 299
11.4.2 事件绑定 300
11.5 Tkinter常用组件 304
11.5.1 使用ttk组件 304
11.5.2 Variable类 305
11.5.3 使用compound选项 306
11.5.4 Entry和Text组件 308
11.5.5 Radiobutton和Checkbutton组件 311
11.5.6 Listbox和Combobox组件 315
11.5.7 Spinbox组件 319
11.5.8 Scale和LabeledScale组件 320
11.5.9 Labelframe组件 324
11.5.10 Panedwindow组件 326
11.5.11 OptionMenu组件 328
11.6 对话框(Dialog) 330
11.6.1 普通对话框 330
11.6.2 自定义模式、非模式对话框 332
11.6.3 输入对话框 334
11.6.4 文件对话框 336
11.6.5 颜色选择对话框 338
11.6.6 消息框 339
11.7 菜单 342
11.7.1 窗口菜单 343
11.7.2 右键菜单 347
11.8 在Canvas中绘图 349
11.8.1 Tkinter Canvas的绘制功能 349
11.8.2 操作图形项的标签 356
11.8.3 操作图形项 358
11.8.4 为图形项绑定事件 363
11.8.5 绘制动画 368
11.9 本章小结 371
本章练习 371
第12章 文件I/O 372
12.1 使用pathlib模块操作目录 373
12.1.1 PurePath的基本功能 374
12.1.2 PurePath的属性和方法 376
12.1.3 Path的功能和用法 378
12.2 使用os.path操作目录 379
12.3 使用fnmatch处理文件名匹配 380
12.4 打开文件 381
12.4.1 文件打开模式 382
12.4.2 缓冲 383
12.5 读取文件 383
12.5.1 按字节或字符读取 383
12.5.2 按行读取 385
12.5.3 使用fileinput读取多个输入流 386
12.5.4 文件迭代器 386
12.5.5 管道输入 387
12.5.6 使用with语句 388
12.5.7 使用linecache随机读取指定行 390
12.6 写文件 391
12.6.1 文件指针的概念 391
12.6.2 写文件 392
12.7 os模块的文件和目录函数 393
12.7.1 与目录相关的函数 393
12.7.2 与权限相关的函数 395
12.7.3 与文件访问相关的函数 396
12.8 使用tempfile模块生成临时文件和
临时目录 398
12.9 本章小结 399
本章练习 400
第13章 数据库编程 401
13.1 Python数据库API简介 402
13.1.1 全局变量 402
13.1.2 数据库API的核心类 403
13.1.3 操作数据库的基本流程 404
13.2 操作SQLite数据库 404
13.2.1 创建数据表 405
13.2.2 使用SQLite Expert工具 406
13.2.3 使用序列重复执行DML语句 408
13.2.4 执行查询 410
13.2.5 事务控制 412
13.2.6 执行SQL脚本 412
13.2.7 创建自定义函数 413
13.2.8 创建聚集函数 414
13.2.9 创建比较函数 415
13.3 操作MySQL数据库 417
13.3.1 下载和安装MySQL数据库 417
13.3.2 使用pip工具管理模块 420
13.3.3 执行DDL语句 421
13.3.4 执行DML语句 423
13.3.5 执行查询语句 425
13.3.6 调用存储过程 426
13.4 本章小结 427
本章练习 427
第14章 并发编程 428
14.1 线程概述 429
14.1.1 线程和进程 429
14.1.2 多线程的优势 430
14.2 线程的创建和启动 431
14.2.1 调用Thread类的构造器创建线程 431
14.2.2 继承Thread类创建线程类 433
14.3 线程的生命周期 434
14.3.1 新建和就绪状态 434
14.3.2 运行和阻塞状态 435
14.3.3 线程死亡 436
14.4 控制线程 438
14.4.1 join线程 438
14.4.2 后台线程 439
14.4.3 线程睡眠:sleep 440
14.5 线程同步 440
14.5.1 线程安全问题 440
14.5.2 同步锁(Lock) 442
14.5.3 死锁 445
14.6 线程通信 447
14.6.1 使用Condition实现线程通信 447
14.6.2 使用队列(Queue)控制线程通信 450
14.6.3 使用Event控制线程通信 452
14.7 线程池 454
14.7.1 线程池 454
14.7.2 获取执行结果 457
14.8 线程相关类 458
14.8.1 线程局部变量 458
14.8.2 定时器 460
14.8.3 任务调度 460
14.9 多进程 462
14.9.1 使用fork创建新进程 462
14.9.2 使用multiprocessing.Process创建新进程 463
14.9.3 Context和启动进程的方式 465
14.9.4 使用进程池管理进程 466
14.9.5 进程通信 468
14.10 本章小结 470
本章练习 470
第15章 网络编程 471
15.1 网络编程的基础知识 472
15.1.1 网络基础知识 472
15.1.2 IP地址和端口号 473
15.2 Python的基本网络支持 474
15.2.1 Python的网络模块概述 474
15.2.2 使用urllib.parse子模块 475
15.2.3 使用urllib.request读取资源 479
15.2.4 管理cookie 483
15.3 基于TCP协议的网络编程 486
15.3.1 TCP协议基础 487
15.3.2 使用socket创建TCP服务器端 487
15.3.3 使用socket通信 489
15.3.4 加入多线程 490
15.3.5 记录用户信息 492
15.3.6 半关闭的socket 497
15.3.7 selectors模块 498
15.4 基于UDP协议的网络编程 500
15.4.1 UDP协议基础 500
15.4.2 使用socket发送和接收数据 501
15.4.3 使用UDP协议实现多点广播 503
15.5 电子邮件支持 505
15.5.1 使用smtplib模块发送邮件 505
15.5.2 使用poplib模块收取邮件 508
15.6 本章小结 511
本章练习 512
第16章 文档和测试 513
16.1 使用pydoc生成文档 514
16.1.1 在控制台中查看文档 515
16.1.2 生成HTML文档 516
16.1.3 启动本地服务器来查看文档信息 517
16.1.4 查找模块 519
16.2 软件测试概述 519
16.2.1 软件测试的概念和目的 519
16.2.2 软件测试的分类 521
16.2.3 开发活动和测试活动 521
16.2.4 常见的Bug管理工具 522
16.3 文档测试 523
16.4 单元测试 525
16.4.1 单元测试概述 525
16.4.2 单元测试的逻辑覆盖 527
16.5 使用PyUnit(unittest) 529
16.5.1 PyUnit(unittest)的用法 530
16.5.2 运行测试 533
16.5.3 使用测试包 534
16.5.4 测试固件之setUp和tearDown 536
16.5.5 跳过测试用例 538
16.6 本章小结 540
本章练习 540
第17章 打包和发布 541
17.1 使用zipapp模块 542
17.1.1 生成可执行的Python档案包 542
17.1.2 创建独立应用 543
17.2 使用PyInstaller生成可执行程序 544
17.2.1 安装PyInstaller 544
17.2.2 使用PyInstaller生成可执行程序 545
17.3 本章小结 547
本章练习 547
第18章 合金弹头 548
18.1 合金弹头游戏简介 549
18.2 pygame简介 550
18.2.1 安装pygame 550
18.2.2 pygame常用的游戏API 551
18.3 开发游戏界面组件 553
18.3.1 游戏界面分析 553
18.3.2 实现“怪物”类 554
18.3.3 实现怪物管理 559
18.3.4 实现“子弹”类 560
18.3.5 加载、管理游戏图片 563
18.3.6 让游戏“运行”起来 565
18.4 增加“角色” 566
18.4.1 开发“角色”类 566
18.4.2 添加角色 572
18.5 合理绘制地图 575
18.6 增加音效 577
18.7 增加游戏场景 579
18.8 本章小结 583
本章练习 583
第19章 数据可视化 584
19.1 使用Matplotlib生成数据图 585
19.1.1 安装Matplotlib包 585
19.1.2 Matplotlib数据图入门 586
19.1.3 管理图例 588
19.1.4 管理坐标轴 591
19.1.5 管理多个子图 593
19.2 功能丰富的数据图 597
19.2.1 饼图 597
19.2.2 柱状图 598
19.2.3 水平柱状图 601
19.2.4 散点图 602
19.2.5 等高线图 604
19.2.6 3D图形 605
19.3 使用Pygal生成数据图 606
19.3.1 安装Pygal包 606
19.3.2 Pygal数据图入门 607
19.3.3 配置Pygal数据图 608
19.4 Pygal支持的常见数据图 609
19.4.1 折线图 610
19.4.2 水平柱状图和水平折线图 611
19.4.3 叠加柱状图和叠加折线图 612
19.4.4 饼图 613
19.4.5 点图 614
19.4.6 仪表(Gauge)图 615
19.4.7 雷达图 616
19.5 处理数据 617
19.5.1 CSV文件格式 617
19.5.2 JSON数据 621
19.5.3 数据清洗 624
19.5.4 读取网络数据 626
19.6 本章小结 629
本章练习 629
第20章 网络爬虫 630
20.1 安装Scrapy 631
20.1.1 了解Scrapy 631
20.1.2 安装Scrapy 632
20.2 使用爬虫爬取、分析招聘信息 634
20.2.1 创建Scrapy项目 634
20.2.2 使用shell调试工具 635
20.2.3 Scrapy开发步骤 638
20.2.4 使用JSON导出信息 643
20.2.5 将数据写入数据库 644
20.2.6 使用Pygal展示招聘信息 645
20.3 处理反爬虫 646
20.3.1 使用shell调试工具分析目标站点 646
20.3.2 使用Scrapy爬取高清图片 649
20.3.3 应对反爬虫的常见方法 651
20.3.4 整合Selenium模拟浏览器行为 653
20.4 本章小结 657
本章练习 657