粉丝1.6万获赞6.0万

好的,欢迎回来,我们讲完了 i m s 归一化旋转位置编码 attention 机制, f f n 神乾坤神网络 mo e 混合专家模型的所有实现啊,也讲完了 transformer block 的 实现,我们终于来要来拼接 transformer 主模型了。好的,我们来一步一步看一下抽象主模型了。好的,我们来一步一步看一下抽象主模型了。一个就是流程图。 好,我们来看它抽象,抽象阶段呢?还是一样的参数,还是一样的字标尺寸读取,然后啊, transformer block 的 层数, ok, 然后词切入这边,就是直接用 n n 点 embedded 啊,将这个 token id 转化成了这个 映射为向量。第二步就是堆叠很多层啊,它创建了很多个啊, transformer block 的 实体,对吧?啊,这个就是换成一个 module list 的 列列表, ok, 然后,然后到最后一步还要进行一次再归优化,因为你这输出是一个得分嘛, logics 得分,所以它要进行一个再归优化的操作啊,再归优化操作好,输出层是不是要词表映射啊?就是 把你的这个输出出来的向量映射回词表上面的某个东西的概率, ok, 好, 然后前面的话,我们还要预先 计算好所有的旋转位置编码的频率, ok, 好, 这样就避免到循环阶段重复计算,这样是很麻烦的一件事情。好,前面提到是不是有一个野马操作啊? 野马操作是防止模型看到后面的答案对不对啊?野马操作设定一个就是为就是最大最大词凑克量的这个啊,方阵啊,最大凑克量,然后全部元素初始化为负无穷, ok, 然后当我们要用的时候,就取裁切右上角的啊,选你需要的就行。然后就是它表示这个抽象化是不是全是负无穷啊?其实我们只需要右上角为负无穷就行啊,这个呆呆呆个闹钟是对角线的意思,对角线等于表示沿着对角线向右移动一步,也就是这左下角全是零,然后这右上角一个小三角,是啊,全全是负无穷,这就是这个掩码的抽象化, 然后它掩码也要注册在这个 g c p u g p u 里面啊,这个东西让它在 c p u 和 g p u 里面移动,但它是模型成员,但它不是参数,不会更新, ok, 我们还要注意一下,就是我们不是说了吗,要防止专家垄断啊,某几个专家垄断,对吧?那我们就要映射一个辅助损失函数啊,就是这么个东西,到时候损失计算损失函数时候要加上这么一项,要让他尽可能想, ok, 好 的,最后来看他核心的这个计算逻辑。 首先呢,他要确定一件事情,就是你输入的 tokens 是 不是 null 啊?不是 null 的 话他才会执行这个。哎,如果是 null 的 话,他会做一步其他操作,就是这个是为了多模态映射做准备的,我们的模型完全可以 很轻松地转移到多舞台,就是把文本和图片结合到一起,文文本、视频、图片、音频这这几个多常见多舞台融合到一起。第二步就是添加这个野马逻辑了,就是野马,它不是一开始设置了最大尺寸嘛,现在我们要裁切到这个 segments 的 尺寸频率矩阵切片到当前的长度,这也是切片的另一个那个是 步骤。好,第三步就是进层,进行这个 n 层啊 block 的 加工。哎,对于每一层之后,它它会就是一个地归它 h, 它是不是不断的往里丢啊?丢到最后一层 layer in self layers, 这个时候层数由我们自己设定,比方说五层对不对? 好,每一层它都会不停的嵌套,嵌套出来好,结束之后得到了新最新的这个 h, 也就是最后一层的 h 出来,出来之后我们要对它进行一次归一化,归一化之后得到这个新的 h。 好, 然后我们再用 logics 给它做一个 映射回这个词表空间,这个 lodis 我 们就是要用来做这个训练用的东西,这是最终的一步输出,哎,给他映射回这个词表空间,这样的话他就可以就是每个词的得分,这样的话就可以去跟那个 loss 损失函数去做连接,然后 return lodis, 点 float, 把这个 呃 lodis 矩阵的 float 三二的矩阵所有元素给它返回出来啊,这就是我们的模型的全部内容,我们已经搭建完了模型,剩下就是啊,如何构建训练逻辑和构建推理逻辑,构建这个数据加载等等逻辑。 ok, 那 我们第十九节就讲到这里。

我是拍摄老包,每天五分钟带大家学习拍摄啊这个编程技巧,今天呢主要是教给大家一个有用的知识啊, 就是我们经常啊,在平常的业务中,可能会会在一堆的这个制服串里面啊,去提取里面有用的信息 啊,比如说我们从某一些网站啊啊,去采集一些数据,那么这些数据呢,往往是不规则的啊,比如说像这样子的一些数据 啊,那然后呢,那我们需要对这些数据进行规整啊,提取出有用的信息,比如说一个名字啊,然后后面一串数字,对吧?啊,这个提取出来,那怎么做呢 啊?如果你没有学今天这个课程啊,大家可能会想啊,我可以对这个字幕串啊进行分割,对吧?进行分割,然后再把名字和数字再进行分割,哎,这样就得到了名字和号码,但是 有可能是什么啊?有可能你这个分割的地方啊,他的字幕串是不一定的,你看有的地方是空格,有的地方呢 是逗号,然后名字和号码之间呢,有的是这个英文的冒号,有的呢还是用这种监监,就是监号,然后这个冒号呢,还有可能是中文的冒号,就是各种各样奇奇怪怪的格式都有,所以你没办法用一个 就是正常的那个代码去处理啊,就是没办法用我们通常的这种逻辑思维,逻辑思路去处理 啊,那怎么办呢?像这种啊制服串的处理呢,我们往往使用正则表达式啊,正则表达式,那我们使用正则表达式呢,我们需要用到排省里面自带的一个正则的模块啊,我们先把它导进来, import r 一 啊, 这模块名呢,就叫 r 一, 然后呢,我们可以去使用 r 一 里面的 find 二啊, find 二, 那翻到哦,翻到什么呢?假如我们只是把这个数字给提取出来,那非常简单,哎,我们直接写一个表达式啊,杠 d, 杠 d 代表的是数字啊,代表数字,然后这里的数字有很多,对吧?那数字的个数不确定啊,有的长,有的短, ok, 那 我们在这里啊啊,加一个加号啊,代表把所有的数字啊都给匹配出来 好,但这个数字呢,是连着的啊,连着的数字啊,连着的这个算是一串数字,连着的这个算是一串数字啊,中间如果隔了其他的制服,那这个就算不同的数字了啊,然后那这个杠地呢 啊,我们要防止它进行一个转移啊,我们前面加一个二啊,代表这个是正则表达式啊,正则表达式,然后我们要把匹配的支付串啊传到这个函数里面去啊。 test, 好, 那这个 find 二呢,会给我们返回所有匹配的结果啊,这样我们就给它取名一个叫 matches, 给它取名 matches, 然后接下来呢,我们就可以对它进行循环了啊, for item in matches, 然后我们直接打印 item 好, 然后我们再执行一下,看它是不是能够把我们所有的需要的数字给提取出来啊,好,你看所有的数字都提取出来了,对吧?这个笔我们通过 呃制服算的那个分割,然后去掉,这个中文要简单很多对不对? 这个就是正则表达式的魅力啊,魅力所在。那么有的同学说,哎,我光提取数据好像没什么意义啊,这个前面的名字都给丢掉了,那有没有办法把名字和数字一体一起提取出来呢?哎,也是可以的啊, 那怎么表表示这个前面的这个啊?名字呢,我们可以用杠 w 去匹配啊, 然后杠 w 代表的是一个,呃,一个一个文字啊,代表是一个文字啊,或者说一个单词啊,那么这里很明显不止一个啊,所以呢,我们这里也加了一个加号啊,代表匹配多个啊,代表匹配多个, 然后,哦,名字后面呢?还有什么?还有一些符号,对吧?这个符号可能是英文的冒号,也可能是中文的冒号,还有可能是兼括号,那这个怎么办呢?哎,我们用一个点号代表匹配啊,任意的这种字母啊, 然后只匹配一个啊,只匹配一个啊,然后接下来呢,我们在杠 w 这个这里啊,加一个括号, 杠 d 这里呢,也加一个括号啊,把这个加号也围进去啊,那这样呢,加了括号代表什么呢?加了括号代表给他做了一个分组 啊,做了分组。一个呢,是把前面的名字啊,做了分组,另外一个呢,把这个数字做一个分组,那中间这一个呢,我们我们就把它丢掉了,就不要了啊,就不要了, ok, 然后接下来我们看啊,调试一下, 好运行到这里,你看啊,第一个匹配的像是这一个啊,然后他给我们把这个小名提取出来了,然后把这个数字给提取出来了,然后我们继续往下 好,第二个呢是把小红提取出来了,还有它的数字,哎,中间的冒号就丢掉了,对吧?而小李也是一样,好,世界也是一样,对吧?好,这个也是一样,至此我们就已经达到目标了, 它给我们返回的是一个原组,对吧?就是正好我们这里做的两个分组。那我们可以给它格式化一下啊,通过 f 指令啊, 一个是 item 零,然后中间加个冒号, item 一 好,然后接下来呢我们再运行。 哎,这样的话,就这个制服串呢就被我们规整好了,对吧?所有有用的信息都提取出来了,而且呢格式呢是非常统一的。好,我是拍摄老包,如果大家对学习拍摄感兴趣啊,欢迎关注啊,点赞收藏。
![REGEXP 精准查找字符 批量提取核心文本内容
匹配手机号:1[3-9]\d{9}
匹配身份证号:\d{17}[\dXx]
匹配纯数字:\d+
匹配中文:[\u4e00-\u9fa5]+
提取字母 + 数字:[a-zA-Z0-9]+
提取邮箱:\w+@\w+\.\w+
#WPS表格 #办公技巧 #EXCEL函数 #职场干货 #办公软件](https://p3-pc-sign.douyinpic.com/image-cut-tos-priv/0b1cd37ae95f9d6cb085245fcb351390~tplv-dy-resize-origshort-autoq-75:330.jpeg?lk3s=138a59ce&x-expires=2099505600&x-signature=Bc3txmpEqSlCwB%2F8nrOHwrypPp0%3D&from=327834062&s=PackSourceEnum_AWEME_DETAIL&se=false&sc=cover&biz_tag=pcweb_cover&l=20260716043029A4A13A25707082917FE5)
精准查找字体,批量提取核心文本内容。我们日常工作中经常会遇到系统导出数据等集中在单元格类,我们如何对我们想要的数据进行提取呢?今天我们就要用到正则表达式函数 read x, 上述是函数的构成,下面我们进行案例讲解。 我们可以看到左侧单元格中有大量的信息,我们如何把手机号码提取出来呢?首先我们在单元格里面输入 read x 函数, 选中单元格逗号双引号,输入一中国号三到九中国号,再输入反斜杠 d 大 括号,九大括号双引号,再输入逗号零结尾, 我们就可以把电话号码提取出来了。那么这段代码是什么意思呢?我们可以理解为它是提取电话号码的要求,那么其中一代表的是提取开头是一的数字,中国号三到九代表是提取第二的数字,需要符合三到九, 那么反斜杠 d 大 括号九代表上述符合要求后再提取后面的九个数字,一共是十一个数字,正好是我们电话号码的长度。那么第二个我们来看怎么提取身份证号码呢?我们依然在单元格里面输入 reject 函数, 选中单元格逗号双引号,输入反斜杠 d 大 括号十七大括号 中国号反斜杠 d 大 x 小 x 中国号双引号,输入逗号零回车,我们就可以把身份证号码提取出来。那么这个表达式中反斜杠 d 代表的是零到九数字,中取数 大括号十七代表取十七个数字,正好是我们的身份证号码长度。那么中括号反斜杠 d 大 x 小 x 代表如果这十七个数字中有一个是 x, 那 就取十六加 x, 因为我们有的身份证号码结尾是 x 结尾,那么我们看第三个, 我们提取内容之中有身份证号码,也有手机号码,我们如果按上述的方式能不能成功呢?因为我们把第一个函数直接复制过来, 我们发现就会有错误,那是因为我们的身份证号码里面包含了相似的手机号码,判定条件有模糊,所以取数失败。那怎么解决呢?这里面我们就需要寻找了规律,我们发现 我们的电话号码前面有一个联系电话冒号,所以说我们就需要把函数前面加上联系电话冒号回车。 我们发现我们加了前缀之后,就可以通过前缀来抓取到电话号码。类似正则表达式还有很多, 下面是我们常用的一些正则表达式,因为这个代码是比较难记的,日常的应用中我们也可以在豆包中根据自己的需要来搜索,你学会了吗?

正则表达是太强大也太重要了,比如说编程语言的这个元旦吗?语法分析,此法分析用的就是正则表达式,对于我们普通人来讲,他可以非常容易的来分析数据,比如说我将这一行里面的这个 数字提取出来,我们看一下用政策表达是怎么来提取。我将提取后的这个内容复制给一个变量, 杠低是数字的意思, 我们打印一下这个变量,可以看到非常容易的将里面的数字都提取出来了,并且形成了一个列表。

挑战一周,带你学完 python, 跟这个学完,你会发现你真的很牛!警告,本系列最新 python 教程应该是目前全网最系统易懂的小白专用课了,一口气带你学完 python 所有核心内容,存下吧,最新版错过就刷不到了! 新的一年, python 到底要怎样学习才正确有效?首先是基础部分,需要学习 python 软件安装、变量运算符、循环字母串元组。 第二阶段是进阶篇,会详细讲解各种 python 进阶知识函数、面向对象、正则表达式等知识,用最易懂的方式带你熟练使用 python, 为后面的路打下牢固的基础。 第三阶段,技能训练会从 python 爬虫、数据分析、人工智能、办公自动化等领域展开,让你可以把所学的知识进行变现,流进你的口袋。为了让大家轻松学习 python, 我们这套课程呢,会从语法入门篇、语法进阶篇、全站实战篇等三大方面来讲解。语法入门篇里面包含了 python 与 patcharm 的 安装以及环境配置学习变量运算符、数据类型、控制、结构函数等。语法编程 语法进阶篇里面呢,我会详细讲解每一个进阶知识,从面向对象编程、异常处理、正则表达式等知识。全站实战篇会手把手教大家练习项目,比如爬取图片、视频办公自动化、 数据分析、机器学习等。最后呢,会给大家一个小福利,有搭建开发环境资料包、 python 从零到一的学习计划表、 几十上百季素材、书籍、课件等等,只要你能想到的素材我这里几乎都有,评论留言六六六 即可全部免费打包带走!相信我,这套拍粉系统课程将会是全网最齐全最易懂的小白专用课,如果看到这对你有所帮助的话,请给老师一个免费的一键三连吧,让更多想要学习拍粉的小伙伴看到这个视频。下一站上岸。 大家好,我是讲师潘瑞,这节课内容呢是反反爬,常见的反爬手段。爬虫这一课呢,咱们讲了很多了,咱们再来重新定义一下爬虫, 爬虫呢,就是采取任何手段,或者是用别人开发好的程序来批量的获取对方的数据,这些呢,咱们都叫爬虫, 那反爬是什么呢?那对方呢,使用任何手段阻止你批量的获取数据,那这种呢叫做反爬。那反反爬是什么意思呢?那咱们就是用任何手段绕过对方的反爬策略,从而批量的获取到咱们想要的数据。 那咱们其实呢,还有个概念叫做误伤,就是说做反爬的时候呢,如果反爬措施呢,过于严厉的话呢,那会影响到用户的体验,比如说,呃,有些网站呢,你必须通过登录账号才能够访问, 那有些用户呢,懒得注册这个账号了,他可能就不去看你内容了,这样子呢,你就会损失到一部分流量。还有的网站呢,在你浏览过程中呢,经常会弹出这种验证码呀,各种验证的手段, 那谈的多了,用户感觉体验很不好,是吧,那有可能就少来这个网站,或者不访问了。那反爬呢,他们还要考虑另外一件事,就是反爬呢,也是需要消耗人力,需要消耗机器资源的,那咱们需要开发人员呢,做这种反爬的策略, 反爬的这种策略呢,需要在机器上执行,这样子呢也是消耗大量的机器资源的,那这也是需要成本的,所以呢反爬呢,他就要考虑在用户体验,在这个成本,还有防止别人获取数据这三者呢,之间要做一个平衡。 那反爬它最主要的目的呢?它是防止这种初级爬虫大量的就说来访问这个网站,给它服务器呢造成过大的压力。那还有一点呢,就是防止竞争对手很轻易地获取到它的数据。 那我们看一下有哪些常见的反爬手段。那咱们之前提到过啊,检测这个 user agent, 对吧?那就是说服务器呢,它会做一个初时的检测,比如说它发现你这个 u a 里面带着一些自动化程序的一些痕迹,比如说你是这个 python 自动化程序呢,它检测到了它会立即拒绝访问,对吧?这是一个比较初级的一个检测。 当然了检测 user agent 呢,它还有一点啊,就是说如果某一个 user agent 它大量的访问一个资源,它也会发现这个明显的是异常的,对吧?它也会做出一些应对措施。还有一点呢,就是这个 ip 访问频率的限制, 那同一个 ip 呢,如果短时间内大量的访问这个呢,访问已经超过了一个正常用户的这个浏览行为呢?他也会对你这 ip 做出一个限制,比如说二十四小时内不给你任何数据。那第三种方式呢,就是说必须登录才能访问到内容, 比如说咱们微博呀,那你必须登录才能看到里面的内容,那咱们如果想大量的获取这个微博里面的数据怎么处理啊? 那咱们只有维护多个账号,建立一个账号池,咱们在需要呃获取数据的时候呢,随机的从这个账号池里面提取账号,然后来获取内容,这时候呢,账号管理本身呢比爬虫呢更为重要, 还有一种常见的方式呢,是动态网页,对吧?它采用了 g s 逻辑加密和混销,让你很难通过这种接口来获取到它的数据, 对于咱们初学 python 的 同学来说,这个难度呢是非常大的,那这时候呢,咱们可以考虑用 steam 来获取它的数据,还有种更高级的反爬策略呢,它是采用机器学习,那它全方位的来分析这个用户的这浏览行为, 那爬虫的行为呢,明显呢跟用户浏览行为呢是不一样的,所以呢,它通过多个维度能识别出这个爬虫,那从而进行这个反爬, 所以大家看啊,这个反爬和反反爬呢,咱们相当于一个毛与盾的关系。好,这就是这一个内容,谢谢大家。 大家好,我是讲师潘瑞,这一个内容是反反爬, user agent, user agent 呢,咱们在前面的课程呢,跟大家经常提过,咱们在做一个请求之前呢,咱们通常呢要把自己浏览器的这个 user agent 给它取到,然后放到请求头里面, 这样子呢,对方服务器会识别到咱们,这是一个正常的行为,从而呢咱们可以顺利的获取到数据。但是呢这样做呢,其实是有一个隐患的,这个隐患是什么呢?当我们大量的爬取数据的时候,都使用同一个 user agent, 对方的服务器呢很容易识别出来,哎,这是一个爬虫,正常情况下呢,这个浏览器分布呢是非常均匀的,就是各种各样的浏览器都有,然后各种各样的版本都有,比如说是 ie 浏览器啊,比如说这种 firefox 浏览器啊,呃,比如说,呃这个谷歌浏览器那而且它是有一定分布规律的, 如果在同一个期间呢,呃,只有谷歌浏览器向您请求同一个类型的数据,那很容易呢被对方识别到反爬,咱们要怎么做呢?那咱们可以建立一个自己的这个 user agent 的 池,我们把各式各样浏览器的数据呢放到这个池子里面, 那咱们在爬取数据的时候呢,咱们从这个池子里面呢,按照一定分布规律呢给它取出来,那咱们自己呢去建这个池子呢,还是相当麻烦的,那咱们这边呢给他介绍一个工具,这个工具呢就能完成咱们说的这个功能,构建一个 user agent 池,然后呢按照分布规律呢可以取出这个数据来 来,咱们今天介绍的工具呢叫做 fake user agent, 咱们在使用之前呢也要给它安装一下。 来,我们点一下 python package 来看这个呢,我已经安装好了,它的名字呢就叫做 fake gun user agent, 那 这个库呢?安装好以后呢,我们来看一下如何使用啊?那咱们首先导入 from fake user agent, 然后呢我们导入什么呢?我们导入 user agent 这个类,好,那我们先实力划一下这个类啊, u a 等于这个 user agent, 那我们现在呢就是说啊,想随机地从这个库里面取出来一个 user agent, 那 怎么使用呢?来看啊,我们建一个 user agent 这个变量啊叫 user agent 等于这个 u a, 我 们从这个 u a 呢使用这个 random 这个方法, 那咱们就可以随机地取出来一个 user agent, 我 们看一下,来,我们来运行一下, 来看,现在是这个取出来是这个 user agent, 那 我们再次运行一下,哎,大家看它变化了, 对吧?我们再运行一下,那我们发现没有,它每次都不一样,那实际上呢,它这个分布规律呢?就是按照这个正常的用户的实际的一个分布规律来提取的, 通过这种方式呢,对方的服务器呢,就很难识别出咱们这是一个自动化程序,那咱们实际中怎么使用呢?来看,那实际中咱们是不是要用 request 模块呃来请求一个数据,比如说咱们导入一下 request 模块,然后呢,咱们通常会不会构建一个请求头啊?那 headers 等于 我们来写一下 user agent, 然后冒号,我们这后面呢就写一下 user agent, 咱们每次使用的时候呢,咱们调用一下这个,它就会随机的产生一个 user agent, 写一个网址,咱们要访问的网址啊,比如说 h t t p s 点三 w 点百度,对吧?咱们访问一下,百度来,咱们请求一下 r 等于 request 点 get, 然后向这个地址来发送请求,那请求头是 headers 等于 headers, 对 吧?来咱们打印一下 r 点 text, 那 这样子呢,咱们就访问到了这个百度了,这就这一课内容啊,谢谢大家。大家好,我是讲师潘瑞,这一课内容呢是反反爬 ip 代理。 那我们在做爬虫的时候呢,如果短时间内同时呢向一个服务器发送大量的请求,很可能会触发这个服务器的一个反爬机制,那这个服务器呢,它会做一个检测,它会检测一下一个 ip 在 这段时间内的访问量是多少, 如果这访问量过大的话呢,明显的超出了一个正常的这个浏览行为呢,他会对这个 ip 呢做出限制,比如说啊,他二在二十四小时内不给你任何结果,那这时候怎么办呢?这时候呢咱们就要使用 ip 代理, 来我们看一下什么是 ip 代理,在没有使用这个 ip 代理的时候呢,实际上呢是咱们本机呢直接向服务器来发送请求,服务器呢直接能看到呃咱们这个本机的 ip 地址的, 所以呢他想分进你呢是非常容易的。代理呢就是说咱们在做请求的时候呢,不直接向这个服务器来发送请求,而是向这个代理来发送这个请求,代理呢再把咱们这个请求呢转发过去。 这时候呢被爬取的这个服务器呢,他看到的这个 ip 地址呢是这个代理的 ip 地址,因为这个代理的 ip 地址呢他有很多,所以呢他很难对他做出限制, 所以呢咱们通过代理这种方式呢,绕过了他这种反伐机制,那咱们如果想要使用 ip 代理呢,那咱们通常呢会选择这个第三方服务商来帮我们完成这个工作。 那咱们今天在课程中呢,就以快代理为例啊,给大家演示一下如何实现这种 ip 代理。咱们这个呢就是快代理,他呢就是一个比较大的这种代理服务商啊,那这个快代理呢,他就说有很多种产品,那么我们给大家简单介绍一下这四种产品啊,那首先呢这种开放代理呢,它是最便宜的, 当然了他质量呢也是最低的,那他其实呢也是抓取了其他的一些第三方的开放代理,那咱们对这个代理质量要求不高情况下呢,咱们可以使用这个开放代理,那这个私密代理和这个隧道代理呢,是这个快代理他自己架设的这个服务器, 那它这个质量呢就相对于比较高一点,但是价格也会稍微高一点,那这个私密代理和这个隧道代理的区别是在哪里呢?私密代理呢,就是咱们每次请求这个代理的时候呢,咱们要手动的来切换 ip 地址, 那这个隧道代理呢,他是能帮我们自动的切换,那这个独享代理是什么意思呢?独享代理呢,就是说他这个 ip 地址呢,他是短时间内不会进行切换的,对吧?所以呢这种方式呢,一般呢是不适合我们做爬虫的。那咱们今天呢就以这个私密代理为例啊,给大家演示一下如何使用代理啊,那咱们点击一下这个了解详情, 我们看一下这是他的一些介绍,对吧?那这时候呢我们看到这个界面啊,那我点一下这个私密代理, 那我们发现这个私密代理下面呢有很多这种套餐,那这边呢有按天包天的来看,包天的最便宜呢,就是十块钱一天可以有一千个 ip, 一 千个 ip 呢,如果当天用不完,它就过期作废了。那我们今天呢给大家演示一下如何使用这个按 ip 付费,按 ip 付费的好处就是说呢,它这个 也是一千个 ip 地址,虽然贵一点呢,但是呢这个有效期呢会长一点,对吧?咱们刚开始学爬虫的时候呢,呃,一次拿几个练一练,一次拿几个练一练,呃,可能一时半会用不完它,所以呢咱们可以按这个先按 ip 来付费,先买点先试一试。那我点击一下立即选购, 那进入到这个界面了,是吧?那咱们这边选择 ip 付费,那这个 ip 的 有效时长呢?来看,就是说咱们这个 ip 地址的是个时长,那咱们选一到五分钟其实也就够用了。还有呢这个 ip 时长会长一点的,长一点呢,咱们根据需求来选择了这个购买数量,它最少是选择一千个。 然后呢授权白名单,那这个白名单的意思呢?就是几台机器可以同时使用,它至少是可以两个,多了呢,它可以增加,增加的话要加钱的。那我们看这个有效期呢是六十天,第一千个 ip 地址呢,咱们在六十天用完就可以了。 好,我们可以提交一下订单。好,这个套餐呢,实际上我已经提前购买了,直接打开看看,那我点击一下这个地方,然后点一下我的订单, 大家看这就是咱们这个订单,那这个 ip 代理如何使用呢?咱们看一下这个开发文档,点击一下文档中心,然后点击一下开发者指南,那总共是这几个步骤,首先呢咱们要生成一个 api 链接,生成这个链接呢,咱们通过对这个链接请求呢,就能获取到这个 ip 地址。 拿到 ip 地址呢,咱们放到咱们代码里面,放到这个,比如说 request 模块,放到 steam 里面,咱们就可以开始使用了,实际上这个过程呢还是比较简单的,那咱们先看看如何来生成这个 api 链接,那咱们点到这里面,然后点击管理,那这里面有一个叫生成 api 链接,这个地方咱们点一下。 好,这边呢咱们就选择一下咱们这个订单号,那这个提取数量呢?就是说咱们每次向这个链接请求,他给我们返回多少个 ip 地址,那这个呢,咱们可以根据实际情况来选择,那咱们刚开始学的时候呢,我们可以先写一个,呃,以免请求多了给它浪费掉了。那这边呢我们选择文本的格式, 都是按照它默认的格式来选择,那我们看一下这里面还有更多的选项,它这边呢可以选择这个地区,还可以筛选一下这个 ip 段,那咱们这边呢都使用它默认的就好了。 那咱们这时候呢可以生成一个链接,提取到的这个 ip 呢,应该就是这个样子,这种格式对吧?前面是 ip 地址,后面呢是端口号,你这边数字填写了几个呢?我们请求一次呢,它就生成几个, 这个呢就是咱们生成的这个 a p r 链接,这个链接大家看咱们请求它的这个有效时呢是六十分钟,那过了六十分钟呢,它就会失效了,你要重新再生成一个,觉得麻烦呢,咱们可以把它改一下,我们看一下在哪里改啊?那咱们在这里面申请觅食令牌,咱们点一下, 那这边来看令牌的有效期是六十分钟,可以在这里面修改,我们点一下,那实际上咱们在这边修改一下,比如说呢,我们在这里面给它修改成二百四十分钟半天是吧?二百四十分钟,然后保存一下, 那好,那咱们现在呢就获取到了 api 链接,咱们现在呢就可以请求这个 ip 地址了,那咱们点击一下这个开发者文档,那咱们现在呢找一下这个势力代码,我们点击一下开发者,我们看这边有代码样例,对吧?我们点一下, 那这里面呢就是它的代码样例了。这个是首先呢是 python 代码样例,那这面呢 request 模块如何使用的是这个代码, 对吧?大家看这个 a i o h t t p 如何使用的在这里,对吧?还有其他的这种。呃模块的使用的方式,我们看一下这里面还有这个 steam 如何使用的,都有的啊。好,那咱们先以 request 模块为例给大家演示一下, 那大家看这是代码,对吧?我们把它拷贝过来,然后打开我的拍叉,然后呢我把这个代码呢拷进去。首先大家看这边呢有一个叫 api 的 url, 对 吧?这个地方呢咱们就把这个里面内容呢改成咱们刚才的那个提取到的 api 链接,在这里面我们给它拷贝一下, 那咱们复制过来,现在呢它这个代码呢调用了 request 模块 get 方法,向这个 api 发送一次请求,那每发送一次请求呢,咱们就可以获得到一个 ip 代理了, 对不对?那下面使用这个 ip 代理呢有两种方式啊,一种呢就是使用这个用户密密码,一种呢是白名单的方式。 那用户密码是什么意思呢?就是它给我们提供的一个用户名和密码,咱们把这个地方呢给它替换掉。那后面使用的时候呢,咱们直接在这个 request 模块 parameter 参数里面添加进去,就可以直接使用了,那还有一种方式呢,使用这种白名单的方式,那咱们需要呢在快代理的后台呢给它设置一下, 那咱们这里面呢以这个呃使用用户名和密码的方式呢,给大家演示一下。来,我们看一下这个用户名和密码在什么地方来看我们刚才这个界面里面呢,实际上用户密码在这里把这个用户名拷贝过来, 密码呢给它拷贝过来, 这样子呢咱们就可以来使用这个代理了,他访问这个目标网站呢,实际上是快代理的一个测试网址,然后路由器模块向这个网址来发送个请求,这边呢就使用到了代理了,如果这个响应值呢是两百,那就打印一下这个响应值, 那这样子咱们在这里面呢再加一条,这里面咱们获取到了 ip, 那 我们就说,呃,获取来看,获取到 ip, 那就是 copy r p, 那 咱们增加一个地址,比如说咱们一个 u r 是 吧?等于这个 http ps, 增加一下百度这个地址,对吧?咱们给它访问两次,呃, response 一 吧,等于 request 点 get, 然后 u r 是 吧? troncy 等于 tronces, 咱们向百度来发送个请求,对吧?呃,我们同样 if 这个 response 一 get status code 也等于这个,呃,两百的话,咱们也同样来打印一下这个 response 一 点 text, 咱们运行一下,哎,大家看啊,首先呢咱们获取到这个 ip 地址, 对不对?这是咱们这个地方呃给它打印出来的,然后呢这个 success 这个地方打印出来的是什么呢?实际上呢是这个地方打印的,就是咱们访问快代理的这个测试地址, 对吧?那后面这个内容呢?大家看这内容呢是咱们访问百度打印出来的,这样子呢咱们就成功的提取到了这个 ip 地址了,那我们再看一下啊,这个白名单这个地方是如何来设置的?那我们看一下,那这边呢大家看有个叫做设置白名单, 对吧?我们点一下,然后呢我们这边呢只要把咱们这个 ip 地址呢给它添加进去,然后保存一下, 我们就可以使用了,然后呢咱们这边呢就不使用这块密码了,咱们就把白名单这块打开直接使用就可以了,咱们刚才讲的是 request 模块如何使用的,对吧?咱们再来看一下这个,呃 slim 模块如何使用的?来咱们点一下这个 python slim, chrome slim 模块呢,实际上它只要在这里面呢加一个这个参数,就把这个端口号放进去就可以用了,这就是这个内容啊,谢谢大家。大家好,我是讲师 perry, 这一个内容呢是反反爬使用 cookie。 咱们在获取网站内容的时候,有时候会发现啊,有些网站必须要登录之后才能获取它的内容, 那要模拟登录这个过程呢,其实呢是比较复杂的,有时候呢有这种滑块验证码,有时候呢有这种手机验证码,有时候呢还需要扫码登录,那咱们要如果配合手动来完成这个过程呢,实际上让整个这个爬虫这个效率呢就变低了, 那咱们可以使用这个 cookie 啊来绕过这个登录过程,那咱们可以首先呢获取这个登录后这个账号的这个 cookie, 登录后这个账号 cookie 咱们下载到本地,然后呢我们在使用的时候呢把这个 cookie 呢读取出来,然后加载到浏览器刷新一下,这样子呢就可以绕过这个登录过程 来,我们继续看一下如何操作。那这边呢我使用这种第八个模式呢,提前创建配置了一个浏览器端口号呢,我给他设置成了四个九, 那我们打开这个浏览器,这个浏览器呢它有什么特点?它能够保存咱们这个账号的这些信息,这个呢就跟咱们平时用的浏览器呢是一样的,那比如说我点一下豆瓣, 对吧?我在这点击用户密码登录,然后我输入用户名,输入密码,点击登录以后,这个 cookie 呢就保存在这个浏览器之中了,那他在比如说在三天或七天之内呢,你不用再次登录这豆瓣了,咱们直接的就可以访问就可以获取到内容了, 这时候呢咱们可以用 celine 浏览器呢接入到这个浏览器,然后呢直接获取它登录后的这些信息。 假设咱们要在另外一个浏览器打开并且登录账号,这时候怎么办呢?这时候呢咱们只要通过这个浏览器登录,然后获取到它这个 cookie, 把这个 cookie 呢保存在咱们这个本地,在另外个浏览器打开之前呢把 cookie 加载到另外一个浏览器,这样子呢咱们就可以使这个豆瓣呢在另外一个浏览器呢直接处于这种登录状态, 通过这种方式呢咱们就可以绕过这个登录过程,总的来说呢,咱们分为两步,首先呢获取到 cookie, 然后呢再使用 cookie, 大家看这边呢,呃,我写好了一个代码,那这个代码呢,就说跟之前的登录豆瓣的过程呢是一样的,首先呢咱们用这个第八个模式呢,通过这个端口接入到这个浏览器, 对吧?然后呢咱们创建一个路由器对象,然后切换一下 iframe, 这时候呢我们点击这个密码,然后呢再输入用户名,在这,然后输入密码,是吧?然后点击登录, 点击登录完成以后呢,咱们这边等待几秒钟以后呢,咱们获取一下这个页面的网页源代码, 那我为什么要获取它呢?我就是看一下登录以后呢我的这个名字,这种账户名 perry 这个名字呢是不是在页面之中,对吧?如果它在这个页面之中呢,表明我们就登录成功了,否则它就是没登录成功。那之后呢我们就可以通过这个 get cookies, 把这个豆瓣儿这个 cookie 啊全部拿下来,放到这个变量里面。我为了把它存到本地呢,我把这个列表给它变成一个字母串儿,放到这个变量里面,然后呢咱们就用 open 的 方法存到本地去。来,咱们先看一下这个过程。 哎,大家看我们拿到了这个 cookie 了,我们看一下这个 cookie 呢存到了这个位置,那大家看这个呢就是它的 cookie。 好, 那么我们获取到了 cookie 呢,咱们现在呢就可以使用这个 cookie 了,咱们这个网站呢现在已经处于登录状态了,我们如果呢还是使用这个浏览器来获取这个豆瓣儿里面的内容的话呢,咱们不需要再次登录了, 直到它过期为止,对吧?它这个 cookie 呢有效期呢是三到七天。那如果大家看咱们想在其他的浏览器登录豆瓣,那咱们把这个 cookie 给它,呃刷新到另外一个浏览器上就可以了,来我们看看怎么使用的。咱们首先呢设置浏览器的这些参数,对吧?然后呢打开浏览器, 这时候呢,咱们把刚才存的那个豆瓣儿那个 cookie 这次文件呢给它读进来,读到这个 cookies 里面,那这个 cookie 呢?它是呃很多组这个 cookie, 那 咱们用循环便利的方式给它一个一个拿出来。这边呢咱们把这个 cookie 域名呢给它做了一个简单的改写, 什么意思呢?就是说啊,它大部分的这个域名呢都是点儿豆瓣点儿 com, 那如果出现这种域名的时候呢,咱们这个 steam 浏览器呢,它会报错,它说这个域名不匹配,那咱们通过改写这种域名呢,这样子呢就可以把它所有域名呢重新加载进去了,加载进去呢,咱们用这个 brother and cookie, 那这个方法呢,一个一个给它循环的放进去了,放进去之后呢,咱们再把这个浏览器呢刷新一下,刷新一下呢,咱们再来取一下它的源代码,源代码里面如果包含了 perry 这个字样呢,说明咱们登录成功了。呃,运行一下, 哎,大家看,实际上呢,这边呢已经进入了咱们这个登录这个界面了,看已经成功登录了。 呃,咱们再来总结一下这个内容啊,咱们如果想要呃通过 cookie 登录账号呢,咱们首先呢要获取到这个 cookie, 对 吧?那咱们通过手动呢或者模拟登录的方式先登录这个账号,然后呢再获取这个 cookie 给它存到本地。 那咱们使用 cookie 的 时候呢,咱们首先呢打开这个要登录的域名,然后呢把这个预存的这个 cookie 呢给它读进去,然后刷新到这个浏览器之中,这时候呢这账号呢就处于登录状态了,通过这种方式呢,咱们就可以绕开这个登录这个复杂的步骤,这就是这个内容,谢谢大家。

大家好,我是拍摄老包啊,今天呢,呃,有五分钟的时间让大家了解一下啊,通过政治表达式来提取啊,这个信息是有多么的简单啊, 好,那我们今天要通过借助三个题目啊,借助三个题目来让大家了解一下这个政治表达式的使用方式啊,那首先第一个题目呢,是这样一串致富串,然后呢 题目的要求是用正则啊,提取所有单个大写的字母啊,加上一个数字的组合。好,那我们要使用正则表达式呢,首先要导入这个模块啊, import 二一啊, 好,那大家可以思考一下啊,怎么去提取这个大写的字母和一位数字的组合呢?我们看这个字母算,那么这个 a 一 是要提取出来的,那 b 二呢?应该要把它丢掉,然后 c 三要提取出来,然后这个 e 五, 好,那就说这这三个啊,这三个要把它提取出来,好,那我们呃,直接通过 r 一 点 find 二啊, find 二,然后写一个 p, 一个表达式啊,大写呢,我们可以这样啊,呃, a 到 c 啊,这个呢就是大写啊,大写的 a 到 c 啊,这个代表是大写 a, b, c, d, e, f, g 一 直到 c 啊,然后后面,呃,需要拼接一个数字啊,那就是杠 b, ok, 然后这一个就是啊,我们需要的正则表达式啊,然后呢,把匹配的 text 啊反过来,然后这个 find out 这个方法呢,会给我们啊,返回所有的匹配的结果,我们把它放在 items 这个变量里面, 接下来呢,我们把它打印出来啊, print items 好, 看看我们能不能把这个匹配的结果全部找出来啊, 好,看起来没有什么问题啊, a 一 c 三啊,一五都找出来了,但是啊,针对当前这个政策表达式其实还是有点问题的,假如我们这个一五后面呢,多一个数字啊,一五六。 好,那么在这种情况下,那么这个一五六正常情况下应该是要被抛弃掉的,对吧?也就说不应该出现这种一五了啊,那我们再执行一下, 哎,发现没有, a 一 出来了, c 三出来了啊,一五还存在,但是按照这个题目的规则的话,应该一五六是应该抛弃掉的,为什么呢?因为这个杠定呢,代表的是至少一个数字啊, 那如果有两个数字啊,他也会把它匹配进来,那我们怎么表示至少啊,最多最多就一个数字呢?哎,我们可以再加一个啊, 杠 s, 杠 s 代表的是空格啊,代表是空格,也就说,呃, a 一, 你看后面这个呢,就是直接就是空格了,对吧? c 三后面就直接是空格了,那一五后面呢是数字,而不是空格,所以呢,按照这样的规则,哎,就可以把它排除掉, 然后我们需要的是这个部分大写字母加一个数字啊,这个部分我们把它匹配出来, ok, 好, 经过调整之后我们再执行。 哎,这样的话就得到 a 一 和 c 三了,那么一五六就被我们抛弃掉了。好,那这个才是比较准确的答案啊。好,接下来呢,我们再看第二个,第二个呢,是这样的啊,嗯,这里有一串订单号啊,有一串订单号,然后呢, 提问要求是订单号以 o d 作为开头,后面呢固定是九位数字啊,要求提取所有合法的完整的订单号。好,这个订单号超过九位了啊,我们直接啊删掉啊,删掉一些直接把它 copy 下来。 好,接下来呢,我们还是通过二一点 find 二。 find 二什么呢?首先是 o d 作为开头啊, o d 作为开头,然后后面呢是九个数字,对吧?九个数字, 当然我们前面说过了,杠 d 啊,然后后面大括号九,哎,这个呢就代表九个数字,但是如果它出现了十个数字,哎,十个数字,那它还会被匹配出来啊,这样的话是不正确的啊,我们可以啊,直接 按照我们当前的理解啊,去运行一下啊,这个结果 好,把前面的注点啊,那我们直接执行 好,你看得到什么结果?得到了,把这个呃提取过来了,然后这个也提取过来了,但这个是正确的啊,这个后面的数字就是九个,一二三四五六七八九。 好,但是前面这个不一定不一样啊,前面这个呢有十一个数字,一二三四五六七八九十十一,对吧?但他也给我们提出来了啊, 也就是杠 d 啊,他只是杠 d。 然后这个花括号九,代表的是至少九个啊,数字啊,代表的是至少九个数字, 那如果后面又出现新的数字,哎,那我们就不应该把它匹配过来啊,那怎么办呢?我们可以这样啊,钢 d, 哎,后面不允许再出现数字了,这个大地啊,就代表非数字啊,然后呢,我们要要找哪一部分呢?要把前面这部分给找过来, 所以把前面这个括号括上啊,然后再运行,哎,这样的话就把这个部分啊准确给提取出来了,然后前面这个呢就被丢掉了啊,前面这部分,好,我们把这个数字改一下,改成一。 好,你看它提取到的是这个部分啊,前面这个部分就去掉了啊, 好,对吧?好,那还有个问题啊,假如我们前面加一个 a 过去 看一下,这种情况下是不是也会被匹配出来?但正常情况下,我们是 o d 作为开头, a o d 作为开头的话,那这个就是非法的订单号啊,正常来讲就不应该把它提取出来,对吧? 啊?我们再执行一下,它会不会提取出来,哎,它还是把它这个提取出来了啊。所以啊, 这个 o d 啊,作为开头,那我们这里还要加一层限制,就是前面不能出现别的字母啊,前面只能出现什么?只能出现啊?非字母的, 非字母的。好,非字母的字母,所以我们这里要加一个前项匹配啊, 问号,叹号,然后不能是字母啊,也就是 a、 d 和 c, 好, 然后呢?这个是加一个左肩括号, 好,我们再运行。哎,这个时候就没有匹配出来,就把这一个部分给丢掉了啊,那我们再加一个这样的订单号,合法的订单号,看它是不是能够正常提取出来啊?能够正常提取出来,说明这个表达式是对的啊, 好,你看它可以正常提出来,然后这个 a、 o、 d 开头的好,就被丢掉了,好啊,这个呢就是比较完整的啊,正确表达式了啊,好,最后一个, 最后一个呢,这个是把合法的这个邮箱给提取出来啊,合法的邮箱,那哪几个邮箱是合法的呢?首先第一个是合法的,对吧?第二个是合法的, 然后第三个不合法啊,第三个不合法啊,第四个也不合法啊,第四个也不合法。好, 那怎么叫合法呢?首先,呃,有个点 com, 对 吧?有个点 com, 然后前面呢是以数字字母或者下划线作为开头,好,这个呢,呃,是合法的,然后中间有个艾特符号,二一点放的号。 好,那么我们生成的表达式是什么?前面呢是小写的字母,大写的字母,还有数字,那么这个数字零到九,我们也可以通过杠 d 啊来表示啊, 这个杠 d 表示,这样的话更加简洁啊,让这个啊正在表达式,然后这个是小写大写数字, 然后至少有一个这样的一个字母,对吧?然后接下来呢是艾特符号,艾特符号呢,后面这个部分呢,那肯定也是啊,大写小写的字母以及数字。 好,然后呢至少有一个,对吧?接下来呢,这个点点的话,我们直接加了一个斜杠点啊,斜杠点代表什么意思呢?代表的是点号本身啊,点号本身, 因为在正则表达式里面啊,你纯粹一个点的话,它可以匹配啊,任意的字母啊,空格也可以,字母也可以啊,各种各种其他的乱七八糟的字母都可以。所以为了表示点号本身的话啊,那我们加一个斜杠, 代表点号本身,然后接下来后面这个 com 部分, com 部分,它也是一样的,就是字,大写字母,小写字母,还有数字啊,然后至少有一个字母, ok, 那 么这个表达式啊,基本上就是我们要的正的表达式,然后我们 啊翻到二方法,给我们返回所有的 p v 结果,然后呢,我们直接 print 一下啊, items 啊,看看能不能把所有的有效的啊,这个邮箱全部提取出来啊? 好,你看。呃,已经提取出来了啊,然后这个被丢掉了,然后这个也被丢掉了。好,我是喷射老包,如果大家对学习喷射感兴趣,欢迎点赞、收藏、关注。

挑战一周,带你学完 python, 跟这个学完,你会发现你真的很牛!警告,本系列最新 python 教程应该是目前全网最系统易懂的小白专用课了,一口气带你学完 python 所有核心内容,存下吧,最新版错过就刷不到了! 新的一年, python 到底要怎样学习才正确有效?首先是基础部分,需要学习 python 软件安装、变量运算符、循环字母串元组。 第二阶段是进阶篇,会详细讲解各种 python 进阶知识函数、面向对象、正则表达式等知识,用最易懂的方式带你熟练使用 python, 为后面的路打下牢固的基础。 第三阶段,技能训练会从 python 爬虫、数据分析、人工智能、办公自动化等领域展开,让你可以把所学的知识进行变现,流进你的口袋。为了让大家轻松学习 python, 我们这套课程呢,会从语法入门篇、语法进阶篇、全站实战篇等三大方面来讲解。语法入门篇里面包含了 python 与 patcharm 的 安装以及环境配置学习变量运算符、数据类型、控制、结构函数等。语法编程 语法进阶篇里面呢,我会详细讲解每一个进阶知识,从面向对象编程、异常处理、正则表达式等知识。全站实战篇会手把手教大家练习项目,比如爬取图片、视频办公自动化、 数据分析、机器学习等。最后呢,会给大家一个小福利,有搭建开发环境资料包、 python 从零到一的学习计划表、 几十上百季素材、书籍、课间等等,只要你能想到的素材我这里几乎都有,评论留言六六六 即可全部免费打包带走!相信我,这套拍粉系统课程将会是全网最齐全最易懂的小白专用课,如果看到这对你有所帮助的话,请给老师一个免费的一键三连吧,让更多想要学习拍粉的小伙伴看到这个视频,下一站上岸。 大家好,我是讲师 perry, 这节课是动态网页爬虫 sim 处理图片验证码,咱们的案例呢是模拟登录超级音, 来咱们看一下这节课的一个任务,咱们这几个任务呢就是模拟登录这个超级音账号,然后呢在这里面呢要输入这个验证码,然后点击登录, 那我们看一下这种图片验证码咱们如何处理啊?这个验证码里面呢是有一些这个数字和英文,是吧?那这里面呢就涉及到一个文字识别这个技术, 那这种技术呢实际上呢可以用这种 ocr 来完成,但是呢咱们初学拍摄的小伙伴呢,我们推荐大家啊用这种专业打码平台, 就是这个专业验证码的这个识别平台,咱们把这些图片呢发送给这个平台,让他们把我们识别,咱们把拿到的这个结果呢在这里面直接输入,这样子呢就可以登录了。 好,我们看一下这个超基因平台如何使用的,那咱们使用之前呢,首先要给他注册一个账号,对吧?来看我们在这里面点击一下注册,在这里面呢输入相应的用户名和密码, 注册完了以后呢大家看咱们到这个界面呢就可以登录了,来我们看一下这个超级音呢是如何使用的,那我们来点一下这个开发文档,点开开发文档以后呢,这里面有一个 python 语言 demo 下载,咱们点击一下, 那这里面呢有个点击这里下载来,咱们再点一下再看,这时候呢就下载到了一个数据包,是吧?来咱把这数据包解压缩一下, 咱把这个文件呢拷到咱们项目文件夹里面,好,那咱们在里面呢就可以打开这个文件了,我们看见这有个超级音 点 py 的 文件,那这个文件呢来看就是超级英自带的一个文件,咱们通过这个文件呢就可以啊,获取到咱们最后识别后的这个验证码, 我们看一下这个文件如何使用啊?那咱把它拉到下面,我们看一下它这里面给我们一个代码啊,就是说我们调用超级英点可拉 in 这个函数,在这里面输入用户名,输入密码,然后输入这个软件的这个编号来,我们看一下软件 id 是 什么, 再看我们打开了这个超级音的后台以后呢,我们点一下这个软件 id, 那 这个写的软件 id 后面这个数字呢就是咱们需要的这个软件 id, 然后呢咱们就可以把这个软件 id 呢给他放进去,那这时候呢,呃,从本地读一张图片,那再看这个图片是一个 a 点 jpg, 实际上在这个位置,我们看一下,那实际上这就是一个呃验证码的图片,对吧?七二六幺, 把这个图片它读进来以后呢,然后交到这个超级音点 post pick 这个函数来处理一下来看就是这个函数, 对吧?那它实际上呢就是把我们这张图片呢用 post 方法传递到超级音的服务器,那超级音呢会给我们返回一个 gs 文件,这个 gs 文件里面就有它识别后的这个验证码 来看它现在这个代码呢,咱们给它改造一下,我们把这个用户名和密码呢,给它放到一个 json 文件里面,让它直接调用这个 json 文件。那咱们首先呢在这边来建一个 json 文件,那咱们给它起个名字呢?叫 password, 点 json。 大家咱们呢可以把用户名密码呢写到这里面,是按照 json 格式写的,那这里面呢我就先不写用户密码了,那咱们就创建了一个这个文件, 然后咱们再回到超级音区,那咱们先就是说用 with open 函数呢,把这个文件呢给它读出来,对吧?把这个用户名密码给它先读出来,好,那咱们就用 with open 打开, 那咱们把它读一下它是这个 password, 点 json 这个文件,对吧?那咱们用 read 这个方式,然后呢编码方式呢? including 是 吧?等于 utf 杠八。 好,现在呢我们把它读一下啊,那读到的这个内容呢?咱们放到 info 里面,那咱们先调用 json 点 load 这个方法是吧?把它读到的文件呢转换成 json 文件, 那咱们 f 点 read, 那 咱们看一下这个 password, 咱们写一下 password, 实际上就等于这个 info 里面的,再看这个 password 是 吧?下面咱们写一下 user name, user name, user name 等于 info user name 是 吧?还有一个呃软件 id, 那 就是 soft id 是 吧?等于 info soft id 是 吧?然后呢咱们把读出来的这个名字呢给它替换掉,对吧?那咱们把它替换成这个用户名呢?就是这个 username, 对 吧? username, 然后呢密码呢?咱们换成 password, 然后呢 soft id 呢?咱们给它换一下,呃 soft id, 对 吧?那咱们在本地读入一张图片,然后呢交给这个超级音处理, 那交给超级音处理呢,咱们把它处理的这个后面的内容呢?我们给它写成 code, 是 吧?等于。 好,那我们再看一下这个超级音的这个 post picture, 它这两个变量是什么?那这个 im 呢?实际上就是咱们读取到的这个图片,这个一九零二呢,它就是识别这个图片的方式, 来,我们看一下他的图片识别的方式,打开那一九二零再看,实际上就常见的。呃,英文跟数字这栏里面呢,这个数字呢都代表对英文数字的识别,那他还可以支持这种中文汉字的识别,那还有纯英文的识别, 纯数字的识别,还有这种任意字幅的,是吧?还有这种点选这种坐标的,那他支持的格式呢?还是挺多的。 咱们这种英文数字呢,咱们就选择这个一九二零,因为它有四到六倍数字,咱们自己用的时候呢,可以根据这个列表里面选择一个合适的这个验证码类型就可以了。好,我把我这个呃 password 填进去,然后咱们来运行一下看看啊,好,我们来打印一下 code。 好, 我们来运行一下, 来看我们得到,这是我们得到这个结果。咱们识别到的验证码呢,实际上是在这个 picture str 里面,它这边识别出来是七二六幺,来,我们看一下,这边是七二六幺是正确的。 那咱们这边再加一下啊,咱们就给它从这个字典里面把这个验证码给它直接提出来就可以了,是吧?那咱们加一下, 这样子呢,咱们就可以完成提取验证码,那咱们看看咱们今天的任务来如何完成啊?那再看,咱们今天呢就是模拟要登录这个账号, 对不对?那么我们来看看啊,这边呢,咱们就用 steam 来完成这个任务,那咱们先导入相关的模块。好,这是我们常用的一些模块,我们一次性给它导入。那我下面呢,建立一个 service 对 象,来指定一下这个驱动的位置。 好,下面呢,我写一个登录函数来完成这次模拟登录的过程,那我给它起个名字叫 log in 吧, 那下面呢,我写个接口来调用它 log in。 好, 那咱们首先呢要把这个链接给它传进来,是吧? u r 等于是吧?咱把这个 u r 传进来, 然后放到这个地方。好,那咱们下面一步呢,咱们先呃实力划一个浏览器对象,对吧?来 browser 等于这个 webdriver 点 chrome 是 吧?咱们 service 等于 service。 好, 我们现在 brother 点 get, 把这个 u r 放进去,来运行一下。 好,打开超级音了。咱们首先呢要在这输入用户账号,再输入密码,按下 f 十二键,来,咱们定位一下这个用户账号这个元素,然后点击一下这个箭头,点击一下这个位置,是吧?那我们 copy, copy 叉 pass, 输入用户密码,对吧?那 brother 点 find element by, 点叉 pass, 咱们要找到那个用户名的那个元素,对吧?在这儿。 好,那咱们要往里面要输入一下这个密码,对不对? send keys 这密码呢?咱们读取一下这个 jason 文件,然后给它传过来。 好,我们跟之前一样把这部分代码考过来 往这里,是吧?然后呢,他这个文件呢,实际上是在这个这个位置,咱们给他把这个路径给他改一下,他在这个超级音 杠 python 下面是吧?好,读进来呢,咱们这边呢,就给它传到这个啊,函数里面 password, username, 然后 soft id, 对 吧?咱把这三个数字,三个变量呢给它传进去,传到这里面 是吧?那咱们这边 send keys 呢,咱们首先要输入一下用户名 username, 好, 那咱们下一步呢,咱们就要输输入这个密码了,是吧?好,我们来 brother 点 find element by, 点叉 pass, 来,咱们找一下这个密码的元素的位置, 那大家看它实际上呢,我们点一下这个箭头,看看密码是吧?来,咱们 copy 啊, copy 叉 pass 放在这里。好,我们这边呢 send keys, 然后输一下 password, 我 们来运行一下,看看结果。 哎,大家看它输入了用户名和密码是吧?但是我们发现这个速度呢,有点太快了,咱们要给它做个延时,来输个延时啊, time sleep, 比如说我们休息个一秒,是吧?那输入密码之前呢,咱们也给它 time sleep, 给他休息一秒,好,再看。现在呢,我们要把这个验证码呢给他拿到,拿到了,然后发送给超级音。那我们点一下这个,点一下这个图片的这个元素是吧? 那咱们 copy copy 叉 pass。 好, 那咱们这会叫做获取验证码的图片,对吧?那这个图片呢,咱们给它起名叫 img, 是吧?然后呢还是用 brother 点 file element by, 点叉 pass, 这个呢是图片的这个路径是吧?那咱们要给它取这个图片呢,咱们调用里面方法叫 screenshot s p n g, 实际上呢就是给它做一个截图, 然后呢拿到这个验证码,这个图片呢,咱们现在呢就要发送给超级英了,那超级英这个模块呢,咱们事先要给它调用一下,对吧?超级英 import, 超级英 client, 好, 那咱们现在呢继续写,我们先调用一下超级英 client, 是 吧?超级英 client, 咱们要输入一下用户名,对吧?这个 username 给它传进去,然后呢 password 传进去,然后呢这个 soft id 传进去,那我们给它实力召唤一个对象的话呢,给它起个名字啊,叫超级音,是吧? 下面呢咱们调用超级音的那个获取验证码的那个方法,咱们把那个获取到的验证码放在这扣的这边面, code 等于这个超级音,再看咱们调用这个 post picture, 是 吧?那咱们需要把这个图片传进去,那然后呢把这个验证码的类型传进去,验证码的类型呢是一九零二,对吧?咱们还要给它从这个 js 文件里面把这个验证码呢给它取出来 来看,刚才呢,咱们是取的这个 picture str 这个地方,是吧? 那我们给它放进去。好,那这回拿到了这个验证码呢,咱们怎么处理呢?拿到验证码以后呢,咱们,呃输入到这里面,好,我们看看这个位置啊,点一下输入验证码, 那我们这步呢就是输入验证码,对吧?那我们来看看啊, brother, 点 find element, 点叉 pass, 是吧?输入呢?然后咱们还是用调用这个 send keys 这个方法,把这个 code 放进去,对吧?那咱们这边呢加一个实验 time, 加 sleep, 加个一秒钟, 那咱们下面呢是不是要点击一下登录了,是吧?点击登录,咱们同样做一个实验, time 点 sleep 一 秒,来,我们看下登录这个按钮啊,点一下登录,把这个按钮的位置取一下, copy, copy, 叉 pass, rather, 点 find element 吧,点叉 pass, 那 咱们来最后点击一下 click, 那 咱们现在写完了,咱们运行一下, 哎,输入用户密码,输入密码,输入验证码,登录,哎,来看我们登录成功了, 呃,咱们再来回顾一下这节课的这个内容啊,那咱们登录呢,实际上呢分为这五个步骤,输入用户名和密码,截取图片的验证码。 那最关键呢,咱们实际上呢就是把这个验证码呢要发在打码平台去做一个识别,识别以后呢,咱们把这个拿到的这个验证码呢输入进去,然后点击登录,好,这就这个内容,谢谢大家。

挑战一周,带你学完 python, 跟这个学完,你会发现你真的很牛!警告,本系列最新 python 教程应该是目前全网最系统易懂的小白专用课了,一口气带你学完 python 所有核心内容,存下吧,最新版错过就刷不到了! 新的一年, python 到底要怎样学习才正确有效?首先是基础部分,需要学习 python 软件安装、变量运算符、循环字母串元组。 第二阶段是进阶篇,会详细讲解各种 python 进阶知识函数、面向对象、正则表达式等知识,用最易懂的方式带你熟练使用 python, 为后面的路打下牢固的基础。 第三阶段,技能训练会从 python 爬虫、数据分析、人工智能、办公自动化等领域展开,让你可以把所学的知识进行变现,流进你的口袋。为了让大家轻松学习 python, 我们这套课程呢,会从语法入门篇、语法进阶篇、全站实战篇等三大方面来讲解。语法入门篇里面包含了 python 与 patcharm 的 安装以及环境配置学习变量运算符、数据类型、控制、结构函数等。语法编程 语法进阶篇里面呢,我会详细讲解每一个进阶知识,从面向对象编程、异常处理、正则表达式等知识。全站实战篇会手把手教大家练习项目,比如爬取图片、视频办公自动化、 数据分析、机器学习等。最后呢,会给大家一个小福利,有搭建开发环境资料包、 python 从零到一的学习计划表、 几十上百季素材、书籍、课件等等,只要你能想到的素材我这里几乎都有,评论留言六六六 即可全部免费打包带走!相信我,这套拍粉系统课程将会是全网最齐全最易懂的小白专用课,如果看到这对你有所帮助的话,请给老师一个免费的一键三连吧,让更多想要学习拍粉的小伙伴看到这个视频。下一站上岸。 大家好,这节课主要内容呢是动态网页爬虫 ccm 切换窗口。我们先看一下这节课的一个小任务啊,这个呢是天涯论坛,那咱们今天任务呢,就是打开这一个一个帖子啊, 然后呢把这里面的帖子给它存成文件,就是把这里面每个帖子给它打开了,然后呢给它存成文件。 来,我们看一下这个任务啊如何完成,我现在呢就说打开了 part time, 我 把打开页面这本代码呢已经写好了,这份代码呢跟之前的是一样的,来,我们先运行一下,看一下, 来看打开了这个页面是不是,那这时候呢,如果我们要把它这个帖子一个一个点一遍,咱们是不是先要定位到这个链接呢?那我们按下 f 十二键啊,然后呢把这个箭头点一下,然后定位到这个位置, 那这个位置大家看实际上对应的就是一个呃 a 标签,对吧?我们把它这个叉 pass 路径取一下, copy, 然后 copy 叉 pass 来,我们取一下,然后呢我们把这个路径啊给它放到这里,然后呢我们再取另外一个标签的路径,我们再看一下, 好,我们点右键 copy, copy 叉 pass, 好,我们把这个路径也拷贝一下,大家发现没有,其实变化的就是这个 t r 标签的后面的这个数字,所以呢如果我们想取到里面所有的论坛的帖子,所以我们只要把这个数字去掉,这样子呢就能定位到多个元素了, 那我们现在来定位一下,那给它起个名字啊,叫 next 配置。然后呢我现在呃用这个 browser 这个对象里面调用里面的这个 find elements 这个方法,对吧?因为大家看我们要提取多个呃标签,所以咱们用 find elements, 那我们这边呢要用这个叉 pass 这个路径来定位,那我们导入这个 by 这个模块, from slim web driver common 点 by import by。 来我们这边使用一下 by by 点叉 pass, 然后 copy, 那 把这个 t r 标签后面这个六这个数字啊给它取掉, 那我们现在呢就拿到了一系列的这个标签,那么我们要给它做点击呢,咱们只有 for 循环进去,一个一个给它实现点击 for next in next 配置,然后 next 点 click, 这样子呢我们就应该能打开这个标签,但是大家注意一下,那有可能这个标签会查找不到,那咱们这时候呢要加一下等待,比如说我们加一下咱们之前课程学的这个显示等待,那就是判断一下这个元素是否出现,如果出现了我们才进行下一步来查找这个元素。 来我们导入相关的模块, from sleep webdriver 点这个 support。 第二 u i webdriver wait, 这个是等待什么块儿?咱们还要导入一个 c l m webdriver 呃 support, 然后 import expected conditions expected condition 呢,就是判断条件啊,我们给它起个别名 as e c。 好,我们来判断一下啊,我们现在把这个标签啊给它专门拿出来啊,然后呢我给它起个名字叫 locator, 我 们专门来定位它啊, locator 等于啊,我们这里面写成圆组的形式,还是 by 点叉 plus, 对 吧?把它写的单独写出来,然后呢,这时候我们用 wit webdriver wit, 然后 brother 指定一下这个浏览器,然后呢,我们最大等待时间呢,是五秒钟,对吧?点儿 until 就是 这回我们要判断条件了啊, prince of element located, 就是 这是一个元素,我们现在呢,因为定位了很多个元素啊,咱们应该找一个复数形式的 prince of all elements located, 哪个元素出现呢?就是这个 locator, 他如果出现了,我们才进行下一步啊,这个等待的时间是五秒钟,如果不出现呢,咱们就报错 这个天涯这个论坛呢,加载速度有点慢,咱们呢也给他指定一下这个加载策略,是吧?我们只要用这个一格模式呢,他就加载的会比较快一点, 那我们把这个参数给它拷贝过来啊,就是 o p d page load strady, 呃,一格模式啊,默认是 normal 模式,它有点慢啊,咱们就改成一格模式。那我们在打开页面之后呢,我们通常还要做个动作,就是给它做一个延时,就是 time 点 sleep, 比如说等个,呃,三秒钟, 加这个等待的目的是什么呢?就是说我们在操作下一步的时候,不希望他整个操作速太快,如果你这个操作太快啊,就超出咱们人类常规的这种操作,对方的服务器呢,很可能会把我们检测到是一个爬虫, 就会拒绝给我们这个内容。所以呢,咱们这边加一个等待啊, time 点 sleep, 我 们现在呢,呃,再加一个 break, 让它点击一次就停下来,因为我们先观察一个页面,然后呢再观察多个页面,那我们再来运行一下, 打开页面, 哎,大家看它打开了这个这个标签了,是不是 来看一下这个标签呢?实际上在我们讲课期间呢,他已经刷新了,好,我们现在拿到了这个这个页面,那这时候呢,我想把这个呃页面里面的内容啊 给它拿下来,我们看一下这个内容。怎么拿下呢?我们按下 f 十二。首先呢我们取一下这个标签,就取下这个标题啊,点一下这个是吧?然后呢我们 copy, copy 叉 pass, 取一下它里面的文本部分内容来,我们在这个点击之后呢来取一下,就是说在取内容之前呢,咱们还是给它加一个食盐,不要太急啊,他们等个呃三秒钟,然后我们这会取这个 fire name, 是吧?等于这个 browser 点 find element, 这会找一个元素 by 叉 pass, 然后呢把这个刚才要拷贝这个路径啊取一下,然后呢,我是想拿一下它下面的文本部分内容,就是 text, 那我们看一下下面要取什么内容,下面我们想取一下文字部分内容,是吧?来,我点一下这个箭头,定位一下这个文字部分内容,哦,它原来在这里,是吧?那它下面的文本内容,那我点右键 copy, copy 叉 pass, 好, 这边呢,我给它起个名字叫 content, 等于 rather find element by 点叉 pass, 那给它拷贝一下,那还是要取一下文本的内容,那这时候呢,即使等待了三秒钟啊,咱们还是要判断一下这个元素在不在,那么呢,我现在把这个标签的这个路径啊,给它拷贝一下 来,我们再来设置一个等待啊,起个名字啊,叫 low key 一 是吧?刚才是 low key, 然后呢就等于这个括号来等于括号,然后拷贝进去, 是吧?我们这回呢还是用 webdriver, 嗯, brother 然后等待个五秒钟,最大等待五秒钟是吧? until e c 是 吧?这个这回是这个元素是不是存在是吧?那这个元素呢?是 locator 一,好,那么我们就把这两个元素呢打印一下 fire name, 然后 content 打印完呢,我们把这个浏览器呢 rather 来关闭掉。好,我们看看这个内容能不拿到来运行一下, 打开页面,点击获取内容。 哎,大家看,现在没有拿到这个内容啊,这是为什么呢?它已经超时了, 实际上这时候呢,我们就要给大家引入一个概念了,叫焦点,或者我们叫聚丙,什么意思呢?我们看一下,就是我们最开始啊,打开,打开这个页面,那这个浏览器呢,就默认呢是能操作这个浏览器里面的内容, 虽然我们点击这个链接打开了这个页面以后呢,这个页面已经显示出来了,但是呢浏览器呢,就说他指向的还是这个地方,我们管他这个叫焦点啊,就说焦点还指向这个位置,那这时候怎么办呢?咱们就要做一个切换啊, 那切换的什么东西呢?就是窗口的锯柄,这个锯柄呢就指向每个窗口的这里面的内容的。那我们看一下怎么来切换到新打开的这一个页啊? 那我们在打开完以后呢,我们等待几秒钟,我们就要开始切换了,那 brother, 大家看,我们用 switch to 这个方法来切换到一个新的窗口,那这个窗口是哪个窗口呢? brother, 大家看,这里面有个叫 window handles, 这个 window handles 呢,就是里面呢有很多窗口绘本,那就说我们这个窗口的这个绘本呢,是按照时间顺序排列的,就是第一个打开窗口的绘本呢,是第零个,第二打开的,那就是第一个,第三个打开呢就第二个,我们说的是列表的形式。 好,那么我们刚才打开的窗口是不是最后一个?所以呢,我填一个负一啊,就表示切换到我最新打开的这个窗口,我们再来运行一次看看, 打开,对,然后点击,哎,它就切换回来了,是吧?来我们看一下,这时候我们是不是拿到了这个里面的帖子里面内容了, 那我们把这个帖子内容啊,我们给它存盘存一下用 with open, 呃,我给它指定个位置啊,我想存到这个文件夹里面,对吧?来把这个位置拷贝一下, copy, 然后呢放到 这里面,我们这个文件名字呢?是什么呢?就是这个我们刚才起的名字叫 fire name, 点 t x t, 对 吧?然后呢给它存盘啊, w 的 方式写入 as f f right fire name, 嗯,然后呢给它空两行,空一行,然后我们再 alt right 写下 content, 对 吧?这个然后呢我们杠 n, 杠 n, 对 吧?咱们打印一个提示,就是说,嗯,你下载,嗯,没问我章节是吧?这个章节的名字呢叫 fire name, 好,那这样子大家看啊,就是说我们下载完这个章节,我们再回去的时候要取一下这个 next 这个元素,那要点击它之前呢,咱们这个锯柄呢,还要给它再切回去,我们把这个 break 呃,给它去掉, 我们看一下啊,就是说如果呢不加这个锯柄切换,它会发生什么情况?再来运行一下,打开页面 切换关闭。哎,这时候报错了,我们看一下啊,那这回报错了,他说这个 no such window, 我 们在做点击的时候,那个这个 window 的 这个锯柄没有切换过来,所以呢,我们在这个窗口关闭之后啊,再把这个锯柄再给它切过去啊 brother 点呃 switch to window, 然后呢? brother 这个 window handles 这个剧本呢,就第零个,就是我们最开始开的那个,是吧?这样子呢,我们就可以切换回去了,来运行一下, 打开,应该点击一个,对吧?然后关闭,再点击一个帖子再关闭,对吧?再点击,再关闭,再点击,再关闭。 好,我们先停一下,把它先暂停掉啊,这就是我们刚才下载到的这些帖子啊,随便打开看一下,里面都是有内容的。 来看啊,我们刚才呢就说是通过这种 click, 就是 点击页面上的元素打开了一个新的窗口,是不是?那么咱们其实呢还有其他方法可以打开一个新的窗口啊? brother 看 switch to, 这回点个 new window, 那我们把里面写一个叫 type, 它就多开一个标签啊,那这时候我们就可以 brother window, 这时候我们得点 get, 比如说 h t t p s 然后接地点 com, 那 用这个 new window 打开这个一个新的标签之后呢,它这个焦点啊,自动会切换过来,不需要我们在这个切换了。这个点击这个 click 这个方法点击过来的啊,它必须让我们手动的来切换这个焦点, 用这个 new window 这个方式呢,实际上呢就不用切换焦点了,它自然就可以拿到这个焦点。这时候呢,我们可以打印一下它这个源代码,比如说我们配置 text 等于 browser 点 page source, 是 吧?这回呢,我们给它延迟一下,要太快的话有可能拿不到东西啊,要延迟个两秒,三秒。好,我们这时候来 print 一下 page, 那 我们让它继续来运行一下,好, 打开。那这回打开京东是不是?好? 哎,大家看,这回呢就报错了,那我们首先啊,看一下京东这个页面是打开了, 对吧?但是呢,我们往下执行的时候呢,它报错了,它告诉我们什么呢?就是说我们看下面报错的,就是找不到这个元素, 对不对? time app 就 超时了,就是因为是由这个 webdriver wait 这个模块引起的。那是因为什么呢?那是因为我们这个焦点切换到这个京东这页面啊,它没有再切换回来, 所以呢,咱们给它再切换回来,就可以继续运行了。来,我们 brother switch to window, 对 吧? brother window handles。 那 这时候呢?第呃 window handle 呢?就是零,就是咱们最开始打开这个键面,对吧?这样切换以后呢,它就能继续运行了。来,我们再次运行一下, 打开吧,打开京东啊,给它关闭掉,对吧?然后这时候就打开了其他的页面了,对吧? 好,我们把它暂停掉啊,我们来回顾一下这节课的主要内容啊,我们讲了浏览器的切换啊,就是当我们点击页面上的一个按钮或者一个链接的时候啊,它一般会弹出一个新的标签页, 我们可以看到这个标签页啊,但是呢我们无法定位这个页面上的元素,这是因为啊,当前的焦点不在这个新的窗口上,而是在之前的上获得这个焦点呢,咱们首先呢就要获取这个窗口的这个锯柄, 那我们就是要通过这个命令啊, driver window handles 来切换到这个最新打开的这个窗口上。负一呢,一般就是这个 window handles 最后的元素就相当于啊最新打开这个窗口,当我们切换到这个窗口上之后呢,我们就能操作这个窗口里面的元素了。 那在我们把这个窗口关闭之后,我们还想操作之前的那个窗口呢,咱们要再把这个命令执行一下,把这个数字改成零零呢,就是我们刚才最开始打开的这个窗口, 我们看一下如何来打开一个新的窗口啊?之前呢我们是点击这个按钮打开一个新的窗口,咱们这个实际上呢还有一种方法,就是 driver switch to new window, 对 吧?把这个命令执行以后,我们再用这个 driver 点 get 这方法来打开一个新的窗口。这个方法的特点呢就是打开了新的窗口以后呢,它这个焦点呢自动就跑到这个新的窗口上了, 那这时候如果咱们不操作这个新的窗口,还想操作原来的窗口呢,咱们必须啊把这个焦点呢再给它切换回去,就是用这个 window handles 啊,给它切换到零,就是之前的这个页面上面, 咱们还可以用这个 switch to new window 啊,这个括号里面跟一个 window 可以 打开一个新的窗口,其实打开一个新的窗口啊,跟打开一个新的页面这个原理啊是差不多的, 这就是这节课内容啊,谢谢大家。大家好,我是讲师 perry, 这节课呢给大家介绍一下动态网页爬虫 clement 切换表单 frame。 来我们看一下这节课的任务, 那这个呢是豆瓣网,那咱们今天的任务呢,就是模拟登录豆瓣网,那首先我们看看这边是他的登录的这个界面,那我们首先呢要点击一下这个密码登录,那咱们是希望用用户名和密码来登录,之后呢,我们比如说输入一串数字幺三五, 比如说我们是五五五五,是吧?然后我们再输个密码,对吧?然后模拟登录,这时候呢他跳出验证码了,那咱们今天呢?呃,先不做这个验证码的破解,我们今天呢主要模拟前半部分,模拟输入用户名和输入密码,然后点击这个按钮, 那我们看一下在这个过程中啊会遇到什么问题。前半部分这个代码呢已经写好了,就是打开一个页面来,我们先运行一下 来看,现在打开了豆瓣网,是吧?那么我们先要点击这个密码登录这个按钮 是吧?那我们先要确定它这个元素所在的位置,来,我们按一下 f 十二,然后呢用箭头点一下这个密码登录这个位置,这时候我们看到了这是这个密码登录所在的这个位置,是吧?那现在呢,我们来 copy 一下它的叉 pass 路径, copy, copy 叉 pass。 好, 然后呢我们在这个代码里面来定位它一下啊,今天我们在这个页面里面呢,使用这个隐式等待啊, brother implicit wait 等于个四秒钟, 好,那现在呢,我们来开始定位这个元素啊, browser, 然后 find element, 对 吧?我们使用这个 by 叉 pass 来查找这个按钮,这个路径呢,我刚已经拷贝过来了,就是这个里,然后呢我们找到了它呢,我们就点击一下, 好,那么我们通常啊打开页面呢,我们呢就说要给他等待一下,这个等待呢,我们主要是,呃防止这个登录速度过快啊,被这个服务器检测到会被反爬。我们现在呢再来运行一下,看看他能不能点击到这个按钮 打开页面。哎,开始我们等待一会啊, 哎,大家看,我们看到好像这边是报错了,是不是?那我们看一下它这边是出现了什么问题啊?它写的是 no such element, 就是 定位不到这个元素啊,哎,为什么会这样子呢?咱们明明已经写了这个地址啊,也加了这个影视等待,对不对?也加了一个强制等待,那么为什么还是没有定位到这个元素呢?那我们这时候打开页面啊,我们来看一下这个元素所在的位置啊,密码登录大家看是吧? 那我们看到这写了一个 iframe, iframe 它实际上是一个内嵌表单,那咱们就说碰到这种内嵌表单的这种里面的这种元素啊,我们 clym 如果直接去定位它呢是拿不到的。咱们 clym 如果想拿到这里面的这些元素啊,咱们首先要切换到这个表单, 然后呢再定位它下面的这些元素,来,我们看一下如何来切换到这个表单啊,如果想要切换到这个表单呢,咱们首先呀要搜索到 i frame 这个位置,对吧?来,我点击右键 copy, copy 叉 pass, 来,我们给它定位一下, 那就说我在搜索下面的元素之前,我们先把这个表单啊,先给它定位,我给它起个名字啊,叫 i, 呃, frame 等于 我们还是 browser find element by 点叉 pass, 然后呢把这个位置写下来,对吧?现在呢我们就要做一个切换动作了, browser 来看 switch to switch to, 我 们之前给大家介绍过啊,切换到一个窗口,是吧?那这回呢,咱们要切换到这个 frame, 就是 这个表单啊,那这个表单呢,我们把这个元素填写一下,就是刚才我们写的这个 i frame 填写进去。 好,填写进去之后呢,我们现在呢看看能不能给它定位到来,我们再次运行一下来看,打开了这个窗口, 哎,大家看它现在点击到了密码登录了,对不对?好,那下面呢,我们就要往这个窗口里面填写这个用户名和密码了,对不对?那我们现在实际上直接可以定位这个用户名和密码了, 来,我们点一下这个 f 十二点箭头指向这个位置,那这个呢就是填写用户名的位置,来 copy, copy 叉 pass, 来,我们在这来来写一下,就说我们在填写之前呢,咱们通常还是给它等待个,比如说,呃,三秒钟啊,我们再来填写,整个速度不要太快啊。 brother, 我 们还是 find element 半点叉 pass, 那 我把这个刚才叉 pass 定位这个路径啊拷贝过来,那这时候呢,我们要填写一个用户名,是吧?那这里面呢,我们用 sendkeys 这个方法,那这个用户名呢?我就随便填写一个,比如说幺三五,来八八八 八八八,是吧?我们填写一个,随便填一个号码,然后呢我们现在下面呢,我们就要开始填写这个用户密密码了,是吧?来,我们再等个三秒,来,我们找一下这个 密码的这个路径啊,咱们找一下这个密码,密码呢,然后我们点一下这个箭头,点一下密码所在的位置,对吧?然后我们 copy, copy 叉 pass。 好,我们现在呢把这个密码呢所在的这个叉 plus 路径啊拷贝过来,那我同样呢也可以发送一下这个密码,对吧?还是用 sendkeys 这个方法,那我就胡乱写一下这个密码, 写完了之后呢,我们再等待个三秒钟,下面我们干什么啊?我们就是要点击一下登录这个按钮,对吧?我们看一下登录这个按钮所在的这个元素位置啊,点一下这个箭头,来指定一下这个元素,那我们后面 copy, copy 叉 pass。 好, 来,我们来 browser find element by, 点叉 pass, 然后把这个按钮这个所在的路径啊拷贝过来,然后呢我们再来点击一下, 好,我们打开这个页面之后呢停留三秒钟呢,然后呢把这浏览器给它关闭掉。好,我们这次再来运行一下, 打开页面,哎,点击密码登录,输入手机号码,输入密码, 点击登录,哎,这时候跳出了这个呃,验证码的这个界面,是吧?那验证码呢?我们在下节课给大家介绍, 大家看啊,现在呢,我们实际上呢切换到了这个表单里面了,对吧?那如果我们还想获取表单外面这些元素怎么办呢?我们看一下,我们只要再把它切换出去就可以了。 browser switch to default content, 大家看,通过这个 browser switch to default content, 咱们就能切换到最开始的那个界面了。 我们再来回顾一下这节课内容啊,这个表单切换啊,就说很多页面呢,它会带一些 frame, 还有 iframe 这种表单嵌套啊,咱 们 clym 浏览器呢,是无法直接获取这个表单里面这些元素的,那么咱们只有通过这个 switch to frame 这个方法切换到表单以后,我们才能再来定位这个表单里面的这些元素啊, 那咱们 switch to i frame 呢,就是说可以使用叉 pass 啊,也可以使用 id 或者 name 来定位啊,这看大家的习惯啊,好,这就是这一课内容啊,谢谢大家。 大家好,我是讲师潘瑞,这一课内容呢是动态网页爬虫 slim 之动作链,这一课呢将会给大家讲解一个查询车票的案例。咱们首先呢看一下什么是动作链啊,用 slim 做爬虫呢,有时候遇到要模拟鼠标键盘的动作,比如啊,咱们要单机双击,点击鼠标右键 滚动页面,对一些元素进行拖拽等等动作,那这时候呢,咱们之前介绍的一些方法就不够用了,这时候呢咱们使命呢,给我们提供一个类来处理这类事件,这个类呢就叫 action chains, 来我们看一下这节课的咱们的这个任务啊,这节课呢咱们要查询一下车票,来我们看一下我们的动作是什么,首先呢我们把鼠标旋停到这个车票这个位置,然后呢点击一下单程, 这时候呢出现了一个弹框,那咱们这时候呢要确认一下,那这时候呢我要在出发地里面输入西安, 然后呢我按一下下键,移动到西安这个位置,点击回车,确认我输入的出发地是西安,这时候呢我要在目的地写一下北京, 然后呢我点击一下箭头移动到北京这个地方,然后点击一下回车,这时候呢我选中了这个北京,那我这时候呢要改变一下这个出发的日期, 那首先呢我是鼠标移动到这个最后这个位置,然后呢给他把这里面内容 删除掉,我要输入二零二二杠零九杠二四,我想查询一下九月二十四日的这个车票,然后点击回车,这时候呢我要勾选一下高铁这个按钮,然后呢我们把这个发车的时间呢来选一下,我选这个十二点到十八点, 我点击一下查询,那这个呢就是咱们今天要完成的这个动作,我们打开了这个 part time 页面,呃,我已经提前写好了一部分代码, 我们看一下这代码是什么?首先呢我们导入相关的库,导入 service 呢,咱们是要给它指定一下咱们这个驱动的位置,导入这个 options 呢,咱们就是要填写一些参数,这个参数呢我们之前介绍过啊,这个呢就是隐藏咱们浏览器一些痕迹的, 这个呢咱们是隐藏,咱们是一个自动化浏览器控制的这个标识的这个参数,那这个参数呢加上以后呢它就防止咱们浏览器啊自动退出。好,那么现在这个初识代码我已经写好了,来咱们先运行一下, 那我们来先看一下咱们完成的第一个动作,第一个动作呢,我是把鼠标要旋停到车票,然后点击下单程进入到下一个页面。那好,那咱们首先呢要把这个车票这个元素啊给它定位出来来,我点右键点检查, 那这时候呢,实际上定位到了车票这个元素,那咱们把它点右键再来 copy, copy 叉 pass, 那 咱们先写注,是啊,第一步呢,咱们就是把鼠标悬停在车票上,把鼠标悬停在 好这个车票呢这个元素呢,我给它写个名字啊, ticket element, 是 吧?等于 brother。 然后我们用 find 这个方法来查找这个元素,那咱们用叉 pass 来定位这个元素呢,咱们要导入这个 by 这个模块,是吧? from slim web driver 点 common, 点 by, 然后 import by。 好,那我们这边用 by 叉 pass by, 点叉 pass, 然后呢把这个元素定位一下,那咱们要旋停到这儿呢,这时候呢,呃,咱们就要使用这个动作链了, 那我们看一下动作链呢是如何导入的?那首先呢,咱们 from slim web driver 列 点 common, 点 action chains, 然后导入这个 action chains, 那 这个 action chains 呢,咱们直接来使用它这个类啊 action chains, 咱们首先要指定一下咱们这个浏览器对象,就是这个 brother, 这个呢就是咱们刚开始初步化这个对象,下面呢咱们要旋停到这个 车票这个元素上,所以呢咱们要使用这个 move to element 这个方法,那这个括号里面咱们只要填写一下这个元素就可以了,那就是,呃, take it element。 好, 那全停上去以后呢,这个动作呢要执行一下,所以呢咱们还要输入 perform 这个词来运行一下, 打开,然后悬停到车票来看,实际上这个界面已经打开了,那这时候咱们就要确定一下这个车票下面单程这个元素所在的位置了,点右键点检查, 然后我们再确定一下单程在什么位置,在这里是吧?然后我们这时候点右键 copy, copy 叉 pass, 那 咱们下一步呢,咱们就写下注,是啊,就是点击单程进入下 一个页面,是吧?那单程呢?这个咱们给它起名字啊,叫完为是吧?完为 element rather, 点 find element by xpath, 然后把这个元素指定一下,那我们把单程这个元素写好了以后,下面我们就要调用一下 action chains, 来点击一下它 action chains browser, 点儿来看 click, 那 我们把这个元素的值进去啊,是 one way element。 然后呢,我们点一下这个 perform, 好, 我们再来运行一下, 打开页面了, 点击车票,点击单程。哎,这时候呢,咱们进入到下一个页面了,那这时候大家看出现了弹窗是吧?那咱们需要把这个弹窗点掉来,咱们点右键来点检查,我们看一下这个弹窗所在的位置啊,来,我们点一下这个箭头,我们点一下这个,确认 好,把这个按钮呢点一下就可以了,点右键 copy, copy 叉 plus, 那 咱们就下一步就是呃处理弹窗是吧? 那就是说,呃,处理弹窗之前呢,咱们要给它先做一个延时啊, time 点 sleep, 比如说我等个两秒钟,等它弹窗加载后,咱们再来点击是吧?呃,叫做 pop, 然后呢 edit 等于 brother, 点 find element, 白点叉 pass, 那 我们刚才写了这个位置是吧?那咱们实际上呢就是要点击它一下, 对吧?还是 action chains brother 来看,点 click 点击一下这个 pop element, 然后呢咱们 perform, 咱们再来运行一下, 哎,弹窗点击掉了是吧?下面呢咱们就要在这个出发地这个地方来输入一段文字了,比如说我们要输入这个西安是吧?那咱们看看咱们这动作是什么?首先呢我们要定位到这个出发地这个元素,然后点击一下这个输入框 是吧?首先要点击,然后呢咱们要输入一段文字,就叫西安是吧?输入完以后呢,这时候呢,咱们要操纵这个向下的箭头,点一下, 选中这个西安,然后呢再按一下回车,这样子呢咱们才能完成对这个西安这个输入。好,咱们看一下动作链如何来完成。首先我们按 f 十二键,然后定位一下这个出发地这个所在这个位置啊, 好,我们 copy copy 叉 pass, 它这个叫 from station 是 吧?咱们也给它起一样的名字啊,我们下面一步呢就是叫做输入出发地,对吧?首先呢咱们要查找一下出发地这个元素啊,咱们它起名字叫 from station, 是 吧?等于 browser 点 find element by 点叉 pass 啊,是这个位置是吧?那咱们首先调用 action chains 这个类,然后呢把 brother 这个对象写进去,那这时候呢,咱们下面要执行一系列连续的动作,那咱们通常给它连在一起写,所以呢咱们一般是用这种方式来写啊,我们加个斜杠,然后呢表示是连续的啊, 那首先呢,我们要点击一下这个出发地这个输入框,对吧?把它先选中了,那咱们用 click 这个方法点击呢,然后把这个元素呢 from station 放进去,好,咱们下一步呢就开始,呃,要往里面输入这个西安这两个字了,但是呢,咱们通常要给它暂停一秒钟, 那防止咱们这个动作过快啊。好,我们输入一下 pause, 然后输入一秒,然后呢在下面咱们就可以使用 send kiss 这个方法来把西安这两个字输入进去了,那咱们可以用 send kiss, 是 吧?然后把这个输入一下这个西安这两个字啊, 然后呢咱们就输入完了,咱们就再停一秒钟,是吧? pause 一 秒钟,下一步呢,咱们就是要按一下这个向下的这个箭头,选中西安那个两个字,对吧?那咱们还是用这个 sendkeys, 然后呢这回呢,咱们就要使用这个 case 这个类啊,大家看啊, case 这个类呢,咱们要提前先导入一下啊,就是说通过这个模块呢,给它导入,导入之后呢,咱们就可以使用 case 了。 case 呢?大家看这类下面有很多这个内容啊, case 呢,这里面呢可以模拟咱们键盘上的所有按键啊, 那比如说咱们现在要输入向下的箭头,那就是 error down, 对 吧?那咱们输入一次,然后呢咱们再来 pause 给它停个一秒,是吧?然后呢咱们这时候呢再输入一下 enter, 输入一下回车键,是吧?咱们还是用这个呃, send kiss 这个方法,那咱们调用 kiss kiss 里面的 enter, 这个 enter 就是 回车键,咱们最后再写一个这个斜杠,然后咱们把整个动作再来执行一下,那咱们就要调用一下 perform, 那咱们通常就是说在每个环节呢,咱们还是要加个延迟啊,避免他动作过快产生错误,那咱们停一秒钟啊,来,咱们继续再来看一遍,打开了是吧? 好,这时候输入了西安是吧?在下一步,大家看,我要输入目的地,北京,我先要选中这个输入框,然后输入北京,然后呢按一下向下箭头按两次,然后按回车。 好,那咱们首先呢,要把这个目的地这个元素呢,先给它定位一下,点右键点检查,咱们再来定位一下这个目的地啊,在这儿咱们 copy copy 叉 pass, 呃,输入目的地是吧?那咱们呢,同样先做个延时啊, time 点 sleep 一 秒钟是吧?那咱们这回呢,起个名字叫 to 呃, station, 那咱们同样有 brother 点 find element 八点叉 pass 是 吧?这个位置,那咱们这个动作呢,跟之前是很接近的,咱们把它先考过来一下, 那这边呢,我们就改成北京了是吧? 然后呢,咱们这个 kids ever done, 大家看啊,我们刚才是要点了两下呢,所以呢,这个地方呢,我们要动两次,是吧 kids 的 ever done。 好, 那咱们再来运行一下, 大家看,它现在呢,实际上在出发地输入了北京啊,我们看看是什么原因啊?我这个地方呢,大家看,我这个地方呢,实际上写错了,这是 from station, 应该改成 to station 是 吧,要显入一下目的地。 好,我们再来跑一次啊, 好,现在呢,他这个出发地和目的地都填好了,咱们现在呢,要填一下日期啊。呃,首先呢,咱们要选中一下出发日期是不是? 然后呢再给他删除里面内容,点击一下,然后再删除里面内容,是吧?那咱们先把这个出发日期这个元素先定位一下, 那点一下这个箭头,定位一下出发日期是吧?来,咱们点右键 copy copy 叉 pass。 咱们下一步呢就是填写出发日期是吧?那出发日期呢?咱们给它起名字叫 date id ment 是 吧?还是 brother 点 find element find 叉 pass, 那 咱们首先呢还是要调用动作链是吧?那咱们用这个动作链的方法来调用啊,那咱们首先呢,大家看要点击一下这个 date element, 对 吧? 那大家看啊,前面这个这几个步骤呢,我们给它跳过啊, 对吧?我们把这前两步呢,咱们给它跳过一下,因为这几个动作呢,反复执行有点浪费时间啊。那咱们把这个 u r 呢来给它取一下,就咱们直接从第二个页面的 u r 开始,大家看第二个页面的地址是这个地址,咱们从这个地址来开始继续啊, 那我这边呢写一个叫做 temp u r 等于这个,那咱们直接就从这个地址来开始执行啊, 那我们为了节约时间呢,大家看啊,我们还把这个地方出发地这块儿呢,呃,这个内容呢,也给它先注视掉,咱们先不执行这块儿 目的地,也不执行,咱们就直接来从这个填写日期这边开始执行啊,我们这边还加一个 perform 来看啊,来,我们来再次运行一下,看一下 打开页面了,是吧?处理弹窗是吧? 哎,再看现在呢,我点击了一下这个出发日期这个地方,它鼠标呢实际上停到这里面了,那咱们现在实际上把这里面的数字给它删除掉,来重新输入,来,咱们看一下需要什么动作, 首先呢再看,我要点箭头放到最后面,是吧?实际上右键执行一次,然后呢我再执行这个删除键,一二三四五六七八九十,你看,然后呢,这时候我才能再继续来输入,我们这个二零二二零九杠二四 是吧?那咱们看看这几个动作啊,怎么给它加进去啊?然后再回车一下啊,这样子呢,咱们才能选中这个日期,那咱们首先呢给它先暂停一下是吧?啊? pose 一 秒钟, 停,暂停一秒钟,然后呢执行这个箭头向右是吧?那咱们使用这个三的 kiss 这方法,那咱们用 kiss 里面箭头向右啊,那就是 arrow, 应该是 right 是 吧?那咱们给它两次吧,这样保险一点, kiss 向右直行两次, arrow right 对吧?执行两次了以后呢,咱们现在回退键给它删除是吧?那咱们这边呢,给它再暂停一下是吧? pause 一 秒钟,再我们 send a kiss, 那 咱们这回呢,就是用这个叫什么 backspace 这个键,那我们要给它执行十次是吧? 执行十次呢,我直接来把这个来写个十次啊,然后呢我们这边呢加一个,这边加一个斜杠是吧?执行完十次以后,这时候呢,咱们再来让他休息 一下是吧?休息一秒,最后呢,咱们最后输入咱们这个日期啊?三 kiss, 那 这个日期呢?咱们写一下,输入完这个日期呢,咱们再紧接着跟一个 enter 是 吧?输入一个回车。 好,那咱们这时候啊,再来运行一下, 好,大家看日期,现在输入完了是吧?那咱们现在呢还要执行动作,就是来勾选一下高铁,高铁呢,我们点一下右键来点一下检查,我们再来定位一下这个高铁这个所在的这个位置, 大家看它实际上是在这个立标签里面来看,那咱们先呢,呃,点右键来这个 copy copy 叉 pass, 咱们点击一下这个按钮是吧? 下一步呢,咱们就是勾选高铁,是吧?那高铁呢?咱们起个名字啊,就叫做高铁 element, 哎, brother, 点 find i, 点叉 plus, 大家看一下啊,这个 checkbox 这个数字,这上面编码有可能是变化的,那如果是变化的,可能会定义不到这个元素,对吧?那咱们这个因为只有一个动作呢,直接点一个 click 就 可以了, 那咱们其实呢这个变量就是没必要给它存在了,是吧?咱们直接删除掉,那咱们就直接来这样定位一下,看看能不能勾选到啊,那咱们这个发送日期呢?咱们先给它呃注水掉吧。好,来咱们再来运行一下, 大家看这边好像报错了,是吧?它写的是 no such element, 就是 找不到这个元素,是不是?来我们看一下这个元素,为什么找不到啊? 那我们来按下 f 十二来定义一下这个元素,高铁这个按钮, 大家看实际上这个 id, 刚才咱们是通过 id 来定位它的,它这个 id 呢已经产生变化了,所以呢咱们要找一个不变的啊,哪一个是不变呢?我们看一下这底下呢,我们看一下下面还有一些标签,是动车呀,直达呀,对应的,是吧?它们这个大家看这个 input name 是 一样的, 是吧?这个有个 y 六,哎,这个 y 六值好像是不一样的,对,我们看一下这个 y 六值是不是都是不一样的?哎,那咱们其实可以通过这个 y 六值来定位它一下, y 六值等于 g 就是 高铁,是吧?把这个地方来改一下是吧?刚才呢是通过 id 来定位的是吧?咱们这边呢用这个 y 六等于 g 来定位一下,好,咱们再次运行一下。 哎,大家看这个高铁这个选项选中了,是吧?好,那下面呢,我们还要做一个什么选项呢?咱们要 指定一下发车时间,对吧?我想选择嗯,这个十二点到十八点这个选项,那这个咱们怎么来选中呢?大家看一下,我按下 f 十二键,然后点击一下这个发车时间这个位置,那我们看到这里面呢,实际上是一个 select 这个对象, 那操作这个 select 呢?咱们需要使用到这个 select 这个类才能给它进行操作啊。来,我们看看怎么使用,那我们先把这个 select 所在的位置先给它 copy 一下啊, copy 叉 pass, 那 咱们呢实际上导入一个 select 类啊, from cm webdriver 点 support 点 select 导入这个 select, 那咱们写一下这个步骤啊,咱们要是勾选发车 时间,对吧?那发车时间呢?我们就是 start time element 是 吧?那我们用 brother 点 find by 叉 park, 那这个呢?是它的叉 pass 路径是吧?那咱们这时候呢就要用 select, 然后呢把这个 starttime 这个元素放进去, 那这时候呢,我们就有很多种方法来选中这个相应的这个时间段了,那我们可以通过它这个显示出来的这个文本来显示通过它的这个序号,或者通过它的这个值来,我们看看我们通过什么方式选比较合适啊? 来看这个呢?呃,是它的时间段是吧?这个是实际上是它的显示出来这个值,那咱们就通过它这个值来选啊,就是文本值来选择,我们 copy 一下, 用 select by visible text, 我 们就输入这个十八到二十四点这个时间段,那咱们再来执行一下。 哎,大家看这个呢,实际上它已经把这个时间已经选到了,那咱们最后一步骤呢,就是点击一下查询是吧?来,我们看看查询这个所在的标签在什么位置啊?那我们来定位一下查询,那我们 copy copy 叉 pass 来进行点击一下就可以了。那我们就最后一步呢,就是点击查询,那咱们直接来就说 操作就好了。 brother 点 fanament fire, 点查 pass, 然后查询是这个位置是吧?因为这个动作简单呢,咱们直接调用这个 click 这个方法就可以了。好,那咱们把之前的这些内容啊,全部给它打开,让它完整地来执行一次啊。 好,那把这个地址呢,我们再给它改回去啊,改到这个 u r l。 好, 那咱们再来呃,完整的来运行一次。 哎,大家看,这时候呢,我们就查询到了咱们需要的这个车次了, 咱们再来回顾一下这篇内容,大家看,那首先呢,咱们是把这个鼠标旋停在这个车票上,这里面呢,咱们就使用了动作链了,那咱们就是一个叫 move to element, 那 它可以实现把鼠标旋停到你指定的元素上面是吧?下面呢,咱们就使用了这个点击进入下一个页面 是吧?点击咱们用的比较多一点,那这边呢,咱们调用了这个 sendcase, 然后调用里面的 case i wrote down, 这样子呢,咱就按下向下的箭头,按一次是吧?然后再按一下这个回车键, 输入日期的时候呢,咱们先按一下向右的箭头,按了两次,然后呢按这个删除键,按了十次,把里面的这个数字全部删除。然后呢咱们再输入咱们想要查询的这个日期, 是吧?然后呢最后呢,咱们就勾选了一下高铁这个选项,然后呢就是勾选一下发车时间,是吧?发车选时间呢,它是这个 select 一个对象,所以呢,咱们这边呢,要用 select 这个方法呃来给它进行操作。 最后呢,我们点击了这个查询按钮,查询到了咱们要查的这个车次,那我们看一下这个呃, steam 动作列表呢,咱们介绍过了, move by offset 呢,就是按照一定偏移量来移动这个鼠标是吧?点击然后呢 script element, 那 实际上呢,它就是模拟鼠标的这个滚动。 a script by amount 呢,就是按照一定偏移量来滚动。 那 perform 咱们就说了,所有动作呢,最后要通过 perform 来执行 context 点 click 呢,就是点击右键的意思,鼠标右键 click and hold 呢,就是咱们点击一下鼠标,然后不松开,是吧? double click 呢,就是模拟这个双击的动作。大家看这个 drag and drop 呢是什么意思呢?就是按住这个一个元素啊,然后呢移动到目标元素并释放鼠标啊, 那这个还有,大家看这个还有 drag and drop by offset, 那 是按住这个鼠标左键,然后移动到这个目标偏移并释放鼠标按键啊,这就是这个内容啊,谢谢大家。

挑战一周,带你学完 python, 跟这个学完,你会发现你真的很牛!警告,本系列最新 python 教程应该是目前全网最系统易懂的小白专用课了,一口气带你学完 python 所有核心内容,存下吧,最新版错过就刷不到了! 新的一年, python 到底要怎样学习才正确有效?首先是基础部分,需要学习 python 软件安装、变量运算符、循环字母串元组。 第二阶段是进阶篇,会详细讲解各种 python 进阶知识函数、面向对象、正则表达式等知识,用最易懂的方式带你熟练使用 python, 为后面的路打下牢固的基础。 第三阶段,技能训练会从 python 爬虫、数据分析、人工智能、办公自动化等领域展开,让你可以把所学的知识进行变现,流进你的口袋。为了让大家轻松学习 python, 我们这套课程呢,会从语法入门篇、语法进阶篇、全站实战篇等三大方面来讲解。语法入门篇里面包含了 python 与 patcharm 的 安装以及环境配置学习变量运算符、数据类型、控制、结构函数等。语法编程 语法进阶篇里面呢,我会详细讲解每一个进阶知识,从面向对象编程、异常处理、正则表达式等知识。全站实战篇会手把手教大家练习项目,比如爬取图片、视频办公自动化、 数据分析、机器学习等。最后呢,会给大家一个小福利,有搭建开发环境资料包、 python 从零到一的学习计划表, 几十上百计,素材、书籍、课件等等,只要你能想到的素材我这里几乎都有,评论留言六六六即可全部免费打包带走!相信我,这套拍粉系统课程将会是全网最齐全最易懂的小白专用课,如果看到这对你有所帮助的话, 请给老师一个免费的一键三连吧,让更多想要学习拍粉的小伙伴看到这个视频。下一站上岸, 大家好,我是讲师潘瑞,这节课呢开始一个新的篇章,多任务爬虫里面的多现成。来我们首先看一下什么是多现成啊?在默认的情况下呢,咱们一个程序啊,通常只有一个进程和一个现成代码呢,是按照现行依次执行的, 那多县城呢,就可以并发执行,什么意思啊?就是一次性啊,多个人可以做多件事。那这里面啊,就涉及到两个概念啊,一个叫并行,一个叫并发。并行呢是指同一个时间内发生了多个事情。 并发呢是在同一个时间段内啊,发生了多个事情。来我们看一下实际案例啊, 来看我们通常的这个代码呢,都是这样串行,一个接一个的这样执行,对吧?这就是我们总共需要的耗费的时间啊,但是我们并行是怎么样的呢?大家看,在同一个时间段,三个程序同时执行,那这个叫并行, 那并行呢,也是能极大的提升这个整个执行效率,但是呢它是需要多个 cpu 才能实现的, 那这个就是我们说的并行。那我们再看一下什么叫并发,来,我们串行是这样执行的,并发是什么?就是在同一个时间段内啊,有多个程序同时执行。那我们看一下,那这时候在这一个时间段啊,比如说在这个时间段内,这三个程序 给他同时折行了,但是呢大家看,那在这个时间段内呢,把这个程序啊,给他切成了一小片,一小片,那就说 cpu 啊,执行这一段任务之后,再切换成这一部分,再切换成这一部分,然后他看他继续再执行啊,再切换成这一片,再切换成这一片这一片, 然后再这样切啊,大家看整个一个这个任务,这个 a a 啊,大家看被切成了三个片段啊,分开了,这样执行啊,我们这样看上去,是不是三个程序啊,在这一个时间段内同时在运行啊? 对不对?但是大家发现没有,我们这样切片以后啊,它这个总的这个运行时间啊,并没有减少, 那这样说,我们这个病发是不是就没有意义了?那还不是啊,我们给它叫做 cpu 密集型,什么意思呢?就是我们这个程序啊,就是大量的占用了 cpu 资源啊,大量的占用 cpu 资源,然后呢就说 gpu, 就 说它的所有任务啊,都是需要 cpu 参与完成的,对吧?那所以我们这样把它切开以后啊,并不能减少时间啊, 但是对我们另外一种程序,我们看一下,那就情况就不一样了,大家看这个呢,是另外一种情况,我们也是管它叫并发症,但是呢它叫 i o 密集型,什么意思呢?就是这一个任务啊,我们给它切成两部分,一部分呢大家看是需要 cpu 全程参与的, 另一部分大家看,那就是这个 i o 操作。 i o 操作是什么意思呢?就是这个输入输出操作,包括咱们 request 库里面向服务器发送一个请求,然后对方服务器跟我们发送一个响应。实际上在这种过程中啊,我们的 cpu 啊,并不需要参与, 那对于这种任务啊,我们看它是如何执行的,那 cpu 参与部分,它开始进行执行,那然后需要这个 i o 参与的 cpu 啊,就切换出来了,让 i o 去执行这段任务,这时候 cpu 的 资源啊就被释放出来了,它可以执行现成币啊, 那它在现成币完成它需要它 cpu 参与的任务,它完成完了以后呢,再把它挂起啊,让这个现成币的 i o 操作继续来执行, 然后呢,它再会切换到现成 c 去完成它需要做的 cpu 工作,那然后完成了 cpu 部分的工作之后呢,它让现成的这个 i o 继续来操作。大家看这样子运行完以后呢,整体的运行时间是不是大大的缩短了? 那这个呢,就是咱们一个 i o 并发的概念啊,咱们 python 多现成呢,也是这样实现的, 我们看一下 python 多现成的用途啊, python 自带的解释器呢是 c python, 其实它它并不支持真正意义上的多现成,那这个 c python 中呢,包含了一个叫做 gil 锁,就是全局解释器锁, 那它这个锁是做什么呢?它保存在一个时刻,永远只有一个现成在执行啊,那即使是有多个 cpu 情况下,它也仍然只有一个现成来执行, 那这样大家看这个多现成是不是就没有用了呢?也不是啊,那对于咱们说这种 i o 密集型,就是咱们这种爬虫类型啊,咱们之前说的它呢,实际上大量的占用的是 i o 资源,它并没有集中占用这个 cpu 资源, 所以呢,我们用 python 多线程啊,实际上也是可以明显提升爬虫的效率。相反,如果咱们使用大量的运算的时候,这时候你使用这种多线程啊,反而没有优势,那么我们可以使用多进程啊,就是利用 cpu 的 多个核同时进行来进行运算啊, 这就是这一课内容,谢谢大家。大家好,我是讲师 perry, 这一课呢,给大家介绍一下 python 中的 threading 模块, threading 模块呢是 python 中专门用来制作多现成的模块,这个模块中最常用的类是 thread 类啊,下面呢给大家演示一下如何用 threading 模块直接写一个多现成的程序啊。 好,我们现在创建一个 python import threading 这个模块。 那大家看我们现在呢创建一个多线程程序呢?是这样子的,我们创建两个函数,一个咱们叫做唱歌,一个叫做跳舞。来,我们先定义一下这个唱歌啊, singing, 那 这个唱歌他这个嗯函数完成什么功能呢?大家看,他首先要打印一下,我们让他首先打印一下这个谁谁谁开始唱歌, 对吧?那我们这个程序呢,它延迟,比如说延迟一个时间,延迟这个时间呢,我让它从这个参数里面传过来啊,这个谁谁谁唱歌呢,这个是我们给他把这个叫 name 传过来啊,那延迟的时间呢?我们叫 delay, 这两个参数呢分别给它传进来啊, name 是吧,然后这个 delete。 好, 那么我们在这个函数结束的时候呢,我们再打印一下啊,呃,结束唱歌是吧? 好,这个呢,大家看就是第一个唱歌这个程序啊,它实际上就是延时几秒钟。打印一下,那我们再来定义一个函数呢,叫做跳舞啊, dancing, 我们跟它结构也是非常类似的, name delete 是 吧?让它延时一下,然后我们第一个呢程序呢,就是说 我们给他说谁谁谁啊,开始跳舞,对吧? 来我们也同样来给他做一个延迟啊, time 点 sleep, 点 delay, 对 吧?我们再来打印一下,就是说结束跳舞 来看啊,这样子呢,我们就完成了两个函数啊,一个唱歌一个跳舞,那我们再来写一个单现成函数,再调用它一下啊,单现成我们就顺序调用,那么我们给他起个名字呢,叫做 single thread 是 吧?那这个函数它就完成很简单,调用一下,先调用一下唱歌是吧?我给它传个参数啊,比如说这个学友 唱歌是吧?让他唱延时,让他唱两秒钟, 对吧? dancing, dancing。 那 我们比如说潘潘在跳舞是吧?潘潘跳舞让他跳三秒钟 是吧?这他就实现了一个唱歌和跳舞。那我们再来,呃,写一个函数入口啊,就是说我们函数从这个地方开始执行啊,那 single thread 来这个函数大家看,我们就实现首先实现一个单县城啊,什么意思呢?就是我们一次执行一个县城,那把这个函数执行完了,再执行这个函数是吧?来,我们先来运行一下,看一下, 那学会唱歌开始,等一下结束唱歌,他们开始跳舞,结束跳舞,对吧?来,我们加一个时间模块来统计一下时间。呃,我们就实际上,大家看,先把当前的时间呢,先给它记录一下,我给它记录叫 start, start time 啊,等于什么呢?就是这个 time 模块里面的 time 啊,大家看结束之后啊,这个我再来写个 end time 是 吧? end time 等于这个还是 time? 点儿 time, 那么我们在最后来打印一下这个时间啊,就说,呃,总共消耗时间多少多少秒,是吧?来我在这里面写一下 anytime, 实际上就是最后的时间减去这个 start time, 对 吧?我们再来运行一下看看啊,看看它这个县城要执行多少时间啊?开始唱歌跳舞, 是吧?消耗了五秒钟,对,五秒钟多一点点,那它还有其他的开销,对吧?总共大家看这个两秒加三秒是五秒钟,这个单线的耗时呢,就是串形的,总共加起来需要五秒钟啊, 那大家看,我们现在在写一个多线程呢,我们定义一个多线程程序叫 multi thread, 那他怎么完成的?大家看啊,我们就说我们先建一个对象,叫推迟一,让他等于这个 stretch 模块里面的 stretch 方法来调用我们这个 函数啊,再看我们用这个,呃,他给的这个参数啊,来指定一下这个,我们调用这个函数名字啊,那叫做 cnn, 对 吧?那大家注意一下我们在这个写的这个函数名字啊,那叫做 cnn, 对 吧?那大家注意一下我们在这个写的这个函数名字呢,就是要调用函数本身啊, 那么我们实际上是给他指定一下他的名字啊,要指定一下参数,因为我们要传入些参数进去吗?他需要一个 name, 一个 delete, 是 吧?这参数怎么传进去呢?我们用这个 x 等于,那我们加个括号啊,就是把参数呢分别填进去啊,首先呢需要一个 name, 那这内幕呢?我们直接呢大概怎么传呢?就是我们给他说一个呃,学友吧,然后呢 delete 这个时间呢?我们给它填进去两秒钟,对吧?那这个呢?我们看,呃 t h 一, 我们要点一个 start, 它才能开始这个县城啊,否则呢,它只是把这个建立了一个对象而已,它并没有开始。那我们看,我们现在同时要打开第二个县城,等于这个 threading 模块点儿 thread, 那我们用 target 这个参数指定一下函数名字,他叫单行,是吧?那同样这个我们把这个括号给它去掉啊,来,我们再传入一下这个参数 x 等于,那大家看,我们的参数呢?必须在这个呃圆组里面啊,那 我们先把这个第一个人的名字啊,叫潘潘写进去,那我们再把这个相应的参数传进去三秒钟, 对吧?大家注意一下,如果咱们这个传输参数呢,只有呃一个参数,那么我们就给它去掉,后面打个逗号,那不打逗号的话,大家看,如果只是传一个参数,它实际上就传参数本身它并不是圆组,这样会报错的,所以大家看,我们到时候一个参数的话也要打个逗号啊, 那我们再把第二个县城的给它开启一下点儿 start, 我 们现在呢,实际上同时打开两个县城,让它同时运行啊,我们再重新跑一跑,把这个 single thread 呃给它注射掉,我们来调用一下 multi thread 来,我们再来运行一下。 哎,大家发现没有?就说我们这个县城啊,它实际上大家看啊,它实际上两个县城就是同时运行的,就是 dancing 和这个唱歌和跳舞同时运行的。 来大家注意一下啊,这个我们看一下总共消耗的这个时间啊,总共消耗这个时间呢?它是,呃,时间是不对的, 这个是为什么呢?那是因为啊,就是说咱们这个县城呢,他分三个县城,一个是让我们这两个子县城实际上还有个主县城,主县城呢,他实际上就说也在同时运行,那这个就是主县城, 那就是说子县城运行的同时,主县城也在运行,但是子县城它并没有运行完,主县城呢就提前结束了,所以呢这个统计的时间呢?这块显示的只是一个主县城结束的时间啊,那大家看啊,我们在这可以打印一下,就是当前的所有县城,怎么打印呢? threading 点这个叫 innumerate, 那 这个呢,就是能显示当前所有的县城啊,来我们再运行一下看看啊, 大家看当前是不是一个主县城啊,对吧?呃,还有一个子县城一,子县城二, 对不对?嗯,那我们现在呢就是说统计时间呢,我们实际上就是说大家看,我们想统计到这个第二个县城结束后,是吧?就所有子县城结束后的这个时间,那么我们怎么统计呢?大家看啊,我们这边可以用一个叫 join, 什么意思呢?就是我们这个主县城啊,要到他前两个县城结束之后啊,再继续运行啊。来撞, 就说什么意思呢?大家看我们这打了个撞运,是吧?那就是说这个我们后面的执行这个步骤啊,我要等到前面两个执行完了我才继续运行啊。来我们这时候我再统计一下时间,我们看一下 结束唱歌,结束跳舞,大家看是不是?那这个 multi thread 结束以后,我们才执行下面的这一份代码,这时候大家看现成了,只有一个主现成了,对不对?我们消耗的这个时间是三秒钟,三秒钟大家看,实际上就是它们俩总共运行了就三秒钟,那实际上就是取了一个较长的这个 时间啊,大家看啊,我们这个呢建成呢,实际上啊这些建成呢,它可以开启多个,我们现在只开启了一个,每个只开启了一个,是吧?来我们可以用 for 循环让它开启多一个,比如说 for i in range, 那 我们开启三个,试一下开启三个 来看,我们通过这样子啊,就可以开启多的三个, 开启三个,但是大家注意一下,开启三个时候,我们这时候在这个状元这样写呢,他就不对了,因为这里面有三个这个 t h 二 这个县城,就是当时你这个县城他开了三个,对不对?那我们这时候他看我们如何实现这个状元呢?来我们这边练一个列表,就说我们这边新建一个叫 task 的 空列表,把这些这个县城呢给它全放到列表里面,我们再来状元一下, 比如说大家看啊, task append, 我 们先把 t h 一 放进去,对吧?那我们这个 task 这个空列表,大家看,我们要给它放到之前面,放到最前面啊, 好,这个 task 一 app 进去了,大家看,我们实际上这个 task 啊,就是说在它 start 的 时候,把它这个 t h 二也给它放进去,对吧?这样放进去以后啊大家看,然后呢 我们就来这回啊 for 这个 t, 嗯, task 那 t 点 join, 通过这个方式大家看就说我们保证所有的县城执行完了以后就是个 multi thread, 这个所有县城执行完了以后,我们才进行下一个县城,好来我们再来运行一下, 大家看吧,潘潘开始跳舞,执行了三个县城了,是吧?结束唱歌,结束跳舞,结束跳舞, 那整个时间并没有增加,对吧?那这个就是实现了这个多线城啊,他们同时运行,所以呢这个时间并没有增加,这就是这一课内容啊,谢谢大家。大家好,我是讲师 perry, 这一课呢,给大家介绍一下如何通过继承 spreading 模块下的 spread 类,然后呢通过 run 方法实现多线城, 那我们打开拍叉码,我们就接着在第一节课基础之上呢,把它进行一个改造,再看这个是第一节课代码,我们通过继承类的方法来实现一个多现成啊,那我们首先大家看导入一下 thread 模块, thread 模块,然后再导入一下 time 模块, 那我们首先大家看创建一下这个唱歌这个类啊,那我用关键字 class 来定义一下 class, 然后 singing, 那这个大家看这个括号里面呢?我们写一下 thread 点 thread, 那 这个什么意思啊?就是说咱们这个类啊,继承自这个 thread 模块下的这个 thread 类, 那我们大家看,我们首先写一个函数叫 run, 那 我们打完 run 以后,它它默认是这个样子的,那就说这个 run 函数里面的内容啊,是咱们调用 thread 的 时候默认执行的代码, 那我们先写下内容,比如说 print 谁谁谁开始唱歌啊,我们还是跟上次一样, threading 点 current, thread 点 name, 那 就是说明某个县城啊,它开始唱歌了,开始 唱歌,我们要给它一个延迟,是吧?延迟呢,我们可以写直接就写个时间啊,但是呢我们想给它传入一个参数进来,我们现在传入参数的话呢,我们要给它先通俗化一下,来, 我们先写一下一个抽象函数,大家看如果我们这样写这个函数的话,大家看那他就会把咱们这个抽象模块这个抽象函数直接覆盖掉。那么我们这边呢,还是使使用这个继承的方式啊,咱们用 super 函数给他继承一下,就是把他这里面的之前的这个 呃 initial 就是 抽象这部分代码给它继承过来,然后呢我们再添加自己的这部分这个内容啊,比如说我们添加一个 delay, 就 说这个延迟多少秒是吧?那么我们用这个 self 来给它接收一下 self 点 delay, 让它等于这个 delay, 是吧?那然后大家看,我们这边这个三秒钟呢,我们就用这个 self 点 delete 来接收一下,这样子呢就可以把这个参数传进来了,那我们在唱完歌以后呢,我们再打印一下,叫结束 唱歌,对吧?那大家看,我们现在呢实际上就定义了一个叫唱歌的函数,那我们可以用同样方法再再定义一个跳舞,是吧? dancing 呢?我们同样啊,这个跳舞这个类呢,也是寄存至 sweating 的 这个类啊, 那么我们同样打开,我们先定义一个这个 raw 函数啊,就是默认执行的这个函数,那它执行什么呢?打开啊,也是同样的,我们也是就是说,嗯,让它也打印一下谁在唱歌谁跳舞,是吧? threading 点 current thread 点 name 开始跳舞,是吧? 开始跳舞,然后呢打开,我们也是同样在让他做一个延时,对吧? time 点 sleep, 那 么我们把这个是这个参数给它传进来啊,我们传入这个 in, 通过这个 in 函数啊来进行传入啊,那我们把这个点 delete 传进来一下, 那么同样这个呢,也是继承制这个 thread 类啊,那用 super 函数来做一个继承好,继承完了之后呢,我们把这个用,把这个 delete 这个参数复制到 self 类里面 die, 我 们就可以使用这参数了,呃 self 点儿 die, 是 吧?那这个呃函数运行完呢,我们再给它打印一下,就是说结束跳舞,对吧?我们这个函数是跳舞,那大家看,我们在下面呢,就要写入一个 函数来调用它们,是吧?来定义一下叫做 multi, 这个叫什么? multi thread, 是吧?大家看,那么我们要给他调用一下,首先大家看我调用一下这个这个唱歌,是吧?那我们这里面调用啊,我们直接就可以调用它啊,大家比如说 thread 一 等于这个叫做 cnn, 是 吧?大家看这里面我们直接传入,我们需要传入这个参数啊,那我们这边需要一个测参数,就是 delay 延迟几秒,是吧?那我们这边呢可以写一个 t h 一 点 start 这部分, 然后我们再给大家看,我们来调用一下这个跳舞 dancing, 是 吧?跳舞呢,我们也给它实现多个现成同时运行啊,那我们 four i in range in range, 然后呢?我们写个三个现成吧,好吧,然后呢我们来调用一下 t h r 等于这个 dancing, 是 吧?那我们传入一个参数呢,这参数就是这也是这个比例,这个参数,对吧?那我们给它传入几秒钟呢?我们给它传入,呃,比如说,呃,四秒钟吧。 好,那我们来个 t h r 点 start。 好, 那这两个 multi thread 的 这个参数写好了呢?我们写一个接口来调用它一下 main, 是 吧?然后呢 multi thread 好, 这样打开我们就写完了,我们来运行一下看一下, 那这三个开始唱歌儿,三个跳舞,是吧?那结束唱歌儿,结束跳舞来,我们想看一下这个运行时间啊,那想看一下运行时间,同样的我们要把它等待它这个,呃,所有的这个子线程跑完以后,我们才能看到这个时间啊,那大家看,我们先写下开始时间啊。 start, start time 等于这个 time 点儿 time, 是 吧?结束时间,大家看,我们在这儿写的是 and and time, 等于这个 time 等于 time 点儿 time, 对 吧?那我们来打印一下,就是说这个 结束时间 end time, 那 减去减去这个 start time。 我 们刚才说了,就是说这个要等到所有的这个子线程运行结束以后才能执行这段代码, 对不对?那么我们在这边要加一个 join 啊,那加个 join 之前呢,我们先把它所有的任务放到一个 task 列表里面,对吧? task 这个列表我们先放进空列表里面, 大家看,我们这边呢,就是说 task 点 append, 然后呢把这个 t h 一 放进去, 对吧?那大家看,在这个运行的过程中呢,我们把后面的县城啊,也全部给它放进去啊,那也是一样的,大家看 task 点 append t h r 是 吧?这样我们可以放进去多个县城。好,来看我们最后呢,用 for 循环 for t in task, 然后我们 t 点 join, 那 这样大家看意思呢?就是保证我们所有这个县城运行结束之后来再执行下面这个段代码,这样子的我们统计的时间才能比较准确啊。来我们再次运行一下看一下, 那这个结束唱歌啊,结束跳舞,总共四秒钟啊,四秒钟,大家看四秒钟,我们这边呢就是实际上是这个县城的运行的一个最长时间啊,因为四个县城同时在运行嘛。 大家看啊,我们这节课呢,我们就实现通过呃继承这个 thread 模块下的 thread 链的方法,实现了一个多现成啊啊,这就是这节课内容啊,谢谢大家。 大家好,我是讲师 perry, 这节课呢,给大家介绍一下多现成中一个常见的问题啊,就是局变量的共享问题。那局变量共享有什么问题呢? 我们多现成呢?比如说想对一个这个全距变量 a 变量要进行一个累加啊,那假如,假设咱们三个现成都是完成一个工作,就是给这个变量 a 加一 来看,我们现成一啊,拿到了 a 的 这个变量值,然后呢准备给他加一把二,就要给他赋值进去的这个过程中啊, 这时候 cpu 切换到第二个县城了,那第二个县城也是完成同样的动作,比如说把它的值读出来是一,那么把准备把二给它复制进去,这时候大家看第三个县城又过来了,第三个县城也是完成同样动作,把这个县城的变量先给它读出来,那然后再加一进去, 那他把二准备复制进去,在复制二的过程中来看, cpu 又切换到了第一个县城,那第一个县城做什么呢?他就把二复制进去,那这时候切换到第二个县城,他也把二复制进去, 那按道理来说,他是不是应该加到三了,对吧?那同样县城三,他复制进去,应该是这个变量 a 应该变成四了,对吧?那实际上他还是二, 那这就产生一个问题啊,就是咱们多个县城同时操作这个变量,就会产生冲突,产生错误,对吧? cpu 呢?它是按照时间片来切换的啊,那 cpu 并不知道你是要读取它的值,然后再赋值,它并不能产生这么一个保护。那这种问题我们来怎么解决啊? python 呢,有个锁机制啊,就是咱们有个 threading lock 类,叫 threading lock 锁,这个锁呢,它能完成什么? 它就是在某个县城访问某个变量的时候加个锁,那比如说我们刚才说的这个 a 啊,它要加一的时候,我们把它锁起来,别的县城啊,不能操作,直到我把这个一给它复制完以后,我再把它释放出来,这个时候其他县城啊才能进行处理。 那这样子做的好处就是我保证我这操作它是安全的。那我们讲了这么多啊,我们用代码的方式给大家演示一下来看啊,我这现在定义一个函数啊,定义一个函数呢,这个函数呢,它的作用就是加一 add, 我 们给他起个名字叫 add value, 是 吧? 那他呢,就是对一个全距变量进行不断的加一,那我把这个全距变量我给他定义一下,叫 a, 是 吧?我们刚才说的是 a, 那 我们默认呢,它等于零啊,那所以大家看,我们把这个全距变量我们操作之前呢,叫 global a 给它放进来啊,那我们来 for 循环一下 for i in range, 那 我们控制一下这个次数啊,这个次数呢?我想从外面给它请求进来,比如说 for number 次,是吧?然后呢我们 a 就 等于什么 a 加等于一啊,就算它不断的加一,那大家看循环之后呢?我给打印一下, 我们说 a 的 值是什么?大家看我把这个 a 打印出来,对吧? 那大家看,我现在在写个函数呢,就是让它这个多线程进行同时运行,对吧?那么我把这个 threading 模块先导入一下,导入 import threading, 对 吧?那么我们写一个函数来调用它 d f main main 函数,我们来调用它一下, 那么我们就是 for 循环啊, for i in 这个 range, 那 我想给它同时跑十个,就是说这个加一啊,我同时让它跑十个县城啊,那么我们就是 thht 等于 threading their thread, 是吧?把这个现成类打开,然后我们 target 等于这个 add value, 是 吧? add value, 好, 我们把这个括号去掉,那这时候大家看,我要把值传进去啊,就是把这个 number 次数传进去,对吧?我们用 x x 这个参数来传进去 x 呢?我们括号,比如说我们给它加个一百万次啊,一百万一二三四对号,好,那我们 t h 点 start, 我 们来写数,写一下函数域口啊,没 调用一下这个 make 来,我们大家看,我们这时候来运行一下,看看这个结果啊,对,这个,大家看,我这个 number 呢?没传过去啊,把它写进去 number, 好,我们来运行一下啊,看一下结果 来,大家看下面这个值,这个 a 的 值是不是不确定的呀?对不对?大家看它变来变去的并不是我们想的那个一万、两万、三万、一万、一百万一,一百万、两百万、三百万,对不对?那我们再来运行一次啊,大家看, 那我发现这个值实际上是随机的,他并没有达到咱们预期的效果,那这个就是咱们说的多县城操作这同一个 a 变量啊,那他就会产生问题。那我们现在呢,我们刚才说了,咱们里面有个锁,那我们把这个锁给它引进来,我们看一下怎么操作啊?那我们先建一个变量叫 lock lock 呢,让它等于这个 thread 呢?让它等于这个锁给它复制过去。那么我们再再看,我们说了这个锁呢,可以在这个 操作全距变亮之前呢,我们给它锁住,然后操作之后呢给它释放出来啊,来我们 lock 点 acquire, acquire 什么意思?它把后面的这部分这个操作要锁起来了,就是说我这个 lock acquire 开始的 之后啊,它这个所有的县城就不能再碰了啊,直到我这个县城结束之后,那我们大家看我们 lock acquire 锁完了以后呢,我们要及时给它释放掉啊,就是说把这个全局变量我们操作完了,我们用 lock release 给它释放掉, 那大家看,实际上就是这个中间这个操作全局变量这个过程我给它锁起来了,对吧?就是说同一时刻呢,只能有一个县城操作它, 好,这时候大家看我们再来运行一下,看看这个结果,那咱们发现没有,一百万、两百万、三百万、四百万、一千万,是不是大家看这个值呢?就是个确定的了,对吧?我们再来运行, 对吧?看我每次呢这个值呢都是确定的,我们实际上通过了加了一个锁,保证了这个县城是安全的。但是我们大家看我们使用这个锁呢,有个原则,尽量把少的和不耗时的代码放到锁里面, 那代码就是说运行完之后就要及时释放锁,如果我们这个锁的东西太多的话啊,那整个这个县城呢,他就会变得这个庞大,就不利于这个多县城同时进行运行啊。所以大家就注意这个原则啊,我们尽量把少的和不耗时的代码给它放到锁里面执行啊。好,这就是这一课内容啊,谢谢大家。 大家好,我是讲师潘瑞,这一课呢,给大家介绍一下咱们多县城开发中常见那种模式啊,叫生产者和消费者模式啊。 那这个生产者和消费者模式是什么意思呢?他实际上对咱们这些县城啊做了些分工啊,一部分县城呢,他专门用来生产数据,那另一部分县城呢,专门用来消费数据, 大家看就像工厂一样,一部分生产一些产品啊,那把它放到咱们这个容器里面,那消费者呢,从这个容器里面取起来,那经过这样分工呢,整个代码就变得比较清晰,便于维护啊,也提升了这个开发效率。那咱们对应到咱们爬虫里面是什么呢? 比如说啊,我们这个生产者呢,他专门产生这个要爬取的这个链接 u i l, 那 这个把这个 u i l 呢给它放到这个中间容器里面,那咱们这个消费者是什么呢?比如说一些下载程序啊,那他就不断地从这个容器里面取一些这个 u i l, 然后不断地这个 下载。那下面我给大家演示一个例子啊,让他更好地理解这个生产者和消费者模式啊。我们现在写一个生产者和消费者代码,那我们生产者做什么?他就是不断地产生这个,咱们叫产生钱啊,让他生产钱,实际上就是把这个 money 让他不断地相加,不断地相加啊, 那我们另外一个消费者做什么呢?就是让他把这个 money 给它消耗掉,就是不断的减,不断的减啊,那我们可以同时刨起多个现成啊,我们看看他们之间的这个相互作用, 我们先呢导入一下这个多现成的这个库啊, import, import threading, 是 吧?来,我们先写第一个啊,叫做这个生产者。生产者呢?大家看,我用累的方式来写啊,给它起个名字叫 producer, producer, 那让它做一个生产,那这个类大家看我们有利的方式写呢?我们之前说过,呃,可以继承这个 threading thread 之类啊,来我们继承一下 threading, 点儿 thread, 那 我们下面写一个函数啊,就叫 d f run, 那 我们就让它从这个函数自动开始运行啊, 那我就是说这个,我们这个生产者呢,让它不断的生产出来钱,所以大家看我们这边用个 y to 这种循环啊,用它无限循环生产这个钱是吧?来,我起个变量 money, 是吧? money, 那, 那看,那我让它产生的这个钱,这个金额,我们怎么说呢?就是我给它来个随机数,让它随机的按照一定范围内给它产生啊,那随机数产生随机数,咱们 python 呢,会导入这个 random 这个模块,它能产生这个呃随机数,我们让它产生一下随机数啊, random 点这个 random int, 那 实际上它产生一个整形的随机数,再看括号里面我们填两个变量,就是这个随机数的这个取值范围,那我给他取一个最小产生一百元, 最多产生五千元这个数字。然后呢我再定一个全聚变量的 total money 啊, total money, 让他把这个钱啊不断的加进去偷偷 money。 那 我们最开始呢,让它等于零元,那我给它要做成一个全句变量啊,大家看,我们要叫 global 声明一下,这样子我们才对它进行一个操作啊, put money 就是 加等于 这个 money 来看我们这个意思呢,就是我随机产生了个数字,然后加到这个 toto money 里面去吧。这时候呢,我们要打印一个提示啊,就是说谁谁谁赚了多少钱,对不对?这样子我们这个程序呢,跑起来我们就知道这个整个这个流程是什么样子的,那谁谁谁就是 赚了,嗯,多少钱呢?我们赚了这个,比如说这个 money 元,这个谁谁谁赚了多少 money 元呢?我们是希望把当前这个现成的打印出来就可以了,现成这个名字 spreading current thread 点内蒙,那这样子我们打印出这个 钱了,这个我们生产钱程序写好了,但是里面有个问题啊,这个 total money 是 个全局变量,它现在不断的在生产,那我们这边呢,待会还要写一个消费要给它进行减, 那这边又有加又有减,这样同时进行呢,它这个 total money 会乱掉啊,之前我们讲的有一个锁,我们要给它锁住啊,所以大家看我们把这个锁呢先给它呃,建立建个变量叫锁 lock, 等于这什么呢?就 threading 点 lock, 那 先声明一下这个锁,那我们在这个地方大家看,给它先上锁 lock, 点 acquire, 加完了这个钱之后呢,我们把这个 lock 再给它 release 掉,释放掉,我们不能一直占用这个锁,对吧?这样大家看,保证我在这个县城加这个钱的过程中没有其他这个呃县城的干扰, 对不对?要不然就会产生之前我们说那种错误嘛?我们现在大概我们写一下这个呃消费者叫 consumer, 是 吧? consumer, 然后我们还是继承一下这个 thread 的 这个 thread 类, 对吧?那么我们第一件事先给它写一个绕函数,对吧?那我们把这个 global 这个 total money 也给拿过来,对吧? 大家看啊,我们这个呃消费者呢,也要不断地进行消费,就是不断地给他减,对吧?所以呢大家看,我们还是要写一个无限循环, why true? 这时候呢,我们让他消费呢,我们就给他,让他也产生一个跟这个之前一样的随机数,是吧?那我们就是 money, 等于这个 random int, 那 我们就是要消费这一个随机数,是吧?就是也是一百到这个五千之间的一个随机数啊,我们现在随机产生了一个这个 随机数,是吧?这个是要减去的这个数值,但是减去这个数值呢?如果小于这个头寸 money 怎么办呢?所以呢,我们要给它做一个判断,如果大于我们才做,小于我们就不做这个事了啊。 if 这个头寸 money, 比如说这个呃大于等于这个 money, 对吧?那么我们这时候怎么办?我们就这个 total money 减等于这个 money, 我 们来打印一个提示啊,就说谁谁谁消费了多少元,消费了多少元,是吧?这个也是一个 money 元是吧? 那前面呢?也是这个 threading 是 吧?来看 threading current thread 的 name 这个县城消费多少元?那 else 来看 else 是 什么情况呢? else, 我 们这时候情况就是我们想消费这么多钱不够了,是吧?所以呢我们这边也要打印个提示啊,就是这个县城 threading 点 current thread, 点 name 等,看啊,那它是怎么样?呃,想消费呃 money 元 是吧?但是呃余额不足, 呃,只有呃,只有这 total money 跟钱是吧? total money, 我 们先注意一下啊, 我们这个过程呢,涉及到对这个全局变量的一个操作,对吧?实际上这个全局变量同时呢有很多个现成在操作,所以呢我们这边要加把锁给它锁住啊。 lock 点 acquire 是 吧?我们在操作这个呃 tooling 之前呢给它锁住,那我们在这个,嗯, 再把它操作完之后呢,我们给它释放掉,要不然整个程序就会停在这里面 release, 我 们现在呢一个生产一个消费,那么我们写一个内函数来调用它一下 for main, 好 好,大家看我们现在要做什么啊?就是说我们呢就是这个生产者呢,我想给他五个生产者,然后再来五个消费者,然后同时运行一下,来,我们看一下 for i in range 是 吧? in range, 呃 in range 五, 然后呢我们看我们第一个 teach 一 等于这个 producer, 对 吧?大家看我们直接调用这个类就可以了,是吧?它就会调用这个转函数,那么我想给它传入一个什么参数进去呢?大家看,我想把这个现成的名字给它放进去,这样子呢?我们就,呃方便这个识别,对吧? 那这个 name 然后等于给它编号,是吧?那这个 name, 大家看这个生产者,对吧?那我给他来个生产者几号 来个 t h 一 点儿 start, 我 们呢?这个消费者,我们也给它打开啊, for t 呃, in range 也是五吧,然后我们 t h 二等于这个 consumer, 对 吧?来看我们一样的啊, name 等于几号是吧? 我们这个是消费者,呃,消费者几号来看?我们把 t h r 也给它打开一下, t h r 点 start, 好, 我们再看。我们这个 main 函数写完了,我们给他写个接口,调用它一下,对吧? main 是 吧? main, 那 我们就调用一下 main, 好, 我们这边来看是 i 是 吧?那改成改成 t 啊, t t 个消费者,我们来运行一下,试一下, 大家看他这个消费者和生产者就开始不断的无限循环下去了,对吧?我们就看不到头,那我们先暂停一下,暂停一下, 这时候大家看我们要控制一下次数啊,这样我们可以看得清楚一点,那比如说我总共循环多少多少次,是吧?那么我们把这边呢循环多少次呢?我给它控制一个变量啊,叫 cycle cycle time, 是 吧?来看,比如说我总共循环十次,那么我们就要对这个循环次数呢做个判断啊,那,那我们这个循环的这个次数是什么? count 当前循环次数是第第零次,对,我们写这两个变量啊,那我们把这个这个 cycle time 是 个全句变量,对吧?要给它传进去啊? cycle time 来看,所以呢我们在这个运行之前呢,我们要给它判断一下这个循环次数,如果大于了 cycle time 就 整个退出,我们就不再生产了,是吧?那么呃,我要给它把这个 lock 点 release 掉,这个锁给它释放掉,对吧?因为大家看我们这个释放是在这个地方释放,你提前退出了,不释放的话这个程序会卡死在这里面。再打印一下,生产者已经完成工作了, 大家看我们每循环一次呢,这个 count 这个值呢?我们给它加一啊 count, count 加等于这个一啊,让它循环,那我们把这个大家看这个 count 加一,我们对实际上对它呃进行了一个操作,我们把这个 count 呢给它变成全句变量啊,叫 count。 那 么我们在这里面把这个这几个变量 count 放进去啊,我们消费者呢也给它一个退出机制, 就是如果这个生产者不再生产了,而且我已经消费完了,我们才做一个退出,是吧?这边是钱,如果大于它的话,那如果小于它的话,并且消费者不再生产了,这个循环次数,如果我们之前跟他说的大于这个 cycle time 就 循环次数,那么我们就给它做个退出,是吧?那我们这个锁呢,我们也给它提前释放掉 lock 例子一下, 那么我们这边呢,是不是也打印个提示啊?那我们看我们这边提示什么呢?就是这个欠城呢,想消费多少钱?但是生产者已经不再生产了,对吧?我们想来打一下这句话,我把这个话呢这个这一句呢拷贝过来,放在这里面 就生产者想消费多少元,就是说但是余额不足啊,并且生产者已经不生产了,并且生产者不再生产了,那我们这样子就给他加了一个,控制着这个次数啊,我们再来运行一下。 哎,大家看,我们看,这时候它实际上,呃,整个这个循环就结束了,速度很快,是吧?但是我们注意一下啊,前面一直是生产者零号在赚了多少多少钱, 是不是消费者零号它其他县城好像基本上就没有跑起来,那是因为我们这个循环次数太少,它这个县城跑的有点快啊。 那实际上大家看,我们为了让每个县城都有机会来做一下生产,做一下消费啊,我们可以加一下延迟啊,我们加个延迟,让它每个县城呢都有机会来分配到这些任务啊。来,我们加个 time 点儿 sleep, 休息个零点五秒我们再生产,是吧?那我们这边呢,消费者也是,我们也来加个 time 点 sleep, 零点五秒,好,我们这样子,咱们再再看一看啊,如大家这个生产者和消费者是不是每个县城都有机会参与啊?来,我们再次运行一下, 好,大家看啊,这时候生产者一二三四号都有机会在生产,消费者呢他也有机会来做消费, 是吧?最后大家看,消费者呢,就是说停的时候我都是余额不足,不再生产了,所以就退出了,是吧?大家看,这就是我们整个一个生产者和消费者这个模式啊, 这就是这一个内容啊,谢谢大家。大家好,我是讲师 perry, 这一课呢,给大家介绍一下 spreading condition, spreading condition 呢,跟我们之前介绍的 spreading lock 是 非常类似的, 它也有上锁和解锁功能,那它们之间的区别是什么?它多了一个叫 wait 状态,这个 wait 状态呢,它能将当前的县城呢处于等待状态,并且呢会释放锁, 这个释放掉这个锁以后呢其他的这个县城呢,可以使用 notify 或 notify all 函数啊,将我们这个 wait 状态给它唤醒,唤醒之后呢,它就会继续上锁,上完锁呢就会执行后面的代码, 那这样大家看我们加一个 wait 状态的好处是什么?就是让这个现成闲置的状态把 cpu 资源及时释放掉,这样子呢,可以提高多现成程序的这个性能。 大家看啊,这是我们上节课这个代码,那这个代码呢,其实啊我们还是可以做改进的,能继续提升它的性能啊,那在哪个地方可以做改进呢?大家看啊,那我们这边就是说在消费的时候啊,如果这个 total money 啊,大家看,如果它小于我们当前的这个 money, 就是 它就不能产生消费了, 对吧?这时候大家看我们后面又执行了这么一大段代码,对不对?其实这段代码呢是没必要执行的,我们呢就是说这时候呢,可以把这个锁啊及时给它释放掉,释放掉以后呢,我们呢等待,等待这个 token money 啊, 继续就是生产这些,生产出来一些钱啊,生产出来钱的时候,我们来判断这个,呃, total money 是 不是大于这个 money, 如果大于的话,我们及时上锁,然后我们再执行代码,这样子呢,我们可以提升这个整个这个代码的运行效率啊, 来我们看看这个代码如何改写啊?那我们大家看,我们首先呢把这段代码给它注视掉,我们把这一段呢重新给它重写一下,我之前我们用的 threading lock 类,是吧?这回呢,我们给它换成 threading condition。 好, sweating condition 的 用法跟这个 sweating log 是 非常类似的,只不过呢,我们说了它多了两个状态啊,那我们看一下这两个状态如何?就说实现啊,来我们在这个代码之后啊,继续来写啊,我们可以做一个判断, why total money 如果小于 money 的 话 怎么样?大家看,这时候呢,我们让它进入一个等待状态啊,等待状态 log 点 wait, 这个是什么意思啊?大家看,就是说如果我们这个消费的钱不够的话,我就把这个 cpu 这个锁啊,我就给它及时释放掉, 释放掉之后呢,它呢就会等待别人唤醒它,那怎么唤醒呢?大家看啊,唤醒呢,就是我们这边,比如说我们这个 total money 加 money 以后啊,它这个 total money 这个值产生变化了,是吧?那这个变化了之后呢,我们给他做一个通知啊,我们就给他写个 lock notify all, 那它就会通知所有等待的函数,对吧?得看我们通知完了,这个 lock wait 呢,它会跳出来,它会继续执行啊,那继续执行呢?我们看它实际上在这个循环之中,是吧?那它会继续来判断这个 total money 是 不是,呃,仍然小于这个 money, 如果不小于的话,它就会跳出这个循环,对吧?跳出这个循环的时候,呃,我们可以写这个 token money 减等于 money, 对 吧?我们这样子呢,我们可以继续执行啊,大家看在 lock wait 的 时候呢,它实际上把这个锁就已经释放掉了。 同样啊,大家看,如果在这个 token money 小 于 money 的 时候啊,我们实际上还是要做一个判断的, 我们要判断一下,就是说这个,呃,就是说这个当前的循环次数是不是已经超过了总共循环次数,是吧?如果没有超过的话,我们才进行这个 lock wait, 否则我们给它退出啊。 if 这个 count 是 不是大于这个 cycle time, 对 吧?如果大家看大于的话,我们把这份代码给它拷过来就执行直接执行这段代码, 对吧?然后呢我们把这个注式给它去掉, 如果它大于这个 cycle time 呢?我们这这边直接呢就让它退出,退出我们 why 是 不是我们之前用的是 break 啊? 大家看,但是我们发现没有这两个 why 我 们用 break 跳不出去了,对吧?所以呢,我们这边呢给它改成 return 呢,让它跳出整个函数就可以了。来看这个 token money 呢,它在消费完了以后,我们是不是把这个消费记录也要打印一下来,我们在这打印一下这个,把这段数字再考过来,我们再次运行一下, 那这样打开我们实际上就改造完了,来,我们再次运行一下看看。 好,大家看,实际上呢,我们这个呃就跟之前的代码就是一样了,只不过呢,我们就说这个性能呢,其实比那个之前的这个略好一点。大家看,我们来再回顾一下这节课, 这个 condition 这个版的生产版和消费者这个模式呢,它跟之前的区别在于呢,它多了一个 wait 啊,它可以就是说让程序更优啊,就说我们当前程序如果是闲置状态的话,我们及时把这个锁释放掉啊,当这个有了数据可以处理的时候,我们再让它唤醒, 唤醒之后呢,继续执行后面的代码,这样子呢,可以提升整个这个程序的性能啊,那我们看一下这里面的函数叫 acquire, 就是 吧 threading condition, acquire 上锁 release 解锁啊,跟之前的是一样的,只不过呢它还多了一个 note 和 notify, 那 就是这个 note 和 notify all, 它实际上大家看就是通知正在等待的现成啊。好,这就是这颗内容啊,谢谢大家。

你现在看到的是耗时三千七百八十个小时制作二零二六年全新 python 数据分析入门实战教学,全长一百七十个小时四十分钟,内容包含了软件安装使用、 panda, snmp、 matplot、 live 等知识点,零基础也能成为数分高手。今天我们讲解的是第五章节,如这期正则表达是上,其实把杠 n 和点如果真能融合到一起的话,你可以认为就无敌的存在好不好,什么都能匹配, 然后杠七表示一个制表符,这个也不聊了,好吧,兄弟们,这个也不聊了,这俩都都用的不多啊,然后尖角号和这个刀了符这俩玩意呢?如果你是写爬虫,说实话用处不多,但是如果你做这个这个这个教验,那他就有用,他就有用了啊,比方说来看,这 我在这块啊,比方说这个框框现在不是一个普通的框框,这个框框呢,要求你往里面输入的只能是一个电话号码,哎,只能是一个电话号码,那这个时候幺八六幺四五七零, 那好了,这是我电话号码。那么这个时候我如果说啊,在这块写个杠立啊,写杠立走,对不对?一共十一处匹配,那我判断出来了啊,这里面有十一个数字是没问题啊,对不对?应该是没问题的,但是 各位,哎,一个这是,这是一位是吧?一位我都,我都挪出来吧,两个,三个,四个,五个,六个,七个,八个,九个,十个十一个,对吧?一个杠的是一个数字,这不就十一个吗,对不对?哎,完美的匹配出来,但是今天有个问题,看好啊,我在前面加一 a, 哎,我在前面加一 a 来再匹配,是不还能匹配到?为什么?因为我这个东西跟跟我这个 a 后面这些数字正好完美的 契合起来了,对吧?我知道真的是能匹配到的,所以现在有一个问题,就是如果你这个地方要求必须只能输入电话号码,而我现在加了个字母 a, 很 明显在我们正常人的逻辑上这个不是个电话号码,对不对?而你还你还能让他通过,你还认为他是个电话号码,那这个就有问题, 对吧?你理你理一理啊,可能像绕口令一样,是吧?啊?你可以理一理,我这个地方你加了个 a, 对 吧?他还能正常匹配,那,那这就不对啊,这就不对,那怎么办呢?看着我在前面加上了一个这样的, 加上一个这样的,加上个,这玩意什么意思呢?表示开始开始之后,第一个出现的必须是数字, 第二个也得数数字,第三个也得是数字,一直到后面必须都是数字,并且只能有十一个数字来走,没有匹配,对吧?成功的规避了一个问题,对不对?那再往下, 再往下,我把它删掉,我把它删掉走,对吧?哎,又可以了,又可以了,前面的问题解决了,同样道理,你后面不还有问题,对吧?走,看他还能匹配,那也就说到最后一个数字之后,我不,我就,我就得停了,我就不能再有其他东西了。来 加上一刀了服,早他就没有匹配,你必须得是纯纯的一个电话号码才能通过这个匹配 啊,才能通过这个匹配。所以这个尖角号跟这个刀了服的作用就是开始和结束啊,开始什么什么什么东西,然后赶紧结束就没了,后面不允许有乱八七糟的东西。保证这个数据的安全性啊,安全性,所以这个是呃 开始跟结束的一个含义啊,他是比较重要的啊,如果你写的是表达验证的话,这个地方一定能用到,你要不写表达验证只是作为爬虫的话,这玩意其实用处不大啊。然后再往下是杠大 w, 杠大地科,杠大 s, 那 这仨玩意呢?各位就比较有意思, 这三个玩意呢就是就就就就,其实就是反意,反义词的意思,所有的大写就是反义词的意思。来,你演示一下你就明白了啊,比方说我看我能不能还原回我的那个那个电话号码啊,哎,对我,我对我的电话号码还是情有独钟的,哎,我现在写个杠 w 走数字字母下划线,对吧?就出来了。那我现在给他打 w 走,看啥?除了数字字母下划线是不都蹦出来了? 所以杠大 w 就 取反义的意思,杠大 d 除了数字全给我蹦出,那么那就就就,然后后面还有一个什么杠大 s 空,就是除了空白符以外的全能拿出来啊,这仨玩意也是我们用的,并不是很多。了解一下啊了解一下,然后这个 a 杠 d 就 这个很好理解。 来,我想匹配的电话号码有几个?两个吧,来幺零零幺零或者幺零零八六 走,哈哈,就或者的意思,或者的意思就是要么他,要么他,对吧?完美的匹配出来我们想要的东西了啊。完美的匹配出我们想要的东西了, 然后再往下啊,当然这不是最最佳答案啊这不是我们想要的最佳答案啊,因为我们这个电话号如果说改成幺零零零零了,你这玩意又傻了, 就看你这玩意又傻了。所以还是啊,就只是给各位讲解一下这个东西的含义啊。我们的结结论并不是他, 然后小括号,小括号呢,表示的是组,这个组啊,我们暂且不去讨论他啊,暂且不会不去讨论他,因为他想给他,想把他说明白的话,有一点点的复 杂,有一点点的复杂。然后咱们后面做爬虫的时候啊,这个括号呢,在拍摄里面还有一个特殊的含义,所以,呃,暂且咱们先不管他,好吧,暂且先不管他, 然后是这个中括号,哎,这个中括号它的含义呢?叫做字母组,叫做字母组来,什么意思?看看啊, 还是改成幺零零八六来。什么是字母组呢?来,中括号,来 s a abcdefg, 然后呢?零一二三四五,好了,我匹配走好了,幺零零,幺零出来了, a, 字母出来了,看啊, a 出来了,然后幺零零出来了,注意看啊,八六没了, 对吧?八六没了,还有什么呢?这个这个这个这个这个,呃, syl 这些都都没了, r 也没了,那么这个东西到底什么含义呢?就是 他这么长一串子来匹配这一个字啊,看这个字在这里面出没,出现,出现了就算一次,懂吧,那我没有的,没有电,没有,话,没有,以此类推,到了一,一在这有好了,一就出来了, 懂吧?一就匹配出来了。零零,这里面有来,零也出来了,不信看着我把这零去掉,走你, 你看,那没零,零就没了。所以这就是字母组的意思,就是你当前这一位啊,在这里面能不能出现,出现了就匹配,到,不出现那就不匹配,知道吧?那我现在有这么一个东西来考你,我现在想让你给我写个正格,能匹配数字和字母, 不包括那下划线,那我如果是数字字母下划线简单了,杠 w 就 完事了,对不对?那现在我只要数字和字母,那简单呢?零一二三四五六七八九 数字吧。字母呢? a, b, c, d, e, f, g, 是 不是写起来 h, i, j, k, l, m, n, 对 吧?那你这写起来的话,我估计你这手会有点难受,对不对?你你,你如果真的把这种东西交给你的项目经理,呃,估计会会打你啊,那怎么办呢?我们可以这样做, a 到 z, 大 a 到大 z, 对 吧?零到九啊,也就是说在这个中括号里边这个横线 它不再是原来的减减号的意思,它表示是谁到谁,小字母 a 到小字母 z, 大 字母 a 到大字母 z 以及零到九啊,是这么一个范围。来,各位,我们来试验一下。走,看着数字字母出来了,下划线没出来, 我想想把下划线加进去呢,就加呗。走,看数字字母下划线,这个不就是杠 w, 对吧?就是刚 w, 所以 我们用字母组,哎,有的时候可以把我们的呃,这个这个数据做一个简单的限定啊,简单的限定, ok, 那 这是字母组,然后还有这么一个玩意,在这个字母组里面最开头加上了一个这玩意 啊,加上了一个这玩意,这个玩意怎么开头?但是在这里面不是了啊,在这里面不是了,在这里面他表示的是非 就飞,就除了这里边的东西都行啊,除了这里面的东东,东西都行走,你看除了数字字母下划线都出来了,这是跟谁相对应?是不大 w 对 吧?跟那个大 w 是 一样,所以我们说这个字母组啊,或者说是,呃,就就就就就这些玩意其实可以用他们来 干嘛?来去替代啊,来去替代啊,当然这么多年我还没见过谁能把这个点拿他来替代啊,这这这神经病一样啊。那这是咱们对于常用的原字母,给各位去简单的去介绍一下,然后下一集咱们接着去聊量子 量词,因为时间有点长了,咱们下一节聊这个量词,那么各位先把这些东西去练一练啊,去练一练,当然让你一次性记住这些东西,你可能不大现实,但是最重要的点 w d 啊,点 w d, 还有这个这俩玩意也记一记吧,尖角和刀了啊,还有这个。

小伙伴们大家好,这节课呢,我们来看第三十五题,题目是牛牛翻开以前记录朋友信息的电话本,电话号码呢是几位数字之间用这个横杠来进行连接, 但其中呢,还有很多加了井号引导的注示,现在呢,牛牛想去掉这些注示, 你能用正则表达式的方法把电话号码直接取出来吗?输入描述是这样的,输入一个字母串,前半部分呢是电话号码,后半部分呢是井号引导的注,注中呢不会有数字信息,比如注后面是文字或者是字母都可以 输出描述是这样,第一行输出提取带有横杠的电话号码,然后第二行输出的全部都是数字的电话号码,这面呢给出了一个简单的示意, 呃,这个呢,就是原本我们要输入的信息,输出的话,一个是带杠的,一个是不带杠,全数字的,他是将后面这个给干掉了,井号后面整个的注是呢就给干掉了,所以如果他已经说了让我们用正则表达式来进行处理,那这里边一旦要处理的话,我们只需要去匹配数字和横杠就行了,是不是这个样子啊?好,那这个代码写起来就简单了, 来到我们的开发者工具当中,既然是正则,我们先把 r e 模块给引入进来,然后定义一个闷 while 函数,呃,返回值的话,我们就写一个 not。 好, 然后我们首先接受用户的输入吧, input, 判断一下用户输入的数据是否存在,如果 not 不 存在的话,我们直接 return 啊,就没必要了。如果存在的情况下,我们去通过正则去匹配他,那么正则怎么去匹配呢?首先 r e 点设置去查找,这里边其实就正则表达式了,对吧?因为我们看到他这个电话号码的格式前面都是数字和杠,我们只需要匹配数字和杠就行了,那么数字和杠怎么匹配呢? 我们用杠 d 来匹配数字,当然前面 是一个或多个,对吧?所以我们在后面加一个加号,代表一个和多个,那么加的要匹配的就是这个横杠了,那这个横杠怎么匹配呢?我们加一个括号,来一个问号,再来一个冒号横杠,这是匹配横杠的意思就是后面可以跟零个或多个横杠 啊,然后加一个或多个数字,那这一个和多个数字的话,我们来个杠 d, 这不就数字吗?那怎么匹配一个或多个呢?加个加号不就完事了吗?对不对?然后最后我们再跟个星号,那这句话的整体意思,我们在这里要加个注式吧。嗯,这样把我们这个注式拿过来,我就不自己不想写了啊。 好,我们把这个主食拿过来放这里,大家看啊,杠 d 加号就是代表一个或多个数字,杠 d 数字吗?加号代表贪来模,加号贪来模式一个或多个,对吧?然后问号、冒号、杠 斜,杠 d 加号后面跟个星号,后面可以跟零个或多次横杠加上一个或多个数字,比如杠二三,杠四五六,杠二三,杠四五六,对吧?整体匹配规则就是匹配一二三,匹配一二三,杠四五六,一二三,杠四五六,杠七八九,这样的一个编号格式,对不对?然后我们把结果呢给到 mark p c h, 然后我们判断一下 not much, 如果 much 不 存在,那我们直接 ret, 还是没必要处理了,就匹配,没匹配到数字,那就直接不处理了。如果匹配到数字呢?我们要从匹配结果的 much 里边 通过 group, g, r, o, u, p, 对 吧?通,哎, much 我们看一下啊,嗯,好,从 group 里边取出来,取出什么呢?取出完整匹配的字幕串,就整个那一段啊,然后我们将它保存在哪呢? for me, 对 吧?保存到这里可以吧?然后在这里边呢,我们再把那个横杠给去掉,这个其实就是,呃,把后面那个井号后面的注是给去掉了,对不对?我们再来一个去掉横杠的操作吧, only 就 全部都是数字对不对?那就是 format, formatted 点 replace, p, l, c, e, 把这个横杠全部置换成空字母串儿,哎,这样就完事了,对不对?然后我们再把它打印出来,打印的话我们直接 print, 首先打印这个, 然后我们再来来一个打印,打印谁呢?打印他对不对?好,这样的话对我们来说呢,其实就没啥问题了啊,当然呢,这里有个问题啊,你这个匹配规则中没写完呢,这后面写着急了,我们得把 date 扔进去啊,因为 内存不扔进去,哪来的数据做去做匹配啊?这里面是是是两个参数的,你可以看到第一个呢是正则表达式,第二个是你要匹配的字母串,对不对?你要把这个字母串给传进来,好,那这样的话就大功告成了,我们测试一下吧。 f, 我 们调用这个问函数运行好右键运行, 运行之后呢,我们就来到这边去复制一下这个内容,好吧,粘贴过来,回车你可以看到它的输出如我们所愿, 对不对?好,比如说我们自己也可以去写一个,那就是二零今年是二零二五,对吧?嗯,杠十二,杠十二,然后井号一个啊, hell 回车啊,没有任何问题,如我们所见,拿到了我们想要的数据,是不是? 好,那这个呢?我们就给大家说到这里了,这道题其实挺简单的,这个电话本的一个格式化,其实就用正在表达是。好,感谢各位聆听,咱们下节再见。

为了快速记忆正则表达式的语法规则,我整理制作了一份四定记忆框架,按照不同的作用,将正则表达式中的代码分为了四大类。 第一类叫定性,也就是定义字母的数据类型,比如杠 d 代表零至九中的任意一个数字,杠 w 代表字母数字或下划线中的任意单个字母等。 第二类叫定量,也就是定义字母的数量,比如用星号表示零个以上的,自服用加号表示一个以上的字母。 第三类叫定位,也就是定义字母在什么位置。第四类叫定向,也就是定义这些字母如何组合以及如何相互配合与控制,完成正则匹配。