粉丝9935获赞2.9万

一件刚发生的事,一个 python 库被投毒了,装上就能透光你机器上所有的密钥凭证钱包。连 carpathi 都亲自发帖警告,这个库叫 lightom github, 四万颗星,每月下载量九千五百万次,干什么用的?就一件事, 帮你统一调用各家大模型的 api。 openai cloud gemini, 用它一个接口就能全调通。三月二十四号,他在 pi 上的版本被攻击者替换了, 替换后的代码里藏了一套完整的窃取工具,只要你批派 install, 安装了一点八十二点七,或者一点八十二点八这两个版本,你的机器就开始系统性的泄露数据。它偷什么? s s h。 密钥, aws 和 g c p 和 ice 的 云凭证, kubernetis, 所有命名空间的 secret, 所有的 ev 文件,数据库密码,加密货币,钱包, s s l 私钥, c i c d 密钥,甚至你的 shell 操作历史。然后全部用 a e s 加密打包,用 r s a 公钥封装,发到攻击者控制的仿冒域名。更恐怖的是,一点八十二点八版本, 攻击者加了一个 t p e t 文件。 python 有 一个几乎没人注意的机制,放在 site packages 目录下的 p t h 文件,会在 python 解释器启动时自动执行。不需要你音炮的这个库, 不需要你调用任何函数,只要你的 python 环境装了这个版本,你跑任何 python 脚本都会在后台静默出发窃取。以前我们怎么理解软件依赖? 经典软件工程说依赖是积木,我们是在用积木盖金字塔,你用我的库,我用它的库,大家分工协助,效率极高。但这套逻辑有一个隐含前提,每块积木是可信的。这次攻击击穿的就是这个前提攻击者不是直接攻击雷特朗姆的代码仓库。他们先攻破了催尾一个漏洞扫描工具。 注意,这是一个安全工具,本来是用来保护你的垂位。被攻破后,攻击者拿到了 c i, c d 流水线里的凭证。 这些凭证又被用来偷 leitelme 的 拍 p i 发布令牌,然后攻击者直接往拍 p i 推带毒版本。整个攻击链是这样的, 安全工具被攻破。攻破安全工具拿到的凭证用来攻破 ai 工具。 ai 工具被攻破后窃取的凭证又变成下一次攻击的弹药。五天之内,同一个攻击组织 team p c p 横跨了五个生态系统, get up actions, doctor, hub, npm, open v s x 和 pi pi。 五十多个 npm 包被感染, checkmark's github action 被攻破,最终轮到 littlelam。 这不是限行攻击,这是指数级扩散,每偷一轮凭证就能解锁更多的项目。第一,你可能根本不知道自己装了 lightham。 你 pip install despise despite eli lightum 大 于等于一点六十四点零。如果你的 type 解析到了一点八十二点八,你就中招了两千多个包。 eli lightum 位子的数据显示, lightum 存在于百分之三十六的云环境中。你的依赖数有多深你看不见, 但每一层都可能被投毒。第二,攻击者只需要攻破信任链中最薄弱的一环,他们不需要找到你代码里的漏洞,不需要钓鱼你的账号,只需要攻破你依赖树深处某个维护者的 c i c d 凭证就够了。第三,被攻破后的修复成本极高, 你不能只是卸载 lightom 就 完事了。你必须假设所有凭证已经泄露,轮换所有密钥,审查所有在受影响环境中发布的产物,从已知安全的镜像重建系统。如果涉及 kuburnites, 还要排查横向扩散。第四, 发现这次攻击纯属意外,攻击者自己写了个 bug, 导致屁思文件触发了一个 fork bomb, 每次 python 启动都触发恶意代码,恶意代码又启动新的 python 进程,指数级 fork 直接把机器内存撑爆。如果没有这个 bug, 这次投毒可能好几周都不会被发现。 carpathi 说得直白, web coding 救了我们 攻击者歪不抠得了,这次攻击代码太粗糙才暴露了。 carpeasy 借这次事件重申了他的态度,他现在越来越倾向于不引入依赖,能用大模型直接生成的简单功能就让 ai 写,不要皮皮隐私到一棵你看不清楚的依赖树。这不是说所有依赖都不该用, 但他要求我们重新计算依赖的真实成本。以前我们只算开发效率,引入一个库能省多少代码,现在还要算安全风险, 你引入了多少你看不见的攻击面?对于开发者来说,几件事现在必须做锁定依赖版本用等于号,而不是大于等于号。 审计你的完整依赖链,而不只是你直接引入的包 c i c d 环境的权限要最小化,不要给构建流水线超出需要的权限。对于整个行业来说,这次攻击暴露的是一个结构性问题, 我们的依赖信任模型是上个时代设计的,但攻击手段已经是这个时代的了。最后总结,这次 lightom 投毒事件核心不是某个库有问题,而是我们整个软件依赖体系的信任模型有根本性缺陷。安全工具被攻破来攻击 ai 工具,攻击者写了个 bug 才被发现。 七十三个被盗账号,一百零二秒内发八十八条评论试图灭口。 capacity 说得对,供应链攻击是现代软件中最可怕的威胁。每次你 pick install, 你 引入的不只是代码,还有一整颗你看不见的信任树。这棵树的任何一个节点被攻破,都能递归导到你。如果你的环境有 layton, 现在就查版本。 一点八十二点六是最后一个干净的。如果装了一点八十二点七或一点八十二点八。假设所有凭证已泄露,立即。

同样是配一个拍照环境,有人刚点安装就看到几个 g 的 体积,有人只下载不到一百兆就能开工。差别往往不是电脑性能,而是你选的是 anaconda 还是 mini come。 先说结论,如果你不是特别需要一站式预装全家桶,大多数开发者现在更适合用 mini come, 因为它更轻更快,也更容易把环境控制在自己手里。 为什么 anaconda 越来越不受欢迎?第一是大,它自带很多科学计算和数据分析库,装完往往占掉几 gb。 第二是慢,首次安装慢,创建环境时依赖解析也容易在 solving environment 卡很久。 第三是浪费,很多新手以为欲装越多越省事,实际上,你可能只写爬虫做后端,或者跑一个简单脚本,却背上了一堆根本用不到的包。这些包不仅占空间,还会增加冲突和维护成本。 迷你看到的思路正好相反,他默认只给你最核心的东西, python 解释器、 compad 包管理器以及创建环境所需的基础能力。安装包通常不到一百兆,装好后也很干净。 这种轻量化的好处对新手其实特别明显。你需要什么就装什么。比如做深度学习再装 py torch, 做机器学习再装 psychic, 做数据分析再补 pandas 和 nump。 没有被预装全家桶绑定,也更容易理解每个环境里到底放了什么。 所以 minikadaw 很 适合这些场景。 wsl、 linux 虚拟机、轻薄本,或者你经常为不同项目来回创建环境的时候,这些场景共同在一三件事,占用低、部署快、环境干净可控。 再进阶一点,很多人会把 minikadaw 和 content forge 频道一起用,这样能拿到更丰富、更新也更积极的软件包。你可以按项目精准组合依赖,而不是先装一大包再慢慢删。 如果你做的是数据科学、网络爬虫优,我目标检测或者其他深度学习项目,真正应该先想的不是我是不是必须装 anaconda, 而是这个项目到底需要哪些包,哪些版本,要不要 gpu 支持,环境方案应该跟着项目走。 那 anaconda 还有没有位置?当然有。如果你就是想一装,就尽量带其常用库,或者在某些教学演示统一机器环境的场景里,它依然省事。只是对于大多数日常开发者来说,它已经不是默认最优解了。 一句话总结, anaconda 更像一整箱工具,适合想一次装全的人。 mini konda 更像一个轻便工具箱,按需取用。现在更值得推荐给大多数开发者的是 mini konda。

今天这份 j d, 我 直接帮你们扒干净岗位,叫 ai 应用工程师。你别被那一堆 rag agent、 prompt、 context engineering 这些词糊住,我先给你讲结论,这不是在招工程师,这是在招一个 ai 全能打工人加试验田负责人。 先说第一点,为什么这份 j d 写这么长这么全?因为公司自己也没想清楚他们写什么。从零到一,做原型,搭 r a g, 做 prompt, cool, 搞 agent, 做培训跟模型,你看着是不是很全面?我帮你翻译一下。公司现在没有成熟 ai 体系,也没有技术负责人, 他们想找一个人把这摊子事从零接起来,所以怎么办?把所有可能用到的技能全写上,赌一个什么都会一点的人。这种 j d 的 本质就是四个字,需求混乱。 第二点,这家公司真正想要你干嘛?我们逐条翻译,快速构建 ai 应用原型业务,天天来提需求,你自己接,自己做,自己扛, 从零到一,开发并移交工程化脏活你干,成果别人接,你基本没机会深耕,为业务团队提供培训,你不仅写代码,还得当讲师,客服、售后 跟踪、最新模型能力,没人给你方向,你自己试错,公司不背锅。总结一句话,他们要的不是工程师,是一个能自己打仗的 ai 项目部。第三点,你来了之后,真正必须干成的三件事是什么? 记住,不是 j d 写的那些花活,是你活不活得下去的核心。第一,你必须能独立搭一个完整的 r a g 系统,从数据清洗向量化剪辑到生成全链路,你得能跑通。第二, 你必须能用 devi 或 n 八 n 把 ai 流程自动化,公司不要 demo, 要能跑的东西。第三,你必须会算成本,不是技术问题,是钱的问题。什么时候用 gpt 四什么时候用便宜模型。你要自己判断一句话,花最少的钱,做最像样的效果。 第四点,我把这些黑话直接翻译给你听。 rag 知识库系统,做个能回答公司内部问题的机器人 context engineer, 想办法省钱,还别让 ai 太蠢。 prompt 库,写一堆模板,让业务复制粘贴,用 ai agent 工作流,用工具把多个 ai 步骤串起来自动干活。别再觉得这些词高级了,本质全是执行活。 最后我给你一句实话,这份工作适合什么人?喜欢折腾,不怕杂活,能自学能自驱能抗压的人,你会很快成长,但也会很累。

pyasa 爬虫教程第四集 beautiful subcool 的 使用 hello, 大家好,你知道什么是网络爬虫吗?这里说的爬虫可不是一条真的虫子,而是指模拟人类在浏览网站时,把有价值的信息自动保存下来的一种行为。 举个例子,假如我们想每天自动获取百度热搜的内容,手动打开网页复制太麻烦,但通过爬虫代码就可以做到批量的把热搜内容保存下来,完全不需要我们手动操作。那么网络爬虫是怎么做到的呢? 首先,我们需要先弄明白百度里的内容是如何出现在我们眼前的。当我们想在浏览器里查看百度时,在搜索框输入百度或者直接输入网址,这个过程就相当于我们人类通过浏览器向百度的服务器发起了一次请求, 服务器收到请求后,会把百度的原始网页内容,也就是 html 代码返回给浏览器,这些 html 代码经过浏览器的渲染,才变成了我们看到的那种图纹并茂、排版整齐的漂亮页面。 这就是我们人类在浏览器中访问网站时,浏览器和服务器之间做的事情。而网络爬虫呢,则是通过代码的方式,直接向服务器发起请求,获取到页面内容。因为没有浏览器的渲染,我们拿到的就只有最原始的 html 代码。 百度页面上的每一个字,每一张图片,其实都是由 html 代码中的标签来承载和展示的。所以如果我们想抓取对自己有用的信息,思路就很清晰了,只需要找到对应的标签,把里面的内容提取出来就行。 但 html 里的标签有成百上千种,如果一个个去找,那就太麻烦了,那怎么快速找到我们需要的标签呢?这个视频我们就来学习一个非常好用的库, beautiful soup。 大家可以把 beautiful soup 理解成一个过滤器, 它能够解析网页的原始内容,把 html 代码里的标签自动分门别类整理好。这样当我们想抓取热搜词条的时候,我们就只需要找到对应的标签就好了。 接下来我们就来看看怎么使用 beautiful soup cool beautiful soup cool 是 第三方库,需要在终端以命令的形式写下 pip install beautiful soup 四就可以完成下载和安装,安装好之后,我们就可以用它来解析 html 文件了。 在 python 里我们通常这样写,首先导入 request 库,使用 request 库中的 get 方法向百度网页发起请求。 为了防止服务器发现我们是爬虫而不返回正确数据,我们需要带上 headers 参数,伪装成浏览器发起请求,获取到响应之后呢,用 response 点 text 拿到网页的 html 代码。拿到了 html 代码之后,我们再导入 bs 库,使用 beautiful soup 库中的 beautiful soup 方法, 并且利用 html 解析器把原始的 html 代码中的标签都解析成一个个的标签对象。作为爬虫,我们其实不需要知道每个标签的具体作用,但我们一定要弄清楚 html 标签的结构, 在 html 里,大部分标签都是成组出现的,结构是这个样子的,想要抓取的数据就包裹在这个标签中间。 beautiful soup 的 解析器会仔细阅读整个 html 文件,把这些标签都整理归类好。现在我们来实际操作一下, 在浏览器中打开百度网页,右键点击检查,进入开发者工具。在这个窗口里,我们可以看到整个页面的 html 源码, 并且我们可以看到有很多箭括号包裹着元素,这些箭括号就是 html 标签。点击左上角的小箭头,然后把鼠标移动到页面上我们感兴趣的元素上。比如热搜里的一个词条,源代码就会跳转到 html 源码中的位置, 我们可以看到这个热搜词条是由一个 span 标签包裹起来的,其他的热搜词条也是由一个 span 标签包裹起来的。 那么我们想要查找热搜词条就只需要查找 span 标签就可以了,而解析器就会帮我们自动找到 html 文件中的所有 span 标签。使用 beautiful super cool 最常用的方法有两种,就是根据标签名来查找想要的元素,使用 find 或者 find all 方法, 在括号内写上你想要查找的标签名,记住标签名要使用引号标记起来。假设查找 d i v 标签,翻译方法只能够抓取 html 代码中第一个你想要查找的标签,而 find 方法可以查找 html 代码中所有的 d i v 标签, 这也是爬虫批量获取数据常用的方法。还是打开这个开发者模式,我们会发现在一个网页的 html 文件中,可能不同的内容都会使用相同名字的标签, 比如说这个热搜词条和上面的这个元素零都是使用 span 标签包裹起来的。而我们只想要抓取到热搜中的词条,我们应该怎么精确地查找到这个词条呢?每个 html 标签后面通常会带上一些属性,比如说 id 或者 class, 在 id 和 class 后面的值就相当于这个标签特有的名字,可以帮助我们更加精确地找到这个标签。 在我们来复制这个热搜词条特有的 class 名 title content title, 将 class 名也写到 find 或者 find all 方法中。 值得注意的是,因为 class 在 python 中是创建类的关键词,所以我们复制到这里查找标签时,需要在 class 后面加上下划线作为区分。这样 hot search 内就是我们刚刚抓取的 span 标签了。简单来说,爬虫的工作流程就是这个样子的, 使用 request cool 发起请求获得到响应的 html 文件,再使用 beautiful suite 内的解析器来解析 html 文件。 将每个 html 标签归类好,再使用 find 或者 find 方法搜索目标标签,并且从目标中提取到文本或者属性刚刚的代码。我们使用的是 find 方法抓取到了第一个热搜词条的内容。如果需要抓取页面中所有的热搜词条,就需要使用到 find 方法。 接下来我们通过练习来提取热搜上自己想要的信息吧。首先,我们必须在 pycharm 中的终端内下载好 beautiful soup cool, 在 终端中写下命令, piping store b s 四,然后按下回车键,直到出现这个 successfully, 那 么就表示我们已经安装成功了,在这里才可以使用上 beautiful soup cool。 想要抓取百度页面中所有的热搜词条,那么我们就需要使用到的是 find all 方法。在这里将我们刚刚复制过来的代码改为 find all。 然后我们再来运行一下这段代码。 大家可以看到我们可以抓取到这个对应的标签。想要获取到对应的内容,那么我们就需要使用到 for 循环,使用 element 代替列表中的元素,抓取每一个标签里面的内容。使用这个点 text 的 方法 写好之后,我们再来运行这段代码,大家就可以看到我们就成功抓取到了热搜上的词条。那么再点击看一下热搜词条, 可以看到热搜上的词条与我们抓取的是一致的,那么就说明我们已经成功抓取了百度中的热搜词条。 beautiful soup 就 像一个智能的文档分析助理,能够帮你将杂乱无章的 html 代码变成结构清晰,可以轻松获取信息的数据模型。 相信大家通过今天的学习已经掌握了 request cool 和 beautiful soup cool, 并且已经真正地掌握了爬虫的工作原理。你也可以用以上方法尝试来抓取你想要获取的内容。当然如果你有什么疑问也可以在这个评论区提出来,那么我们下个视频再见吧,拜拜!

想保护你的拍摄代码不被泄露,一个实用的方法就是将它转化成 c 代码,并编一层动态库,这样别人可以调你的功能,却看不到你的原始代码。 具体怎么做呢?只需要三步。第一步,准备拍摄模块,将你的核心代码写在一个点 pyx 文件中, 这是 c 编程的扩展文件。比如说你的模块叫 my model, 那 就保存为 my model, 点 pyx。 第二步, 边写边 e 配置文件,创建一个 set up 点 py 文件,内容如上,记得把模块名换成自己的。第三步, 编辑生成动态库,在终端中运行这个命令,这会将你的点 pyx 文件先转化成 c 代码,再编辑成动态库。完成之后,你就可以把生成的动态库文件提供给他人使用。 别人如何调用呢?他们只需要将动态库文件放在项目目录中,像导入普通拍摄模块一样,就可以正常调用里面的功能了,整个过程不需要看到你的原代码。

很多人刚开始学 python 做数据分析的时候,最先接触的往往是 pandas, 但是如果你越往后学一点,有会发现有一个名字会反复出现,就是 nmap。 很多人知道它很重要,但是不知道它到底是干嘛的,所以今天这条视频我来介绍一下 nmap 到底是什么,以及它有什么作用。 nmap 的 全称叫 numerical python, 就是 数值 python, 你 可以把它理解成 python 里面专门用来做数值计算的一整套工具,它最核心的东西叫做 nd error, 也就是多维数组。 如果说 python 原生的例子呢,也就是列表更像是一个普通的容器,那么 numpy 的 数值更像是一个专门为了做数值计算优化过的一个数值容器。 为什么 numpy 很 重要呢?原因很简单,因为很多数据分析科学计算机器学习的问题,它本质上都是数字的计算,比如说向量矩阵、均值翻叉、向量函数这些东西,它的计算都离不开高效的数值的支持,而 numpy 做的就是这件事。所以你表面上再用 pandas, 再用 sklearn, 但是它底层其实是 number 在 起作用,这也是为什么很多人会说 number 其实是 python 数据科学里面最基础的库之一。 number 像什么呢?你可以把 number 理解成一个专门用来处理数字矩阵的一个发动机, pandas 更像是一个表格处理工具, sklearn 的 话,它是一个机器学习的工具库,但这些工具一旦涉及到真正的计算的时候,底层就是用 number 来撑着。 做了这么多, number 到底能够做什么?它能做的事还蛮多的,当你入门的时候,其实可以先记住几个最常见的一个事, 第一个就是可以创建数组,比如说一维数组、二维数组,全零、全一等差数列、随机数值等等,这些很常见。然后第二类呢,是做数组的计算,比如说加减乘除、求和求平均值、最大值、最小值、标准差等等。第三个就是切片和,所以也就是说你怎么从一个大的数组里面挑选出你所需要的那部分数据。 第四个呢,就是矩阵和现代数的运算,这部分其实很重要,因为所有的机器学习模型和科学计算的一些工具涉及到计算的时候,它用到的都是矩阵 number, pad 呢,能够把矩阵的运算做的非常快,比 python 原生的那个 list 快 非常多,所以它就非常重要。 nanope 和普通的历史有什么差别?这个地方很关键,因为很多人刚学的时候会觉得拍摄里面已经有列表了,那为什么还要专门去写 nanope 呢?列表很通用,但它不适合高效的计算,它里面可以同时放数字,字不串对象,灵活性非常强。但是 nanope 数组更强调的是 同一种类型的数据按照规则整齐的放在一起,然后方便你一次性的做批量的计算。比如说你想要让一列数据同时加一 在列表里面,往往是要写循环的,但是 number 的 话,可以用一行代码直接完成它,这背后其实就是一个向量化计算的一个思路。为什么很多人学 number 会觉得非常的抽象,因为 number 处理的不是表格的故事,它是更贴近底层的一些数据结构和数学运算。 如果你本身非常熟悉 excel, 然后第一次看到多维数族、广播机制、矩阵运算这些概念其实是非常绕的。但是你要注意,你不一定一开始就要把 number pad 学的非常深,但是你最低的要求至少要知道它是干什么的,为什么很多 python 数据科学工具都离不开它? 我觉得对于大部分做数据分析的人来说,你不一定要把特别底层特别数学化的东西学的非常深, 但是你至少要掌握这些东西树主是怎么创建的,基本计算是怎么做的,锁影和切片是怎么用的,一些基本的炫普这些基本概念是什么意思,以及它跟 pandas 或者 sklearn 这些工具是什么关系。这样的话,如果你以后去看别人写的代码,或者让 ai 帮你生成一些代码, 你去看的时候还不至于完全闷掉,就不知道它写的是什么。所以如果让我用一句话来概括 number pad 的 话,它不是最花哨的那个库,但它很可能是拍摄数据分析和机器学习这个领域里面最底层也最基础的一个库。 你不一定每天要直接去写 number pad, 但是你只要继续往数据分析机器学习这个方向走,你迟早还是会碰到它的。所以我建议你先去了解一下它是干嘛的。

哎,大家好,这节课呀,我们讲一下库的调用啊,库,库的一个概念是在 python 里边很重要的一个概念啊,这个是我们不可缺少的, 哎,我们很多操作呢,都是在库的基础上进行的,那么库在使用之前呢,一定要先调用啊,调用,我们看这个库是怎么调用的。呃,首先呢,我们还是建立一个程序,我先写一个程序,大家看一下 啊,进入到拍摄系统里头后,然后我们新建一个文件啊,窗口,我们调整一下, 哎,我们写一个程序,这个程序呢是以前我们写过的啊,哎,就是在英文状态下有 r, 哎,我们看一下这个程序啊,这是在前面的课程里边我们出现过的 啊,这个程序呢,运行之后会出现一个正方形啊,我们 n f 五呢,运行一下哎,然后把它保存到 d 盘的 abc 文件夹下,哎,给它起一个名字啊,然后保存, 大家看这个运行结果呀,马上就出来了啊,出现一个正方形啊,正方形啊,在上次课我们遇到这种情况的时候,这条语句我让大家只是打出来,没有去解释,今天我们解释下这条语句什么意思,它就是调用库, 其中在这个里边这就是库的名字啊,这个库的名字为什么要调用这个库呢?因为这里边涉及到两个命令, f d 和 r t, 一个是前进,一个右转,这两个命令呢,都是这个库里边的啊,如果没有这个库的调用,没有这个库的支撑,那么这个程序是无法运行的,我们可以把这个整个程序全这一行语句全部删除掉, 我也可以在前面加上一个注视啊,大家知道注视就相当于这条语句不存在一样,那么在运行的时候呢,就会报错,我们看看一个效果, 大家看马上报错了啊,为什么会报错呢?就是在这里边我们没有调用这个库啊,所以这个库呢,一定要调用 啊,这是我们前面没有详细讲到的啊,那么我们看一下我们这边的操作啊,库的调用就是很多库啊,这个我们都要把它调用才能够使用的,那么这个就是调用库的命令啊,哎,前面都是固定写的,这里面是一个库 库名,因为我们用不同的库,所以这个名字是不同的,后面都是固定的啊,那么在这个里边呢,这个就是库名啊,这里边包含这两条命令啊,包含这两条命令 啊,这个是这样一种情况,那么调用库呢?我们还有一种情况啊,可以用这样一种方式来调用啊,我们看一下这个呢,我重新写一下, 这也是调用库啊,这也是调用库,那么这个调用的方式跟前一种方法是有区别的,我们先运行一下,看他会不会报错啊,我们运行一下, 大家看马上报错了,为什么会报错呢啊?因为在这个第二个调用的过程和第一个调用过程的 有一些不一致呢,我们看一下,在用这种方式调用库的时候,这是库名, 那么在每一个命令前面需要把这个库名写出来,那么我们就看再写一遍, t u r t l e 点啊,英文的点啊,表示这个命令是这个库里边的,因为这个写错了啊, t u r, 因为在后面的时候可能我们就忘记了这个命令是哪里来的啊,在这里边写出来呢,我们就会很清晰啊, t u r t l e, 点啊,英文的点,那么也就说这种调用的方式呢,需要把这个库名写出来,我们再运行, 那大家看这个程序就正常运行了,但是这个库名呢,因为比较长啊,你要觉得很麻烦的话,而且要不停的写的话,我们可以打别的字母来替代一下啊。举一个例子,在这里面往后面加一个 a s, 然后随便写几个字母就可以了啊,就是缩写,比如说我们写一个 tu 啊, tu, 那 么这个 tu 呢,就可以代替这个库名,那么在这个里边我就没有必要写这么长了啊,我只要写一个 tu 就 可以了啊, 这个里边呢也会写一个 tu, 大家看我程序运行 啊,是没有问题的,是正确的啊,这就是我们今天所要讲的内容,我们总结一下啊,在我们拍子里边大量会涉及到一些库啊,这个库在使用之前一定要调用,我们讲了两种调用方式 啊,我们提倡大家呢,初期呢先用第一种方式,因为他比较简洁啊,你照这个写就可以了,但是我们发现很多程序员在写的时候,他们习惯用这种方式调用啊,这种方式调用呢, 区别在于在使用命令的时候要把这个库名写出来啊,就是写出来用一个点隔开啊,点隔开,如果你要觉得这个库名很长的话,你可以加这样一个说明啊,说明在后期就可以 哎,很简洁的写出来了,这种情况我们是大量见到的,所以这是很重要的一个概念啊,库的调用 同样这些呢,需要你亲自动手完成才可以啊,你要自己体会啊,否则的话呢就没有任何意义。这是我们今天的所有内容,我们结束。

大家好,今天教你们 cc 微酷慢慢看着剪贴板抄。十秒钟后讲知识点, 这行代码的意思是打开 csb, 并将里面的那内容转化为列表,因为我没文件,所以我就不执行了。 还是十秒钟后降知识点,其实这行代码的意思是将 csv 里面的数字转化为列表。 依旧还是十秒钟后降知识点, 其实这行代码的意思是用 csv 把列表写进去, 这个不用等待了,这个就是用 pandas 创建一个空白的 csv。 好 了,这就是本期 csv 库的内容,你学会了吗?

今天给大家带来的是派森自制俄罗斯方块,好同学们,今天呢我们来分享一个小游戏的制作,那俄罗斯方块这个小游戏的话,相信大家都有玩到过,对吧?那我们今天呢来用派森去搭建一个俄罗斯方块小游戏 啊,那这里呢,我们第一步先来搭建我们整体的游戏界面,那这里我们搭建游戏界面用到的呢是 ticking 这一个第三方库,它呢通过 tiktok 方法能够创建一个窗口出来,我们来运行一下,看一下效果。 ok, 那 这里呢我们可以看到它生成了一个比较小的键面,对吧?现在这个界面里面什么东西都没有,还是个空白状态,那我们接下来来将这个界面填充完整, 那这里我们俄罗斯方块的界面呢?大家应该都玩过,知道它是用一个格子,一个格子进行一个搭建的,对吧?那我们这里要画格子的话,就得用到 tikinata 里面的 comworks 功能, cos 功能,可以去帮我们绘制单个格子。那这里我们先给整个界面做一个全局的设置,我们一共要有多少行多少列,对吧?然后每一个格子它大小给它规定好,最后呢我们就可以得到整个界面的一个高和宽。 啊,那接下来呢,我们就可以通过这个 t k 点 com 去创建我们一个定高定宽的这一个界面 啊,那中间的这一些格子我们怎么去画呢?我们看到这两个函数,我们通过 x 零 y 零呢去记录我们一个格子的左上角位置, x 一 y 呢去记录一个格子的右下角位置, 通过对角的形式呢去规定好我们的这一个格子所在的位置,然后通过我们 comis 点 create 的 方法呢,去创建构建我们单个格子啊, 啊,这里的几个参数,我们前面的坐标,对吧?然后我们填充色以及我们的边框颜色,边框的一个宽度啊, 设置好之后呢,因为是单个格子,那整个界面多个格子,对吧?那我们就用双重的一个负循环去调用我们单个格子的一个构建,最终就能够得到我们最后的这一个界面了啊, 我们来运行一下看下效果啊,那这里的游戏界面我们做好之后,那接着我们来做我们的游戏道具,也就是我们俄罗斯方块中的方块 啊,方块的一个做法呢,我们来看一下。首先我们可以通过两个字典呢去记录我们方块的一个坐标,以及它对应的填充色,这里我们通过第一个字典设置一个 o 来记录我们的这一个 坐标啊,那这里一共有四个坐标,对吧?那这四个坐标呢,其实代表的是我们正方形的四个方块所在的一个位置啊,然后它的填充色呢?我们给它设置的是 blue 啊,这里我们设置好之后,我们就可以通过我们的函数这里的逻辑去进行一个构建了, 那我们首先去获取到我们字典中它的一个坐标以及它的一个颜色啊,然后我们通过这里的 判断呢,判断一下我们构建的一个位置,也就是我们设置的这个坐标,它是在哪一个位置的?是否在我们游戏界面之中,这里我们通过这里的相对坐标去改成一个绝对坐标啊,然后判断好之后呢,去调用我们的一个构建函数 啊,这里构建函数的话,其实就是我们刚刚单个方格的一个会制啊。嘿,那这里我们来运行一下,看下效果 啊,可以很明显看到我们在这个位置去绘制了一个正方形的一个俄罗斯方块,对吧?那这是我们正方形俄罗斯方块的一个绘制,那其他的正其他的图形呢?我们就是在这里去设置好他其他图形的一个坐标以及填充颜色就可以了,那这里我们来运行一下 啊,那所有的图形都已经出来了,对不对啊? 图形有了之后呢,那么我们接下来去做一下他下坠的一个动画,那下坠的动画这一种东西呢?动画他是在我们计算机中其实是多个 图像来组成的多个定格图像呢,通过我们固定的一个时间去进行一个刷新,然后得到我们最终的一个频率啊,这里给到的是一个五百毫秒的一个样子啊, 然后我们去做相对应的一个位置的变化,生成新的这一个地方啊,新的这个动画,那这里我们通过这呢,通过这里我们拿到我们要下坠的这一个方块,他所有的这一个类型以及颜色,什么位置之类的一个东西 啊,拿到之后呢,我们去生成一个最原始的路径,也就是生成我们最原始的一个动画, 生成完元素动画之后,我们再通过更改它的一个坐标去生成新的一个动画,那这里我们生成了两个动画之后呢,我们再去进行一个移动 啊,边移动的过程中我们就边做一个图像的刷新,最终就会形成我们下坠的这一个动画,我们来运行看下效果啊,可以看到现在这个正方形它正在以每一格一格的进行一个下坠,对吧? 啊?但是呢下坠到我们最底下之后,他超出了我们的一个界面,对吧?那么我们接下来呢就将他的这一个呃下坠过程去做一个判断,让他呢能够在下坠到我们边界的时候去暂停一个下坠。啊, 那这里我们通过这啊,我们通过这个 check 模拟方法去设置啊,我们通过这里呢去设置他的一个下坠方向,哎,通过这种下坠方向的一个控制,然后去做他的坐标的一个判断, 如果说他的坐标超出了我们下面的这一个边界,那么我们就把它固定在边界上。啊,那, 那这里除了边界以外呢,我们还会有一个东西是我们这个方块它的一个坐标, 那方块它在固定在边界之后呢,我们其他方块在方块之上的话,它也需要暂停,对吧?所以我们这里呢会有一个 broker list 去保存我们所有的方块信息。那如果我们的方块在下坠的过程中,他的坐标大于我们这个历史的列表里面其他方块的一个坐标,那他也需要暂停,对吧?啊?那这里我们来运行一下看效果 啊,这里我们不同的方块一直在下落,对吧?最终呢每一个方块都是在做一个叠加效果,对不对?虽然这个地方我们还没处理好。啊? 啊?这是我们方块下坠动画的一个制作,那动画制作好之后,我们现在来做一下我们的操作, 我们的方块除了下坠直接下坠以外,我们还可以控制它左右的一个移动,对吧?那这里我们想要控制方块左右移动的话,要通过我们 combs 里面的必要的方法去绑定我们的事件, 在这里我们通过按键是按左边呢还是右边呢?去绑定好它移动的方向就可以了啊? 啊?这里我们看一下移动它怎么去写的,控制方向怎么去写的,我们这里呢有一个 呃,有一个变量去记录了他向下的一个向下的一个方向,对吧?那如果说我们这一个事件是按的左键的话,那他将 x 轴的方向呢?从零去变成负一,因为我们 x 轴向左是负轴,对吧? 那向右的话就把 x 轴改成一就可以了,那这样我们就能够去控制我们的这个方块,它下坠的过程中呢,还往左边还是往右边进行一个移动,那这里呢,我们来运行一下看看效果啊, 这里是不是可以正常的左右去移动我们的方块啦? ok, 左右移动我们做完之后呢,我们的方块是不是还应该能够变化,对吧?我们正常玩俄罗斯方块的时候,按上键我们的方块就能够去转换它的一个形状,方便我们去完成对应的一个操作,对吧? 还有呢,按我们的下键它能够去进行一个快速下坠的情况,那这里我们同样的通过并的去绑定事件就可以啦。 那这里我们看一下他的变化逻辑啊,他这里的变化逻辑呢?其实也很简单,就是去把我们的这个坐标进行一个更改啊,那下坠的也一样,去往去快速的让他下坠到我们的最后一行就可以了。好,这里我们来运行一下,看下效果 啊,变化是不是能够做到了,然后快速下坠是不是也可以了? ok 啊,那这里下坠什么的我们都做完了之后呢,那最终我们还有一个游戏的 一个结果,以及我们满足一行之后,他能够自然消除的一个状态,对吧?那我们来看一下第十步,第十步这里呢,我们想要去计算游戏结果的话,其实很简单,利用到我们拍省中的累加器,设置一个变量去进行我们的使用就可以了。 那这里我们来看一下 check and clear 这个函数,这个函数呢就是去判断我们一行的这一个方块是否满了,满了的话就进行消除,消除的过程中呢,我们去做一个,哎,这一个累加器的增加就可以了。好 啊,这里我们增加好之后呢,还一个游戏结束需要做,对吧?那如果说我们的行数啊,它超过了这一个顶部的时候呢,我们就需要去做一个哎 这一个成绩的弹出,用一个新界面让我们看到成绩是什么样的,这里我们用 checkmark 这一个去判断好我们当前这个方块所在的一个位置,如果超过了我们最上面的这个情况呢,那我们就去弹出这样的一个 欸窗口,通过 ma messagebox 去进行一个窗口的弹出,让它提示我们一共得到了哪些信息。好,这里我们来运行一下。欸 啊,消除是正常的对吧?那我们看一下它能不能结束 啊,结束之后是不是弹出了一个成绩窗口,对吧?那这就是我们今天分享的这一个俄罗斯方块小游戏的一个构建,那么下次再见了。

前面咱们用 url nib 写了一个最基础的爬送协议, url nib 是 编程的内置库,它对于 url 的 处理、请求头的处理都比较麻烦。所以这节课我们换一个第三方库叫 requests, 他做的事情和 url 一 样,也是发请求,拿响应,只不过他把很多繁琐的细节都帮你封装好了,用它发请求代码更简洁,逻辑也更清晰。由于是第三方库,所以要先安装在终端里执行。 pip in store requests 在 python 里面也提供了终端是一样的。 pip 的 基本用法在 python 这个文档里我都做好了笔记,你可以参考一下。 这里需要注意,我们安装 python 的 时候已经配置好了国内镜像源,所以直接安装速度就会很快,如果你没有配镜像源,国内安装就会很慢, 一般都会出现一大片红色的报错提示, timeout 表示网络超时,这时候就需要在安装命令后面用杠 i 指定一个镜像地址,让这次安装走镜像源我已经配好了,就直接安装。当你看到终端里出现 successful 之类的提示,就说明安装成功了。 如果你想再确认一下,可以用 keep show requests, 就 可以看到当前环境里 requests 的 相关信息。版本是二点三,二点五,我这里因为之前装过,所以再次安装,显示的是 requirement already satisfied, 意思是 request 已经存在了,在这个路径下,版本二点三,二点五, 你会发现下面还有好几个 requirement already satisfied。 这个叫 charsetemonizer, 它是做编码相关处理的,后面写了一个 from requests, 说明 requests 要依赖这个库,所以安装 request 的 时候, people 会顺着依赖关系把它需要的库一起安装。下面还依赖了一些其它地方库, pipp 都会自动装好,但这里要特别注意,也是新手最容易踩的坑之一,叫依赖冲突。在真实场景下,你电脑上可能已经装过一些其他库,这些库的依赖有可能和我们现在安装的库,比如 request 的 依赖产生重叠。我们可以用 pipp list 来查看当前的拍摄环境。安装的所有第三方库 可以看到有这么多,很多都是我们之前用去 pad 的 时候自动安装的依赖。现在假设去 pad 依赖 u 二幺 lib 三,或者我们自己安装过 u 二幺 lib 三,而 requests 也依赖它。你注意看这里,它写了一个小于三,大于等于一点二。一点一 意思是当前这个 request 版本只兼容这个版本范围内的 u 二、 lib 三。如果你电脑里已有 u 二幺 lib 三,版本不在这个范围,比如低于一点二一,就可能出现问题。 p 不 会提示版本不兼容或者安装成功了,但运行的时候可能报错,不支持。我们这里提示 requirement already satisfied, 就 说明依赖存在,且版本符合要求,就直接赋用了。如果你在安装第三方库时看到版本警告或冲突提示,就需要用虚拟环境来把这些依赖问题隔离开。 虚拟环境就是把你安装的拍摄环境单独复制一份,里面的包版本和全剧的拍摄环境互不影响。现在我们右键运行这个拍摄代码, 你注意看运行结果的第一行,它用的是我们派烟雾安装到全聚的派生解释器来执行这个代码,最后我们在终端用派生执行它是一样的。 现在我们来演示一下怎么使用虚拟环境,顺便在虚拟环境里来演示一下异来重吐。在终端敲一个派生杠, m v v 后面写虚拟环境的存放路径,比如我就存放在当前目录下的点 v v 里面,敲回车,这里就多了一个点 v v。 文件夹 屏里面就可以看到有 peep, 有 拍摄,这就是我们复制的一份拍摄环境。这里要注意这个虚拟环境文件夹不要去动它,之前看到有些同学居然在它里面创建拍摄文件,把自己的代码写到这里面来,一定不要这么干,环境和项目代码要区分开, 由于没有给这个解释器配置环境变量,要使用它就只能找到具体的解释器路径,然后执行代码。 除此之外,你会看到并目录里还有一个 activate, 它是用来激活虚拟环境的脚本。在 mac 上我们需要用 source 执行它,这样就会修改当前终端的环境变量。如果是 windows, 则直接执行 scripts 下的 activate。 看到前面出现了一个小括号,括号里写的就是我们创建的虚拟环境名字,也就是这个文件夹的名字, mac 也是一样的,这就表示我们激活了这个虚拟环境。来看一下 publist, 可以 看到很干净,没有任何第三方库,现在我们就来复现一次依赖冲突。 先在全剧环境里来看一下 request 的 依赖情况,安装的版本是二点三,二点五,依赖的 u r 有 label 三要大于等于一点二,一点一, ok, 那 我们就在这个虚拟环境安装一个小于一点二,一点一, ok, 那 我们就在这种有比较符号的,需要用引号引起来。 再来看 people list, 就 多了一个 u r 幺 幺 三,只有它一个,说明它没有依赖其他第三防护。现在我们再来安装 requests, 等于二点三,二点五, 看似成功了,对吧?但你仔细看,它说发现了一个 u r 幺 三,一点二零,接着把它卸载了,卸载成功,然后重新安装了这些 u r 幺 幺 三,变成了二点六二 request 只是安装成功了,但如果我们其他的项目依赖的是旧版本的 u r 幺 幺 三,那旧代码肯定就跑不起来了。 虚拟环境就是解决这个问题的,我们一般会给每一个项目都创建一个自己的虚拟环境,避免出现依赖冲突。 当然你可能会想,如果同一个项目里多个第三方库之间出现了依赖冲突咋办?那你就只能协调版本,把某些库降级,达到兼容的目的。项目调试好之后,我们可以敲一个 pip freeze, 就 可以列出当前环境所有第三方库版本。 接着我们加一个大于号,这就是为什么我们前面说比较条件要用引号引起来,因为大于小于在终端有重定向的作用,它的作用就是把当前这个命令结果从定向到其他地方,比如我从定向到一个新的文件 requirements, 点 txt。 回车,这里就多了一个文件, 里面就记录了当前环境用到的第三方库版本。这样的话,别人拿到我的项目,他自己创建一个虚拟环境,然后 pip install 杠 r 读取 requirements, 点 txt, 这样就可以安装和我们一样的第三方库版本。如果要退出虚拟环境,你直接把终端关了就行,或者敲命令 deactivate。

首先解释一下这几个都是干什么用的,这两个是派送官网下载的,左边这个是编辑器,用来写代码,然后右边这个是个管理器,如果我下载了很多种版本的派送的话,就可以用这个来管理。 pason 的 解释器,它是没有前端图标的,是用来运行代码的。然后这些就相当于是最基础的工具,相当于一个空房子,如果你要喝水的话,你就要买水杯,你要睡觉的话就需要买床, 然后如果你要进行数据清理什么工作,就需要。呃,自己输入代码下载库就比较麻烦。现在呢,有一个更方便的就是这个 icloud, 简单来说,这个东西就相当于 python 的 解释器,然后和你需要下载的一堆酷的组合包, 就相当于是一个有水杯,有柜子有床的屋子。然后嗯,你想做什么工作,直接调用就可以。 这个拍叉是一个编辑器,它和初使的这个,它和这个官网下载的编辑器是一样的,但它就是比较高级,可以识别出你写的代码的错误,然后也比较方便管理吧。 但是你用这个写完了代码还需要运行,这个时候就需要 python 的 解释器,然后我们以这个,嗯, python 为例,我们先把它打开。 呃,我们写完这个代码之后,需要 python 解释器来运行。 然后刚才不是说 python 官网下载的是有一个解释器的,但是就是你可以用这个,可以用 pycharm 写完之后,然后是用那个的解释器, 但是它就比较麻烦,就是你需要输入代码,你下载它的一些库。然后我们现在为了方便用 anaconda 里的 python 解释器, 就相当于直接给你一个有水有杯子的,就那种精装房,然后接下来你就可以进行一些喝水啊,睡觉流程。然后以上就是差不多是环境配置的一些东西,然后现在以这个拍叉为例,做一个数据清洗的工作。 首先我们新建一个项目,嗯,新建项目,然后这里就是你新建的项目的位置,你可以找一个方便的地方,你可以把它新建到桌面上, 可以打开,然后这个就是你建好的位置,然后这里就是,嗯,你要用 拍摄原本那个很基础的那个解释器,还是你要用 anaconda 的 那个环境,这里我选的这里就是 anaconda, 因为我已经下载好了,就这个嘛,然后它就可以自己去识别的在这里,或者你这个是原本的那个, 然后就是, ok, 创建就可以,我已经创建好了,就是在这里的这个,嗯, 这个,这个是我创建好的,然后我们在这个项目里面创建 python 文件,然后新建一个,嗯, amazon 吧, ok, 然后现在我们就建好了,现在就开始写代码就行,但是不会写代码怎么办呢?这时候就用 ai, 这个是我给 ai 的 一个命令,然后我们给他, ok, 这个是 ai 生成的代码,我们直接复制,然后粘贴。现在呢我们还需要改动一个地方,就是这里我们需要,我们需要把这里替换成我们需要处理的那个文件的名字。 首先这个是我需要处理的文件,这个文件要和我们刚才新建的 python 文件放在同一个文件夹里,也就是我们新建的这个项目的文件夹,把它直接拖进来。 ok, 然后我们,嗯,直接复制这个名字, 可以,然后我们看这边是有一个对号的说明,就是它大体上是没有错误的,现在直接运行, ok, 我 们现在可以看到它已经运行完成,完成了,然后它这个输出的数据就是在呃,我们这个文件夹里边 可以来看一眼这个二零零零二零一零二零一九,然后以及总的, ok。

picasa 爬虫教程第十二集 b s 四库的使用教程你是不是想快速地从众多网页中批量地下载想要的数据呢? 使用正则表达式的方法筛选想要的数据,语法又复杂又繁琐,那么这个视频我们来学习一个更加高效的方法, beautiful soup 四。在我们学习 beautiful soup 四之前,我们先来搞清楚一个问题, 网站中的这些数据到底是怎么在浏览器中显现出来的呢?当我们打开一个网页,按下 f 十二键,就可以看到网页的 html 代码了,那么我们试试看,点击这个小鼠标按钮, 将鼠标移动到网页中的任意位置,可以看到 html 代码也跟着发生了变化。 没错,这些 html 就是 网页中的原始代码,浏览器就是根据它们把页面渲染出来的。而我们的爬虫程序只需要通过 request 库发起一个简单的 get 请求,就可以拿到这样的原始代码。 但是问题来了,爬虫程序得到这样的代码是没有经过任何的筛选的,里面掺杂着一些我们根本就看不懂的标签样式和脚本等等等等。如果我们想要找到特定的数据,例如我想要找到这本书的名字, 从整个页面中找到他们,完全就像大海捞针一样困难。那么我们如何快速的找到自己想要查找的数据呢?细心的同学就会发现,在网页中我们使用这个小箭头符号点击我们想要查找的数据, 就会发现对应的内容都被一个千括号包裹了起来。我们称这样的一组千括号叫做标签,这些标签就像是一个个的容器,它具体长这个样子主要由开始标签和结束标签组合起来。 在标签里面通常有属性,常见的属性有 i, e 和 plus, 而我们想要的数据就包裹在这个标签里面。 那么想要从这么多 html 文档中筛选出我们想要的数据,我们就需要借助到这个好用的第三方库 beautiful soup 四了。 beautiful soup 库就像是一个过滤器,它能够将网页中的叉 mail 或者 html 代码 解析成为一个个的单个标签。我们只需要找到单个标签,并且获取里面的元素内容,就可以获得我们想要的数据。想要在代码中使用 beautiful super cool, 那 么我们就需要先引用上 beautiful super cool。 如果想要将这些代码解析成一个个的标签的话,那么我们就需要使用到这样一个代码。使用解析器将原本获得的 html 代码解析成一个个的 html 标签, 使用获得的这个缩不对象就能够精准地查找标签。由此,缩库里面有两个核心的方法,第一个,这个方法 可以查找 html 文件中第一个对应的标签,第二个没脑的方法会查找 html 文件中所有对应的标签。这个方法也是批量爬取数据的关键。 使用这两种方法,我们可以通过标签名来查找想要查找的标签。将想要查找的标签名放到括号内即可。要注意的是,括号内的标签名我们需要使用双引号标注起来。 另外,除了通过标签名我们能够查找到标签之外,我们还可以使用属性来查找标签,例如常见的 id 属性或者 class 属性。 值得注意的是,因为 class 属性与定义类的关键词 class 重名了,所以呢我们一般会加上一个下划线作为标注,防止在 python 中与关键词冲突。 那么除了 find 和 find 二方法之外,另一个 beautiful supercool 里面的核心方法就是 select one 和 select 方法, 同样的使用方式是使用双引号将标签名标注起来,不同之处就是在属性值上它的写法更加方便,如果是 id 属性,我们可以直接用引号键来表示,后面只需要写上 id 的 值。 如果是 class 属性,也不用担心与 class 关键词冲突,只要使用点就可以了。那么通过使用这样的方式,除了更方便查找标签之外,它也能够让我们更加精确的找到标签。比如说在标签与标签之间存在两种关系, 第一种关系就是两个标签之间为同级标签,每个标签内都有属于自己的元素。而另一种在网页中与见不鲜的情况就是在一个标签内嵌套上另一个标签,在内层标签才有元素的内容。 如果我们想要查找的内容,就只能够通过上级标签再到下级标签的方式,中间我们使用这个大于符号来连接。 那么讲到了如何查找标签之后,我们再来看如何查找标签类的文本。如果我们想要查找标签类的元素,也就是网页内容,我们可以使用点 test 方法就可以获得网站中的元素或者网页内容。那种情况就是像这个 a 标签, a 标签是一个超文本标签,如果我们在网页中碰到了 a 标签的元素,一般可以跳转到另外的网址,那么我们想要获得新的网址,就可以使用点 get 属性加上属性的名字, 那么练习时间我们来看如何使用 beautiful 速不酷来抓取网页中的信息。练习时间呢?我们来抓取这个小说,网站中的小说,我们可以随便点击一本自己感兴趣的小说,点击进去之后呢,我们就抓取对应页面中的小说即可, 在这里今天我们抓取的就是这本小说中的内容。首先我们来看当我们作为人类在浏览器中浏览这个小说,浏览器会做出一些什么反应呢?首先我们点开这个第一张,可以看到本身我的这个网址是这个样子的, 点击进去之后网址就发生了变化,那么点击第二张我们再来看会不会发生变化呢?同样也发生了变化,所以我们想要抓取这本小说中所有的小说内容,我们就需要抓取对应章节的对应网址, 那么如何获取对应章节的对应网址呢?首先我们可以打开这个检查,打开开发手模式,我们使用这个小箭头,然后将小箭头移到这个上面, 可以看到在这里网站用了一个 a 标签,也就是一个超链接标签,我们点击到这个和服属性里面,就直接跳转到了这一页, 而第二章它也是这样子的,由此我们可以得到在这个 a 标签中的和服属性就是会跳转到对应章节中的网址,那么在获取这个 a 标签之前,我们需要获得这一整页网页的所有原始代码, 那么我们就需要写上这个,那么我们先来导入两个库,第一个库我们使用 request 库来发起请求, 第二个库,也就是 beautiful soup 库来解析获得的 html 源码。但是我们需要注意的一点就是,这个 request 库和这个 beautiful soup 库都是属于第三方库,不是 python 自带的。所以呢,我们需要在终端中写下命令, pip install requests 和 beautiful soup 四, 这样我们才能够正确地导入进来。导入进这两个库之后呢,我们再来写使用 request 模块发起这个 http 请求。在发起请求之前,我们需要获得我们向哪一个网站中发起请求, 那么我们现在来复制上这一串网址,然后以支付串的形式粘贴进去。复制好网址之后呢,我们来定义一个请求头,定义请求头的目的就是为了让爬虫游戏发起请求时,更像我们人类在浏览器向服务器发起的请求, 这样网站的服务器就不会因为我们是爬虫而不给我们正确的数据信息。那么在这个 hears 里面,我们应该填充一些什么东西呢?就是浏览器的身份, 因为我们是需要让爬虫程序假装成浏览器发起请求。那么在这里呢,我们可以点击这个网络的选项卡, 重新加载一下这些数据包,然后点击到这个文档中,选择这个 html 文档,划到这个下面,可以看到这个请求标头在这里呢,有这个 user agent, 我 们复制上这个 user agent, 然后粘贴进去。 需要注意的一点就是,这个 user agent 是 放到这个 headers, 也就是一个字典中的,我们要将它以键值队的形式来储存起来。 粘贴好之后呢,我们再来使用 request 库发起请求,因为我们不需要向网站的服务器传授什么,只需要服务器响应给我们内容,那么我们发起的就是 get 请求, 使用 response 变量来保存发起请求后响应的内容。发起请求后,我们再来看一下是否发起成功使用 print 的 语句,我们来打印一下有没有成功抓取到网页中这一些原始的代码呢? 好,我们现在运行一下这一串,可以看到我们获得到了很多的 html 代码,而这些 html 代码基本上就与这个网页中的一致了。 那么我们要从这么多网页中筛选到我们想要跳转的网址,那么我们就需要查找标签。那么想要快速精确地查找标签的话,我们就需要使用到 beautiful 速不酷。 那么使用 beautiful 速不酷来解去 html 文档呢?我们就需要使用到解析器。放下解析器之后呢,我们再来抓取 a 标签,因为我们需要抓取 a 标签。 那么在抓取这个 a 标签之前,我们来看我们只抓取 a 标签能不能够过滤掉多余的信息呢?我们看一下,按下键盘中的 ctrl, 加上 f 来搜索,写下这个箭头 a。 首先我们可以看到,在这个第一个 a 标签中,这个网址是一个跳转到登录页面的网址,并不是我们想要抓取的小说网址。 那么说明如果我们只筛选 a 标签的话,肯定是会筛选出多余的标签的,那么我们应该怎么做呢?在这个 a 标签中,既没有 id 属性,也没有克拉斯属性来标注它,那么我们就需要找到上一级标签,那么我们再用这个小箭头来查找一下, 可以看到在这个小说的网站中,它的上一期标签叫做 d iv t d 三,那么我们来看一下是不是每一个小说的跳转网址都包裹在这个 d iv t d 三里面呢?可以看到不管是第一张还是第二张,这个 class 名为 d iv t d 三的 d iv 标签里面, 也就是因为我们需要先抓取 div 标签,再抓取 a 标签,抓取的就是上下层级之间里面的元素,那么我们最好还是使用 select 方法。 首先我们抓取所有的 div 标签,写上一个 check, 也就是每一个章节写上 list 这个变量,然后使用 select 来抓取这个 div 标签。 select 的 方法来抓取 class 零的属性,那么我们就只用写上点,加上这个 class 零。抓取所有的 d i v t d 三标签之后,我们来看一下是什么样子的,运行一下这段代码,那我们现在可以看到我们基本上就获得了所有的 d i v 标签。 抓取了 d i v 标签之后呢,我们再来抓取这个对应的 a 标签里面的链接即可。那么我们就需要首先获得每一个 d i v 标签里面的 a 标签。 首先我们来使用这个负循环来建立这个列表中的所有元素,那么我只需要抓取每一个章节的名字,写上 check name, 章节的名字呢,都包含这个 a 标签之内,在 a 标签里面的这个元素就是章节的名字,那么我们可以使用这个点 test 方法获取到章节的名字。 获取到章节的名字之后,我们来获取对应的网址,写上这个 chapter url。 我们一定不要忘记这个 h t t p s。 虽然在这里我们看不到这个 h t t p s。 但是呢,我们双击点开都会看到这个 h t t p s。 这是因为这个网在浏览器中已经被隐藏了, 但是并不代表网站中网址没有这个 h t p s。 所以 我们需要手动加上。然后呢获得这个 a 标签里面的 h t p s。 使用到的就是 get 方法,得到了章节的标题以及章节的链接之后, 我们就能够成功地跳转到对应的链接里面了。跳转到对应的链接里面,我们怎么获取里面的小说内容呢?打开开发者模式, 同样我们使用这个小箭头来看一下小说内容是用什么标签放进去的呢?可以看到是用 p 标签放进去的,那么我们只抓取 p 标签又可以吗? 使用 ctrl f 我 们来查找一下这个 p 标签,可以看到第一页就是这个 p 标签,那么我们导跳转到最后, 这个 p 标签不只有小说的内容,还有一些这些无关的小说版权内容,这些都是我们不需要的。那么我们为了更加精准地找到这些 p 标签,我们就往上面翻译格,也就是在这个 never content 这个 d i v 盒子里面的 p 标签我们才需要抓取。 那么我们现在对每一个章节相应的网址再次发起请求,写上 chapter response, 等于 数据库 get 这个 url, 也就是向这个网址发起请求,并且呢,我们还是要写带上这个 dinners 参数,并且还是需要对这个网页中的原始内容进行解析,方便我们来抓取对应的内容。 然后呢,抓取到的就是每一个章节中的文本内容,那么我们写用这个 p list 抓取的就是这个 novel content 里面的 p 标签。抓取了对应的小说内容之后呢,将它们写到对应的 txt 文件中, 使用 file 点 y 的 方法。写完之后呢,我们还是提示一下用户已经下载完成了。好,现在我们来运行一下这段代码,因为我们没有限制章节,所以呢,他把所有的章节都下了下来。那么我们右击打开 看一下是不是能够正确地观看这些内容呢?可以看到也是能够正常观看的。现在你会不会使用 beautiful super cool 来抓取小说网站中的内容呢? 以上就是这个视频中的所有内容从网页源码中筛选数据的方式,我们也已经学习过了正则表达式和 beautiful soup 四之后我们还会学习最后一个筛选方式,叉 pad, 叉 pad 比正则表达式更加直观,也比 beautiful soup 在 某些场景下更加简洁高效。