From 4f1b0900749835d60f9dbf7d249d6a9b8a67c30e Mon Sep 17 00:00:00 2001 From: jackfrued Date: Mon, 13 Jun 2022 21:22:04 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BA=86=E6=96=87=E6=A1=A3?= =?UTF-8?q?=E5=9B=BE=E7=89=87=E8=B5=84=E6=BA=90=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 +- 第01课:初识Python.md | 18 +++---- 第02课:第一个Python程序.md | 8 +-- 第10课:常用数据结构之字符串.md | 2 +- 第11课:常用数据结构之集合.md | 2 +- 第12课:常用数据结构之字典.md | 2 +- 第15课:函数使用进阶.md | 2 +- 第17课:面向对象编程入门.md | 4 +- 第21课:文件读写和异常处理.md | 2 +- ...课:对象的序列化和反序列化.md | 8 +-- 第25课:用Python读写Excel文件-2.md | 2 +- ...用Python操作Word文件和PowerPoint.md | 8 +-- 第28课:用Python处理图像.md | 16 +++--- 第29课:用Python发送邮件和短信.md | 10 ++-- 第30课:正则表达式的应用.md | 2 +- 第31课:网络数据采集概述.md | 16 +++--- 第32课:用Python获取网络资源.md | 8 +-- 第33课:用Python解析HTML页面.md | 4 +- 第34课:Python中的并发编程-1.md | 2 +- ...课:并发编程在爬虫中的应用.md | 2 +- 第38课:抓取网页动态内容.md | 4 +- 第39课:爬虫框架Scrapy简介.md | 2 +- ...0课:关系型数据库和MySQL概述.md | 50 +++++++++---------- 23 files changed, 90 insertions(+), 87 deletions(-) diff --git a/README.md b/README.md index 03b08ab..9196caa 100644 --- a/README.md +++ b/README.md @@ -14,4 +14,5 @@ 下面是我创建的学习交流群(群号:789050736),欢迎加入一起学习共同进步。 - + + diff --git a/第01课:初识Python.md b/第01课:初识Python.md index 2169264..15b4892 100644 --- a/第01课:初识Python.md +++ b/第01课:初识Python.md @@ -4,7 +4,7 @@ Python是由荷兰人吉多·范罗苏姆(Guido von Rossum)发明的一种编程语言,是目前世界上最受欢迎和拥有最多用户群体的编程语言。 - + #### Python的历史 @@ -41,29 +41,29 @@ Python最主要的缺点是执行效率低,但是当我们更看重产品的 可以在[Python官方网站](https://www.python.org/downloads/)找到下载链接并下载Python 3的安装程序。 -![](https://gitee.com/jackfrued/mypic/raw/master/20210719222940.png) +![](https://github.com/jackfrued/mypic/raw/master/20210719222940.png) 对于Windows操作系统,可以下载“executable installer”。需要注意的是,如果在Windows 7环境下安装Python 3,需要先安装Service Pack 1补丁包,大家可以在Windows的“运行”中输入`winver`命令,从弹出的窗口上可以看到你的系统是否安装了该补丁包。如果没有该补丁包,一定要先通过“Windows Update”或者类似“CCleaner”这样的工具自动安装该补丁包,安装完成后通常需要重启你的Windows系统,然后再开始安装Python环境。 -![](https://gitee.com/jackfrued/mypic/raw/master/20210719222956.png) +![](https://github.com/jackfrued/mypic/raw/master/20210719222956.png) 双击运行刚才下载的安装程序,会打开Python环境的安装向导。在执行安装向导的时候,记得勾选“Add Python 3.x to PATH”选项,这个选项会帮助我们将Python的解释器添加到PATH环境变量中(不理解没关系,照做就行),具体的步骤如下图所示。 -![](https://gitee.com/jackfrued/mypic/raw/master/20210719223007.png) +![](https://github.com/jackfrued/mypic/raw/master/20210719223007.png) -![](https://gitee.com/jackfrued/mypic/raw/master/20210719223021.png) +![](https://github.com/jackfrued/mypic/raw/master/20210719223021.png) -![](https://gitee.com/jackfrued/mypic/raw/master/20210719223317.png) +![](https://github.com/jackfrued/mypic/raw/master/20210719223317.png) -![](https://gitee.com/jackfrued/mypic/raw/master/20210719223332.png) +![](https://github.com/jackfrued/mypic/raw/master/20210719223332.png) 安装完成后可以打开Windows的“命令行提示符”工具(或“PowerShell”)并输入`python --version`或`python -V`来检查安装是否成功,命令行提示符可以在“运行”中输入`cmd`来打开或者在“开始菜单”的附件中找到它。如果看了Python解释器对应的版本号(如:Python 3.7.8),说明你的安装已经成功了,如下图所示。 -![](https://gitee.com/jackfrued/mypic/raw/master/20210719223350.png) +![](https://github.com/jackfrued/mypic/raw/master/20210719223350.png) > **说明**:如果安装过程显示安装失败或执行上面的命令报错,很有可能是因为你的Windows系统缺失了一些动态链接库文件或C构建工具导致的问题。可以在[微软官网](https://www.microsoft.com/zh-cn/download/details.aspx?id=48145)下载Visual C++ Redistributable for Visual Studio 2015文件进行修复,64位的系统需要下载有x64标记的安装文件。也可以通过下面的百度云盘地址获取修复工具,运行修复工具,按照如下图所示的方式进行修复,链接: https://pan.baidu.com/s/1iNDnU5UVdDX5sKFqsiDg5Q 提取码: cjs3。 > -> ![QQ20210711-0](https://gitee.com/jackfrued/mypic/raw/master/20210816234614.png) +> ![QQ20210711-0](https://github.com/jackfrued/mypic/raw/master/20210816234614.png) 除此之外,你还应该检查一下Python的包管理工具是否已经可用,对应的命令是`pip --version`。 diff --git a/第02课:第一个Python程序.md b/第02课:第一个Python程序.md index 776fc72..b3067f1 100644 --- a/第02课:第一个Python程序.md +++ b/第02课:第一个Python程序.md @@ -51,19 +51,19 @@ Visual Studio Code(通常简称为VSCode)是一个由微软开发能够在Wi 运行PyCharm,可以看到如下图所示的欢迎界面,可以选择“New Project”来创建一个新的项目。 - + 创建项目的时候需要指定项目的路径并创建运行项目的”虚拟环境“,如下图所示。 - + 项目创建好以后会出现如下图所示的画面,我们可以通过在项目文件夹上点击鼠标右键,选择“New”菜单下的“Python File”来创建一个Python文件,创建好的Python文件会自动打开进入可编辑的状态。 -![image-20210720133621079](https://gitee.com/jackfrued/mypic/raw/master/20210720133621.png) +![image-20210720133621079](https://github.com/jackfrued/mypic/raw/master/20210720133621.png) 写好代码后,可以在编辑代码的窗口点击鼠标右键,选择“Run”菜单项来运行代码,下面的“Run”窗口会显示代码的执行结果,如下图所示。 -![image-20210720134039848](https://gitee.com/jackfrued/mypic/raw/master/20210720134039.png) +![image-20210720134039848](https://github.com/jackfrued/mypic/raw/master/20210720134039.png) PyCharm常用的快捷键如下表所示,我们也可以在“File”菜单的“Settings”中定制PyCharm的快捷键(macOS系统是在“PyCharm”菜单的“Preferences”中对快捷键进行设置)。 diff --git a/第10课:常用数据结构之字符串.md b/第10课:常用数据结构之字符串.md index 91ac34c..c872d40 100644 --- a/第10课:常用数据结构之字符串.md +++ b/第10课:常用数据结构之字符串.md @@ -2,7 +2,7 @@ 第二次世界大战促使了现代电子计算机的诞生,世界上的第一台通用电子计算机叫ENIAC(电子数值积分计算机),诞生于美国的宾夕法尼亚大学,占地167平米,重量27吨,每秒钟大约能够完成约5000次浮点运算,如下图所示。ENIAC诞生之后被应用于导弹弹道的计算,而数值计算也是现代电子计算机最为重要的一项功能。 - + 随着时间的推移,虽然数值运算仍然是计算机日常工作中最为重要的组成部分,但是今天的计算机还要处理大量的以文本形式存在的信息。如果我们希望通过Python程序来操作本这些文本信息,就必须要先了解字符串这种数据类型以及与它相关的知识。 diff --git a/第11课:常用数据结构之集合.md b/第11课:常用数据结构之集合.md index 173b043..7bbf566 100644 --- a/第11课:常用数据结构之集合.md +++ b/第11课:常用数据结构之集合.md @@ -91,7 +91,7 @@ print((set1 | set2) - (set1 & set2)) # {1, 3, 5, 7, 8, 10} 通过上面的代码可以看出,对两个集合求交集,`&`运算符和`intersection`方法的作用是完全相同的,使用运算符的方式更直观而且代码也比较简短。相信大家对交集、并集、差集、对称差这几个概念是比较清楚的,如果没什么印象了可以看看下面的图。 - + 集合的交集、并集、差集运算还可以跟赋值运算一起构成复合赋值运算,如下所示。 diff --git a/第12课:常用数据结构之字典.md b/第12课:常用数据结构之字典.md index ba7780b..254024a 100644 --- a/第12课:常用数据结构之字典.md +++ b/第12课:常用数据结构之字典.md @@ -12,7 +12,7 @@ person3 = {'王大锤', 55, 60, '科华北路62号', '中同仁路8号', '131223 说到字典这个词,大家一定不陌生,读小学的时候每个人基本上都有一本《新华字典》,如下图所示。 -![dictionary](https://gitee.com/jackfrued/mypic/raw/master/20210820204829.jpg) +![dictionary](https://github.com/jackfrued/mypic/raw/master/20210820204829.jpg) Python程序中的字典跟现实生活中的字典很像,它以键值对(键和值的组合)的方式把数据组织到一起,我们可以通过键找到与之对应的值并进行操作。就像《新华字典》中,每个字(键)都有与它对应的解释(值)一样,每个字和它的解释合在一起就是字典中的一个条目,而字典中通常包含了很多个这样的条目。 diff --git a/第15课:函数使用进阶.md b/第15课:函数使用进阶.md index 8816ae3..3c3a3da 100644 --- a/第15课:函数使用进阶.md +++ b/第15课:函数使用进阶.md @@ -1,4 +1,4 @@ -## 第13课:函数使用进阶 +## 第15课:函数使用进阶 前面我们讲到了关于函数的知识,我们还讲到过Python中常用的数据类型,这些类型的变量都可以作为函数的参数或返回值,用好函数还可以让我们做更多的事情。 diff --git a/第17课:面向对象编程入门.md b/第17课:面向对象编程入门.md index 29312ac..4fb9e45 100644 --- a/第17课:面向对象编程入门.md +++ b/第17课:面向对象编程入门.md @@ -22,7 +22,7 @@ 在面向对象编程的世界中,**一切皆为对象**,**对象都有属性和行为**,**每个对象都是独一无二的**,而且**对象一定属于某个类**。对象的属性是对象的静态特征,对象的行为是对象的动态特征。按照上面的说法,如果我们把拥有共同特征的对象的属性和行为都抽取出来,就可以定义出一个类。 - + ### 定义类 @@ -224,7 +224,7 @@ print(p1.distance_to(p2)) 面向对象编程是一种非常流行的编程范式,除此之外还有**指令式编程**、**函数式编程**等编程范式。由于现实世界是由对象构成的,而对象是可以接收消息的实体,所以**面向对象编程更符合人类正常的思维习惯**。类是抽象的,对象是具体的,有了类就能创建对象,有了对象就可以接收消息,这就是面向对象编程的基础。定义类的过程是一个抽象的过程,找到对象公共的属性属于数据抽象,找到对象公共的方法属于行为抽象。抽象的过程是一个仁者见仁智者见智的过程,对同一类对象进行抽象可能会得到不同的结果,如下图所示。 - + > **说明:** 本节课的插图来自于 Grady Booc 等撰写的《面向对象分析与设计》一书,该书是讲解面向对象编程的经典著作,有兴趣的读者可以购买和阅读这本书来了解更多的面向对象的相关知识。 diff --git a/第21课:文件读写和异常处理.md b/第21课:文件读写和异常处理.md index cb28820..b3de67b 100644 --- a/第21课:文件读写和异常处理.md +++ b/第21课:文件读写和异常处理.md @@ -20,7 +20,7 @@ 下图展示了如何根据程序的需要来设置`open`函数的操作模式。 - + 在使用`open`函数时,如果打开的文件是字符文件(文本文件),可以通过`encoding`参数来指定读写文件使用的字符编码。如果对字符编码和字符集这些概念不了解,可以看看[《字符集和字符编码》](https://www.cnblogs.com/skynet/archive/2011/05/03/2035105.html)一文,此处不再进行赘述。 diff --git a/第22课:对象的序列化和反序列化.md b/第22课:对象的序列化和反序列化.md index a3a7830..950f77d 100644 --- a/第22课:对象的序列化和反序列化.md +++ b/第22课:对象的序列化和反序列化.md @@ -32,11 +32,11 @@ let obj = { } ``` -image-20210820143756353 +image-20210820143756353 上面的`obj`就是JavaScript中的一个对象,我们可以通过`obj.name`或`obj["name"]`两种方式获取到`name`对应的值,如下图所示。可以注意到,`obj["name"]`这种获取数据的方式跟Python字典通过键获取值的索引操作是完全一致的,而Python中也通过名为`json`的模块提供了字典与JSON双向转换的支持。 - + 我们在JSON中使用的数据类型(JavaScript数据类型)和Python中的数据类型也是很容易找到对应关系的,大家可以看看下面的两张表。 @@ -205,7 +205,7 @@ pip uninstall -y ujson 国内有很多提供网络API接口的网站,例如[聚合数据](https://www.juhe.cn/)、[阿凡达数据](http://www.avatardata.cn/)等,这些网站上有免费的和付费的数据接口,国外的[{API}Search](http://apis.io/)网站也提供了类似的功能,有兴趣的可以自行研究。下面的例子演示了如何使用[`requests`](http://docs.python-requests.org/zh_CN/latest/)库(基于HTTP进行网络资源访问的三方库)访问网络API获取国内新闻并显示新闻标题和链接。在这个例子中,我们使用了名为[天行数据](https://www.tianapi.com/)的网站提供的国内新闻数据接口,其中的APIKey需要自己到网站上注册申请。在天行数据网站注册账号后会自动分配APIKey,但是要访问接口获取数据,需要绑定验证邮箱或手机,然后还要申请需要使用的接口,如下图所示。 -image-20210820151134034 +image-20210820151134034 Python通过URL接入网络,我们推荐大家使用`requests`三方库,它简单且强大,但需要自行安装。 @@ -229,7 +229,7 @@ if resp.status_code == 200: 上面的代码通过`requests`模块的`get`函数向天行数据的国内新闻接口发起了一次请求,如果请求过程没有出现问题,`get`函数会返回一个`Response`对象,通过该对象的`status_code`属性表示HTTP响应状态码,如果不理解没关系,你只需要关注它的值,如果值等于`200`或者其他`2`字头的值,那么我们的请求是成功的。通过`Response`对象的`json()`方法可以将返回的JSON格式的数据直接处理成Python字典,非常方便。天行数据国内新闻接口返回的JSON格式的数据(部分)如下图所示。 - + > **提示**:上面代码中的APIKey需要换成自己在天行数据网站申请的APIKey。天行数据网站上还有提供了很多非常有意思的API接口,例如:垃圾分类、周公解梦等,大家可以仿照上面的代码来调用这些接口。每个接口都有对应的接口文档,文档中有关于如何使用接口的详细说明。 diff --git a/第25课:用Python读写Excel文件-2.md b/第25课:用Python读写Excel文件-2.md index 0a24643..8efa132 100644 --- a/第25课:用Python读写Excel文件-2.md +++ b/第25课:用Python读写Excel文件-2.md @@ -175,7 +175,7 @@ wb.save('demo.xlsx') 运行上面的代码,打开生成的Excel文件,效果如下图所示。 -image-20210819235009026 +image-20210819235009026 ### 简单的总结 diff --git a/第26课:用Python操作Word文件和PowerPoint.md b/第26课:用Python操作Word文件和PowerPoint.md index 295123d..5552bc3 100644 --- a/第26课:用Python操作Word文件和PowerPoint.md +++ b/第26课:用Python操作Word文件和PowerPoint.md @@ -87,7 +87,7 @@ document.save('demo.docx') 执行上面的代码,打开生成的Word文档,效果如下图所示。 -image-20210820002742341  image-20210820002843696 +image-20210820002742341  image-20210820002843696 对于一个已经存在的Word文件,我们可以通过下面的代码去遍历它所有的段落并获取对应的内容。 @@ -121,7 +121,7 @@ for no, p in enumerate(doc.paragraphs): 按照上面的思路,我们首先编辑一个离职证明的模板文件,如下图所示。 -image-20210820004223731 +image-20210820004223731 接下来我们读取该文件,将占位符替换为真实信息,就可以生成一个新的Word文档,如下所示。 @@ -182,7 +182,7 @@ for emp_dict in employees: 执行上面的代码,会在当前路径下生成三个Word文档,如下图所示。 -image-20210820004825183 +image-20210820004825183 ### 生成PowerPoint @@ -238,7 +238,7 @@ pres.save('test.pptx') 运行上面的代码,生成的PowerPoint文件如下图所示。 -image-20210820010306008 +image-20210820010306008 ### 简单的总结 diff --git a/第28课:用Python处理图像.md b/第28课:用Python处理图像.md index c0dba9b..6b7c079 100644 --- a/第28课:用Python处理图像.md +++ b/第28课:用Python处理图像.md @@ -40,7 +40,7 @@ Pillow中最为重要的是`Image`类,可以通过`Image`模块的`open`函数 image.show() ``` - + 2. 剪裁图像 @@ -49,7 +49,7 @@ Pillow中最为重要的是`Image`类,可以通过`Image`模块的`open`函数 image.crop((80, 20, 310, 360)).show() ``` - + 3. 生成缩略图 @@ -59,7 +59,7 @@ Pillow中最为重要的是`Image`类,可以通过`Image`模块的`open`函数 image.show() ``` - + 4. 缩放和黏贴图像 @@ -77,7 +77,7 @@ Pillow中最为重要的是`Image`类,可以通过`Image`模块的`open`函数 luohao_image.show() ``` - + 5. 旋转和翻转 @@ -91,7 +91,7 @@ Pillow中最为重要的是`Image`类,可以通过`Image`模块的`open`函数 image.transpose(Image.FLIP_TOP_BOTTOM).show() ``` - + 6. 操作像素 @@ -103,7 +103,7 @@ Pillow中最为重要的是`Image`类,可以通过`Image`模块的`open`函数 image.show() ``` - + 7. 滤镜效果 @@ -115,13 +115,13 @@ Pillow中最为重要的是`Image`类,可以通过`Image`模块的`open`函数 image.filter(ImageFilter.CONTOUR).show() ``` - + ### 使用Pillow绘图 Pillow中有一个名为`ImageDraw`的模块,该模块的`Draw`函数会返回一个`ImageDraw`对象,通过`ImageDraw`对象的`arc`、`line`、`rectangle`、`ellipse`、`polygon`等方法,可以在图像上绘制出圆弧、线条、矩形、椭圆、多边形等形状,也可以通过该对象的`text`方法在图像上添加文字。 - + 要绘制如上图所示的图像,完整的代码如下所示。 diff --git a/第29课:用Python发送邮件和短信.md b/第29课:用Python发送邮件和短信.md index b2ec68d..ca745b5 100644 --- a/第29课:用Python发送邮件和短信.md +++ b/第29课:用Python发送邮件和短信.md @@ -10,9 +10,9 @@ 我们先尝试一下发送一封极为简单的邮件,该邮件不包含附件、图片以及其他超文本内容。发送邮件首先需要接入邮件服务器,我们可以自己架设邮件服务器,这件事情对新手并不友好,但是我们可以选择使用第三方提供的邮件服务。例如,我在已经注册了账号,登录成功之后,就可以在设置中开启SMTP服务,这样就相当于获得了邮件服务器,具体的操作如下所示。 -image-20210820190306861 +image-20210820190306861 -![image-20210820190816557](https://gitee.com/jackfrued/mypic/raw/master/20210820190816.png) +![image-20210820190816557](https://github.com/jackfrued/mypic/raw/master/20210820190816.png) 用手机扫码上面的二维码可以通过发送短信的方式来获取授权码,短信发送成功后,点击“我已发送”就可以获得授权码。授权码需要妥善保管,因为一旦泄露就会被其他人冒用你的身份来发送邮件。接下来,我们就可以编写发送邮件的代码了,如下所示。 @@ -147,7 +147,7 @@ def send_email(*, from_user, to_users, subject='', content='', filenames=[]): 发送短信也是项目中常见的功能,网站的注册码、验证码、营销信息基本上都是通过短信来发送给用户的。发送短信需要三方平台的支持,下面我们以[螺丝帽平台](https://luosimao.com/)为例,为大家介绍如何用Python程序发送短信。注册账号和购买短信服务的细节我们不在这里进行赘述,大家可以咨询平台的客服。 -![image-20210820194420911](https://gitee.com/jackfrued/mypic/raw/master/20210820194421.png) +![image-20210820194420911](https://github.com/jackfrued/mypic/raw/master/20210820194421.png) 接下来,我们可以通过`requests`库向平台提供的短信网关发起一个HTTP请求,通过将接收短信的手机号和短信内容作为参数,就可以发送短信,代码如下所示。 @@ -189,11 +189,11 @@ if __name__ == '__main__': 上面请求螺丝帽的短信网关`http://sms-api.luosimao.com/v1/send.json`会返回JSON格式的数据,如果返回`{'error': 0, 'msg': 'OK'}`就说明短信已经发送成功了,如果`error`的值不是`0`,可以通过查看官方的[开发文档](https://luosimao.com/docs/api/)了解到底哪个环节出了问题。螺丝帽平台常见的错误类型如下图所示。 -image-20210820195505761 +image-20210820195505761 目前,大多数短信平台都会要求短信内容必须附上签名,下图是我在螺丝帽平台配置的短信签名“【Python小课】”。有些涉及到敏感内容的短信,还需要提前配置短信模板,有兴趣的读者可以自行研究。一般情况下,平台为了防范短信被盗用,还会要求设置“IP白名单”,不清楚如何配置的可以咨询平台客服。 -![image-20210820194653785](https://gitee.com/jackfrued/mypic/raw/master/20210820194653.png) +![image-20210820194653785](https://github.com/jackfrued/mypic/raw/master/20210820194653.png) 当然国内的短信平台很多,读者可以根据自己的需要进行选择(通常会考虑费用预算、短信达到率、使用的难易程度等指标),如果需要在商业项目中使用短信服务建议购买短信平台提供的套餐服务。 diff --git a/第30课:正则表达式的应用.md b/第30课:正则表达式的应用.md index bd86212..940daa2 100644 --- a/第30课:正则表达式的应用.md +++ b/第30课:正则表达式的应用.md @@ -100,7 +100,7 @@ if m1 and m2: 下面这张图是截止到2017年底,国内三家运营商推出的手机号段。 - + ```Python import re diff --git a/第31课:网络数据采集概述.md b/第31课:网络数据采集概述.md index cd4b240..cc101a1 100644 --- a/第31课:网络数据采集概述.md +++ b/第31课:网络数据采集概述.md @@ -40,7 +40,7 @@ Disallow: / 图1. 百度搜索淘宝的结果 -![](https://gitee.com/jackfrued/mypic/raw/master/20210824004320.png) +![](https://github.com/jackfrued/mypic/raw/master/20210824004320.png) 下面是豆瓣网的[`robots.txt`](https://www.douban.com/robots.txt)文件,大家可以自行解读,看看它做出了什么样的限制。 @@ -89,19 +89,19 @@ Disallow: /j/ 图2. HTTP请求 -![http-request](https://gitee.com/jackfrued/mypic/raw/master/20210824003915.png) +![http-request](https://github.com/jackfrued/mypic/raw/master/20210824003915.png) HTTP 请求通常是由请求行、请求头、空行、消息体四个部分构成,如果没有数据发给服务器,消息体就不是必须的部分。请求行中包含了请求方法(GET、POST 等,如下表所示)、资源路径和协议版本;请求头由若干键值对构成,包含了浏览器、编码方式、首选语言、缓存策略等信息;请求头的后面是空行和消息体。 - + 图3. HTTP响应 -![http-response](https://gitee.com/jackfrued/mypic/raw/master/20210824234158.png) +![http-response](https://github.com/jackfrued/mypic/raw/master/20210824234158.png) HTTP 响应通常是由响应行、响应头、空行、消息体四个部分构成,其中消息体是服务响应的数据,可能是 HTML 页面,也有可能是JSON或二进制数据等。响应行中包含了协议版本和响应状态码,响应状态码有很多种,常见的如下表所示。 - + #### 相关工具 @@ -115,11 +115,11 @@ HTTP 响应通常是由响应行、响应头、空行、消息体四个部分构 - 网络(Network):用于 HTTP 请求、HTTP 响应以及与网络连接相关的信息。 - 应用(Application):用于查看浏览器本地存储、后台任务等内容,本地存储主要包括Cookie、Local Storage、Session Storage等。 - ![chrome-developer-tools](https://gitee.com/jackfrued/mypic/raw/master/20210824004034.png) + ![chrome-developer-tools](https://github.com/jackfrued/mypic/raw/master/20210824004034.png) 2. Postman:功能强大的网页调试与 RESTful 请求工具。Postman可以帮助我们模拟请求,非常方便的定制我们的请求以及查看服务器的响应。 - ![postman](https://gitee.com/jackfrued/mypic/raw/master/20210824004048.png) + ![postman](https://github.com/jackfrued/mypic/raw/master/20210824004048.png) 3. HTTPie:命令行HTTP客户端。 @@ -187,7 +187,7 @@ HTTP 响应通常是由响应行、响应头、空行、消息体四个部分构 一个基本的爬虫通常分为数据采集(网页下载)、数据处理(网页解析)和数据存储(将有用的信息持久化)三个部分的内容,当然更为高级的爬虫在数据采集和处理时会使用并发编程或分布式技术,这就需要有调度器(安排线程或进程执行对应的任务)、后台管理程序(监控爬虫的工作状态以及检查数据抓取的结果)等的参与。 -![crawler-workflow](https://gitee.com/jackfrued/mypic/raw/master/20210824004107.png) +![crawler-workflow](https://github.com/jackfrued/mypic/raw/master/20210824004107.png) 一般来说,爬虫的工作流程包括以下几个步骤: diff --git a/第32课:用Python获取网络资源.md b/第32课:用Python获取网络资源.md index ab7ede2..e182131 100644 --- a/第32课:用Python获取网络资源.md +++ b/第32课:用Python获取网络资源.md @@ -6,7 +6,7 @@ 要使用 Python 获取网络数据,我们推荐大家使用名为`requests` 的三方库,这个库我们在之前的课程中其实已经使用过了。按照官方网站的解释,`requests`是基于 Python 标准库进行了封装,简化了通过 HTTP 或 HTTPS 访问网络资源的操作。上课我们提到过,HTTP 是一个请求响应式的协议,当我们在浏览器中输入正确的 [URL](https://developer.mozilla.org/zh-CN/docs/Learn/Common_questions/What_is_a_URL)(通常也称为网址)并按下 Enter 键时,我们就向网络上的 [Web 服务器](https://developer.mozilla.org/zh-CN/docs/Learn/Common_questions/What_is_a_web_server)发送了一个 HTTP 请求,服务器在收到请求后会给我们一个 HTTP 响应。在 Chrome 浏览器中的菜单中打开“开发者工具”切换到“Network”选项卡就能够查看 HTTP 请求和响应到底是什么样子的,如下图所示。 -![](https://gitee.com/jackfrued/mypic/raw/master/20210822093434.png) +![](https://github.com/jackfrued/mypic/raw/master/20210822093434.png) 通过`requests`库,我们可以让 Python 程序向浏览器一样向 Web 服务器发起请求,并接收服务器返回的响应,从响应中我们就可以提取出想要的数据。浏览器呈现给我们的网页是用 [HTML](https://developer.mozilla.org/zh-CN/docs/Web/HTML) 编写的,浏览器相当于是 HTML 的解释器环境,我们看到的网页中的内容都包含在 HTML 的标签中。在获取到 HTML 代码后,就可以从标签的属性或标签体中提取内容。下面例子演示了如何获取网页 HTML 代码,我们通过`requests`库的`get`函数,获取了搜狐首页的代码。 @@ -54,7 +54,7 @@ with open('baidu.png', 'wb') as file: 接下来,我们以“豆瓣电影”为例,为大家讲解如何编写爬虫代码。按照上面提供的方法,我们先使用`requests`获取到网页的HTML代码,然后将整个代码看成一个长字符串,这样我们就可以使用正则表达式的捕获组从字符串提取我们需要的内容。下面的代码演示了如何从[豆瓣电影](https://movie.douban.com/)获取排前250名的电影的名称。[豆瓣电影Top250](https://movie.douban.com/top250)的页面结构和对应代码如下图所示,可以看出,每页共展示了25部电影,如果要获取到 Top250 数据,我们共需要访问10个页面,对应的地址是,这里的`xxx`如果为`0`就是第一页,如果`xxx`的值是`100`,那么我们可以访问到第五页。为了代码简单易读,我们只获取电影的标题和评分。 -![](https://gitee.com/jackfrued/mypic/raw/master/20210822093447.png) +![](https://github.com/jackfrued/mypic/raw/master/20210822093447.png) ```Python import random @@ -92,7 +92,7 @@ for page in range(1, 11): 下面以[蘑菇代理](http://www.moguproxy.com/)为例,为大家讲解商业 IP 代理的使用方法。首先需要在该网站注册一个账号,注册账号后就可以[购买](http://www.moguproxy.com/buy)相应的套餐来获得商业 IP 代理。作为商业用途,建议大家购买不限量套餐,这样可以根据实际需要获取足够多的代理 IP 地址;作为学习用途,可以购买包时套餐或根据自己的需求来决定。蘑菇代理提供了两种接入代理的方式,分别是 API 私密代理和 HTTP 隧道代理,前者是通过请求蘑菇代理的 API 接口获取代理服务器地址,后者是直接使用统一的入口(蘑菇代理提供的域名)进行接入。 - + 下面,我们以HTTP隧道代理为例,为大家讲解接入 IP 代理的方式,大家也可以直接参考蘑菇代理官网提供的代码来为爬虫设置代理。 @@ -127,6 +127,8 @@ for page in range(1, 11): ``` > **说明**:上面的代码需要修改`APP_KEY`为自己创建的订单对应的`Appkey`值,这个值可以在用户中心用户订单中查看到。蘑菇代理提供了免费的 API 代理和 HTTP 隧道代理试用,但是试用的代理接通率不能保证,建议大家还是直接购买一个在自己支付能力范围内的代理服务来体验。 +> +> **另注**:蘑菇代理目前已经停止服务了,大家可以按照上面讲解的方式使用其他商业代理即可。 ### 简单的总结 diff --git a/第33课:用Python解析HTML页面.md b/第33课:用Python解析HTML页面.md index b357bcb..309471d 100644 --- a/第33课:用Python解析HTML页面.md +++ b/第33课:用Python解析HTML页面.md @@ -6,7 +6,7 @@ 我们在浏览器中打开任意一个网站,然后通过鼠标右键菜单,选择“显示网页源代码”菜单项,就可以看到网页对应的 HTML 代码。 -![image-20210822094218269](https://gitee.com/jackfrued/mypic/raw/master/20210822094218.png) +![](https://github.com/jackfrued/mypic/raw/master/20210822094218.png) 代码的第`1`行是文档类型声明,第`2`行的``标签是整个页面根标签的开始标签,最后一行是根标签的结束标签``。``标签下面有两个子标签``和``,放在``标签下的内容会显示在浏览器窗口中,这部分内容是网页的主体;放在``标签下的内容不会显示在浏览器窗口中,但是却包含了页面重要的元信息,通常称之为网页的头部。HTML 页面大致的代码结构如下所示。 @@ -78,7 +78,7 @@ XPath还支持通配符用法,如下所示。 当然,如果不理解或不熟悉 XPath 语法,可以在浏览器的开发者工具中按照如下所示的方法查看元素的 XPath 语法,下图是在 Chrome 浏览器的开发者工具中查看豆瓣网电影详情信息中影片标题的 XPath 语法。 -![](https://gitee.com/jackfrued/mypic/raw/master/20210822093707.png) +![](https://github.com/jackfrued/mypic/raw/master/20210822093707.png) 实现 XPath 解析需要三方库`lxml` 的支持,可以使用下面的命令安装`lxml`。 diff --git a/第34课:Python中的并发编程-1.md b/第34课:Python中的并发编程-1.md index 1183e14..7d1c64a 100644 --- a/第34课:Python中的并发编程-1.md +++ b/第34课:Python中的并发编程-1.md @@ -10,7 +10,7 @@ 在程序中使用多线程技术通常都会带来不言而喻的好处,最主要的体现在提升程序的性能和改善用户体验,今天我们使用的软件几乎都用到了多线程技术,这一点可以利用系统自带的进程监控工具(如 macOS 中的“活动监视器”、Windows 中的“任务管理器”)来证实,如下图所示。 - + 这里,我们还需要跟大家再次强调两个概念:**并发**(concurrency)和**并行**(parallel)。**并发**通常是指同一时刻只能有一条指令执行,但是多个线程对应的指令被快速轮换地执行。比如一个处理器,它先执行线程 A 的指令一段时间,再执行线程 B 的指令一段时间,再切回到线程 A 执行一段时间。由于处理器执行指令的速度和切换的速度极快,人们完全感知不到计算机在这个过程中有多个线程切换上下文执行的操作,这就使得宏观上看起来多个线程在同时运行,但微观上其实只有一个线程在执行。**并行**是指同一时刻,有多条指令在多个处理器上同时执行,并行必须要依赖于多个处理器,不论是从宏观上还是微观上,多个线程可以在同一时刻一起执行的。很多时候,我们并不用严格区分并发和并行两个词,所以我们有时候也把 Python 中的多线程、多进程以及异步 I/O 都视为实现并发编程的手段,但实际上前面两者也可以实现并行编程,当然这里还有一个全局解释器锁(GIL)的问题,我们稍后讨论。 diff --git a/第37课:并发编程在爬虫中的应用.md b/第37课:并发编程在爬虫中的应用.md index 6662c24..63136eb 100644 --- a/第37课:并发编程在爬虫中的应用.md +++ b/第37课:并发编程在爬虫中的应用.md @@ -4,7 +4,7 @@ “360图片”网站的页面使用了 [Ajax](https://developer.mozilla.org/zh-CN/docs/Web/Guide/AJAX) 技术,这是很多网站都会使用的一种异步加载数据和局部刷新页面的技术。简单的说,页面上的图片都是通过 JavaScript 代码异步获取 JSON 数据并动态渲染生成的,而且整个页面还使用了瀑布式加载(一边向下滚动,一边加载更多的图片)。我们在浏览器的“开发者工具”中可以找到提供动态内容的数据接口,如下图所示,我们需要的图片信息就在服务器返回的 JSON 数据中。 - + 例如,要获取“美女”频道的图片,我们可以请求如下所示的URL,其中参数`ch`表示请求的频道,`=`后面的参数值`beauty`就代表了“美女”频道,参数`sn`相当于是页码,`0`表示第一页(共`30`张图片),`30`表示第二页,`60`表示第三页,以此类推。 diff --git a/第38课:抓取网页动态内容.md b/第38课:抓取网页动态内容.md index f04b86f..e1ace08 100644 --- a/第38课:抓取网页动态内容.md +++ b/第38课:抓取网页动态内容.md @@ -6,7 +6,7 @@ Selenium 是一个自动化测试工具,利用它可以驱动浏览器执行特定的行为,最终帮助爬虫开发者获取到网页的动态内容。简单的说,只要我们在浏览器窗口中能够看到的内容,都可以使用 Selenium 获取到,对于那些使用了 JavaScript 动态渲染技术的网站,Selenium 会是一个重要的选择。下面,我们还是以 Chrome 浏览器为例,来讲解 Selenium 的用法,大家需要先安装 Chrome 浏览器并下载它的驱动。Chrome 浏览器的驱动程序可以在[ChromeDriver官网](https://chromedriver.chromium.org/downloads)进行下载,驱动的版本要跟浏览器的版本对应,如果没有完全对应的版本,就选择版本代号最为接近的版本。 - + ### 使用Selenium @@ -136,7 +136,7 @@ browser.execute_script('document.documentElement.scrollTop = document.documentEl 有一些网站专门针对 Selenium 设置了反爬措施,因为使用 Selenium 驱动的浏览器,在控制台中可以看到如下所示的`webdriver`属性值为`true`,如果要绕过这项检查,可以在加载页面之前,先通过执行 JavaScript 代码将其修改为`undefined`。 - + 另一方面,我们还可以将浏览器窗口上的“Chrome正受到自动测试软件的控制”隐藏掉,完整的代码如下所示。 diff --git a/第39课:爬虫框架Scrapy简介.md b/第39课:爬虫框架Scrapy简介.md index 5b2ca62..377e88a 100644 --- a/第39课:爬虫框架Scrapy简介.md +++ b/第39课:爬虫框架Scrapy简介.md @@ -6,7 +6,7 @@ Scrapy 是基于 Python 的一个非常流行的网络爬虫框架,可以用来抓取 Web 站点并从页面中提取结构化的数据。下图展示了 Scrapy 的基本架构,其中包含了主要组件和系统的数据处理流程(图中带数字的红色箭头)。 -![](https://gitee.com/jackfrued/mypic/raw/master/20210824003638.png) +![](https://github.com/jackfrued/mypic/raw/master/20210824003638.png) #### Scrapy的组件 diff --git a/第40课:关系型数据库和MySQL概述.md b/第40课:关系型数据库和MySQL概述.md index 63dc6cf..1d3439c 100644 --- a/第40课:关系型数据库和MySQL概述.md +++ b/第40课:关系型数据库和MySQL概述.md @@ -20,7 +20,7 @@ **ER模型**,全称为**实体关系模型**(Entity-Relationship Model),由美籍华裔计算机科学家陈品山先生提出,是概念数据模型的高层描述方式,如下图所示。 - + - 实体 - 矩形框 - 属性 - 椭圆框 @@ -29,7 +29,7 @@ 实际项目开发中,我们可以利用数据库建模工具(如:PowerDesigner)来绘制概念数据模型(其本质就是 ER 模型),然后再设置好目标数据库系统,将概念模型转换成物理模型,最终生成创建二维表的 SQL(很多工具都可以根据我们设计的物理模型图以及设定的目标数据库来导出 SQL 或直接生成数据表)。 - ![](https://gitee.com/jackfrued/mypic/raw/master/20210826003212.png) + ![](https://github.com/jackfrued/mypic/raw/master/20210826003212.png) 5. 关系数据库产品。 - [Oracle](https://www.oracle.com/index.html) - 目前世界上使用最为广泛的数据库管理系统,作为一个通用的数据库系统,它具有完整的数据管理功能;作为一个关系数据库,它是一个完备关系的产品;作为分布式数据库,它实现了分布式处理的功能。在 Oracle 最新的 12c 版本中,还引入了多承租方架构,使用该架构可轻松部署和管理数据库云。 @@ -52,85 +52,85 @@ MySQL 在过去由于性能高、成本低、可靠性好,已经成为最流 1. 通过[官方网站](https://www.mysql.com/)提供的[下载链接](https://dev.mysql.com/downloads/windows/installer/8.0.html)下载“MySQL社区版服务器”安装程序,如下图所示,建议大家下载离线安装版的MySQL Installer。 - + 2. 运行 Installer,按照下面的步骤进行安装。 - 选择自定义安装。 - + - 选择需要安装的组件。 - + - 如果缺少依赖项,需要先安装依赖项。 - + - 准备开始安装。 - + - 安装完成。 - + - 准备执行配置向导。 - + 3. 执行安装后的配置向导。 - 配置服务器类型和网络。 - + - 配置认证方法(保护密码的方式)。 - + - 配置用户和角色。 - + - 配置Windows服务名以及是否开机自启。 - + - 配置日志。 - + - 配置高级选项。 - ACAC15B8633133B65476286A49BFBD7E + ACAC15B8633133B65476286A49BFBD7E - 应用配置。 - + 4. 可以在 Windows 系统的“服务”窗口中启动或停止 MySQL。 - + 5. 配置 PATH 环境变量,以便在命令行提示符窗口使用 MySQL 客户端工具。 - 打开 Windows 的“系统”窗口并点击“高级系统设置”。 - + - 在“系统属性”的“高级”窗口,点击“环境变量”按钮。 - + - 修改PATH环境变量,将MySQL安装路径下的`bin`文件夹的路径配置到PATH环境变量中。 - + - 配置完成后,可以尝试在“命令提示符”下使用 MySQL 的命令行工具。 - + #### Linux 环境 @@ -273,22 +273,22 @@ MySQL 在过去由于性能高、成本低、可靠性好,已经成为最流 - MySQL Workbench(官方工具) - + - Navicat for MySQL(界面简单友好) - + #### macOS环境 macOS 系统安装 MySQL 是比较简单的,只需要从刚才说到的官方网站下载 DMG 安装文件并运行就可以了,下载的时候需要根据自己使用的是 Intel 的芯片还是苹果的 M1 芯片选择下载链接,如下图所示。 - + 安装成功后,可以在“系统偏好设置”中找到“MySQL”,在如下所示的画面中,可以启动和停止 MySQL 服务器,也可以对 MySQL 核心文件的路径进行配置。 - + ### MySQL 基本命令