python教程百度云盘-Python 模拟登陆百度云盘实战教程

关键时刻,第一时间送达!

今天我给大家讲讲如何模拟登陆百度云盘(该分析过程也适用于百度别的产品,比如模拟登陆百度搜索首页,它们的加密流程完全一样,只是提交参数有微小差别)。

阅读文章之前,有一些东西需要给大家阐述:

本文并没有对验证码识别进行分析,因为我觉得写爬虫最主要的不是识别验证码,而是如何规避验证码。

本文要求读者具有模拟登陆(主要是抓包和阅读 js 代码) 和密码学的基本知识。

和 上一篇模拟登陆微博的分析流程一样,我们首先要做的是以正常人的流程完整的登录一遍 百度网盘。在打开浏览器之前,先打开抓包工具,以前我在 win 平台用的是 fiddler,现在由于电脑是 mac 系统,所以选择 charles进行抓包。如果有同学没有 charles 的使用经验,那么需要先了解如何让 charles 能抓取到本机的 https 数据包。由于使用 charles 抓包不是本文的重点,所以我就简略说一下:

安装 charles 证书。通过菜单'help'->'ssl proxying'->'install charles root certificate'进行安装,安装过后把证书设置为始终信任

修改 charles 的 proxy settings。 选择 proxy->proxy settings,然后勾选"enable transparent HTTP proxying"

修改 Charles 的 SSL proxy settings。选择 proxy->ssl proxy settings,在弹出的对话框中勾选"enable ssl proxying",并在location部分点击 add,添加需要捕获的站点和 443 端口,如图:

charles ssl proxy 设置图

charles 设置好了之后,我们再使用浏览器直接打开 百度网盘首页 。注意打开之前如果以前登录过百度网盘,一定要先清除百度网盘的 cookie,如果不清楚自己以前登录过没,那么最好把关于百度的 cookie 都清除了吧。如果清除得不彻底,很可能会错过很关键的一步,我先按下不表。通过抓包,我们可以看到请求百度网盘的首页,大概有这些请求:

百度网盘首页请求数据

这里other hosts是本机别的请求,所以直接被我忽略了(通过设置请求为"focus"或者"ignore")。下图给的是设置方法,主要是Focus和Disable SSL Proxying:

设置请求为 focus,并且注意disable ssl proxying

大家可以查看具体每个请求的内容和响应,由于篇幅限制,我就不啰嗦了。然后我们在登录页输入登录账号(先别输入密码和点击登录,如果有想不明白的同学可以阅读上一篇 微博登陆分析),然后观察 charles 的请求,会发现又多了一条请求:

在输入登录账号过后 js 触发的请求

我们看看它返回的内容:

输入账号后服务端返回的内容

可以看到有效信息大概有两个:pubkey和key,它们的用途我们都还不知道,但是看命名可知大概pubkey是某种加密算法的公钥。

然后我们输入密码,点击登录,可以看到 charles 的请求:

登录中的请求

上图圈出来的请求就是提交的密码和登录账号等信息,这个只有大家自己挨着请求查看,才可以确定哪个是 post 的请求。我们查看 post 的参数:

post 参数

现在终于 Get 到重点了,主要就是要把这些提交的参数的生成方式弄清楚。如果有过模拟登陆或者爬虫编写经验的同学,都应该知道请求参数构造之前必须分析清楚哪些参数是变的,哪些参数是不变的,变的哪些参数比较有规律,哪些没有规律。这个分析过程是通过反复登录和抓包,对比 post 数据来完成的。我们通过反复登录和对比 post 的数据,可以发现:

staticpage、charset、 tpl、 subpro、apiver、codestring、 safeflg、u、 isPhone、detect、quickuser、logintype、logLoginType、idc、loginmerge、foreignusername、username、mempass、crypttype、countrycode、dv

等参数不会变化。所以我们只需要分析变化的参数。

变化的参数当中, 看样子基本可以确定是请求时间戳(需要分析它是多少位,精确到毫秒还是秒),其它好像都没什么规律。由于微博模拟登陆的经验,我们基本可以判断出 这个参数是最难分析的(从账户安全角度上来说也应该是加密最复杂的),我们放到后面分析。

那么我们先来分析 字段吧。参数不可能凭空产生,来源只有两种可能:一种是通过服务端返回, 另外一种是通过请求回来的 js 构造。在分析 token 产生的时候,我们需要用到 charles 的查找功能(良心推荐,很强大),它可以查找到整个登录流程中,包含某个查找字符串的所有请求和响应。下图中的"望远镜"图标就是查找功能。

使用 charles 查找包含 token 值的请求和响应

通过查找,我们可以看到有 14 个地方包含了 token 的值,我们发现基本都是使用 token 作为请求参数的,不过有一个结果是返回 token 值的:

token 的返回

它的请求 url 是

https://passport.baidu.com/v2/api/?getapi&tpl=netdisk&subpro=netdisk_web&apiver=v3&tt=1492395317694&class=login&gid=3B1308C-2432-4DC2-BE56-35D602AE5447&logintype=basicLogin&callback=bdcbsv2xmbc

请求参数格式化一下,可能更方便查看:

获取 token 的请求参数

根据上面介绍的分析变量与不变量的思路,这里我们可以看到要获取到 ,需要知道 、 的构造方法。然后用和分析 token 同样的方式,我们来分析 gid 的产生。通过在 charles 中查找 gid 的值,我们发现找到的结果全是在请求中,并没有在响应中找到该值,说明该值是通过 js 生成的而不是通过服务端返回的。既然是通过 js 生成的,我们需要找到该 js 文件。怎么找呢?我们在 charles 中输入 ,再来看看查找的结果,注意这次我们重点关注哪个 js 文件中出现,否则查找的结果太多,看起来会比较费力。通过查找,可以看到名为 logintangramc36ce25.js这个文件中频繁出现了*gid这个参数,基本可以确定这个 js 文件很关键,这也是我先前说的在抓包分析之前需要把百度的 cookie 等历史数据清除的原因,否则该 js 文件可能已经缓存了,charles 中就查不到该 js。我们把该 js 文件下载下来,通过 webstorm 将其中的代码格式化,再查找 ,可以看到这段代码

gid 的生成方式

其中的 函数就是生成 gid 的函数,因为我们在 webstorm 中查找 字符串的时候,可以发现很多如下图所示的语句,只需要定位到 即可

gid 的声明

我们现在找到了 的生成方式了,如果读不懂这段 js 也没关系,可以直接使用 或者 等库将运行后的 js 结果返回给 python 使用。然后我们再回到获取 token 的请求参数那张图,发现还有个 参数需要分析。同 gid 分析过程一样,我们先搜索 callback 的值 ,发现只有请求中包含,基本可以确定它是通过 js 产生的,而加密 js 文件我们已经找到了。如果你害怕可能不是上面的那个 js 文件,我们也可以通过在 charles 中搜索 这个字符串,可以发现就是该 js 文件。通过在 webstorm 中搜索 关键词(通过前面多次登录抓包分析,可发现 callback 的 前缀不会改变,这个也可以是搜索依据),可以找到 callback 的生成方式

截至目前,我们已经弄清楚了gid和callback的生成方式了,这样我们就可以通过构造请求来获取到 了。我们再返回post 参数这张图片,可以看到还有 、 、 这三个字段还需要分析。而通过搜索 的值,可以看到其实它就是 图片输入账号后服务端返回的内容中的key的值,我们可以通过

https://passport.baidu.com/v2/getpublickey?token=370767c85efc50b317b0d75daf70f843&tpl=netdisk&subpro=netdisk_web&apiver=v3&tt=1492398777745&gid=3B1308C-2432-4DC2-BE56-35D602AE5447&callback=bdcbs3pnrh5

这个请求获取到。请求的参数如图,都是我们前面分析过并且能够得到的参数:

获取 key 和 pubkey 的请求参数

现在我们就只有 和 两个字段没分析了。

老规矩,我们先在 charles 中搜索 的值,发现只有一个请求中出现了。那么它肯定是 js 生成的,它是如何生成的呢?我们又在我们获取的 logintangramc36ce25.js文件中搜索 这个字符串,可以发现这段代码:

然后我们再看 是如何生成的。可以看到这段代码

r.timeSpan = (new Date).getTime() - e.initTime

大概是一个时间差:当前时间-初始化时间。当前时间容易获取,那么初始化时间到底是什么初始化呢?继续追踪 initTime 可以发现这段代码

中的 大概就是页面请求完成的时间,所以 应该就是登录页面初始化完成到点击登录按钮的时间差,为了方便,我们只需要取抓包获取的值即可。

现在分析 参数,这个参数也是分析难度最大的参数了。这次我们直接在加密 js 文件中搜索 关键词,可以搜索到很多地方有 这个字符串,那么如何做筛选呢?需要我们有一点 js 的基础知识,在每个匹配到 的地方都读读源码,大概知道它做什么的就行了。最后,我们可以定位到这段代码:

上述代码既有 、 又有 关键字,那么十有八九就是加密 的方法了。主要加密语句是:

e.RSA.encrypt(a)

我们查看 的实现

这里的过程大概就是先用 返回的对象对 进行加密,然后再进行一次 ,这里 js 的代码十分复杂,如果想把对应的 js 转化为 python 实现,需要很深的 js 和 python 功底,但是这个转换已经有人帮我们做了。这里的 即是使用rsa非对称加密算法对密码进行加密。而 是 base64 编码方法。判断 是 rsa 加密算法的依据是该 js 文件中出现了多次 ,并且也有

这类代码作为佐证。判断后者是 base64 算法的依据是 函数中出现了

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 /

这类字符串,它是 base64 编码的一个基础部分。

所以说这里的分析需要大家有基本的密码学知识,否则分析会比较困难。这里友情提示一句,目前主流的大中型网站都会使用 rsa 算法对密码进行加密,所以大家需要有这个意识。但是不要求大家会实现 rsa 等加密算法,因为无论是 python 还是 js 还是 java 都有相关的实现了,我们只需要会分析会使用就行了。

到这里所有的参数分析就结束了,我们可以通过 代码进行验证。

上面详细介绍了百度整个登录流程。我们来总结一下:

先通过 加密 js 文件获取到 , 参数

根据 这个(get) 请求获取到

根据 这个(get) 请求获取到 和

根据获取到的 对 password 进行加密,然后再进行 base64 编码操作

将所有固定和构造的参数进行 post 请求,post 请求的 url 为 ,如果该 post 返回 ,那么模拟登陆就成功了,否则则失败,会返回响应的

前面费了这么大的力气分析百度的登录流程,如果实在是想走捷径的,可以使用 selenium 自动化的方式登录,这个我也给了 相关实现。读过我的 新浪微博模拟登陆的同学大概对介于直接登录和使用 selenium 自动化登录之间的方法还有一些印象吧,这里我并没有使用该方法,因为如果要使用该方法的话,需要改动一些 js 来使代码跑通。有兴趣的同学可以试试,应该比较有意思。

如果有同学感觉本文有一些难度,可以尝试一些简单的模拟登陆,比如知乎和 CSDN 等,我写过一篇关于 CSDN 模拟登陆的文章, 微博模拟登陆应该比本文的分析难度稍微要小一点,如果有兴趣,也可以读读。

我把代码放到我的开源项目 smart_login上了,点击 这里可以查看百度模拟登陆流程的实现,如果有不清楚的同学,建议对照代码再来读本文,可能会更加清晰,如果实际动手按本文的分析流程走一遍,那么可能会有一些收获。

如果大家觉得本文对大家有帮助,不妨点个喜欢,如果代码对大家有帮助,也不妨点个star,以表示对我的鼓励吧。爱给别人点赞的孩子,运气始终不会太差。

作者:resolvewang

http://www.jianshu.com/p/efcf030e68c5

Python开发整理发布,转载请联系作者获得授权

E:. │ 1.txt │ ├─千锋Python教程:第01章 第一个Python程序与数据存储及数据类型(9集) │ │ .DS_Store │ │ │ ├─code │ │ 1、数据存储.txt │ │ 2、第一个python程序.py │ │ 3、注释.py │ │ 4、输出与输入.py │ │ 5、Python数据类型.py │ │ 6、标识符.py │ │ 7、变量与常量.py │ │ │ ├─file │ │ │ MindManager_64bit_17.2.208.exe │ │ │ Python安装.pdf │ │ │ Python概述.pdf │ │ │ submit 2.0.rar │ │ │ │ │ ├─pycharm专业版 │ │ │ pycharm-professional-2017.2.3.exe │ │ │ Pycharm.txt │ │ │ │ │ └─python3.6 │ │ └─windows │ │ python-3.6.0-amd64.exe │ │ │ └─video │ 千锋Python教程:01.python概述和工具的安装.mp4 │ 千锋Python教程:02.数据存储与二进制操作1.mp4 │ 千锋Python教程:03.数据存储与二进制操作2.mp4 │ 千锋Python教程:04.第一个Python程序与注释及输入输出.mp4 │ 千锋Python教程:05.Python数据类型,标识符,变量与常量以及Number数据类型1.mp4 │ 千锋Python教程:06.Python数据类型,标识符,变量与常量以及Number数据类型2.mp4 │ 千锋Python教程:07.Python数据类型,标识符,变量与常量以及Number数据类型3.mp4 │ 千锋Python教程:08.数学功能与数字类型转换的使用1.mp4 │ 千锋Python教程:09.数学功能与数字类型转换的使用2.mp4 │ ├─千锋Python教程:第02章 运算符与表达式(7集) │ │ .DS_Store │ │ │ ├─code │ │ 1、运算符与表达式.py │ │ 2、运算符与表达式.py │ │ │ └─video │ 千锋Python教程:10.算术&赋值&位&关系运算符与表达式1.mp4 │ 千锋Python教程:11.算术&赋值&位&关系运算符与表达式2.mp4 │ 千锋Python教程:12.逻辑运算符与表达式1.mp4 │ 千锋Python教程:13.逻辑运算符与表达式2.mp4 │ 千锋Python教程:14.成员&身份运算符&字符串1.mp4 │ 千锋Python教程:15.成员&身份运算符&字符串2.mp4 │ 千锋Python教程:16.成员&身份运算符&字符串3.mp4 │ ├─千锋Python教程:第03章 字符串&布尔&空值(7集) │ │ .DS_Store │ │ │ ├─code │ │ 1、String(字符串).py │ │ 2、String的内置函数.py │ │ 3、布尔值和空值.py │ │ 4、变量的类型问题.py │ │ │ └─video │ 千锋Python教程:17.运算符&字符串1.mp4 │ 千锋Python教程:18.运算符&字符串2.mp4 │ 千锋Python教程:19.字符串的使用1.mp4 │ 千锋Python教程:20.字符串的使用2.mp4 │ 千锋Python教程:21.字符串的使用3.mp4 │ 千锋Python教程:22.字符串&布尔值&空值&变量的类型问题1.mp4 │ 千锋Python教程:23.字符串&布尔值&空值&变量的类型问题2.mp4 │ ├─千锋Python教程:第04章 列表&元组&流程控制语句(8集) │ │ .DS_Store │ │ │ ├─code │ │ 1、list(列表).py │ │ 2、列表方法.py │ │ 3、浅拷贝与深拷贝.py │ │ 4、tuple(元组).py │ │ 5、条件控制语句.py │ │ 6、循环语句(while).py │ │ 7、循环语句(for).py │ │ 8、pass语句&continue;语句与break语句.py │ │ │ └─video │ 千锋Python教程:24.列表的使用及深浅拷贝1.mp4 │ 千锋Python教程:25.列表的使用及深浅拷贝2.mp4 │ 千锋Python教程:26.列表的使用及深浅拷贝3.mp4 │ 千锋Python教程:27.深浅拷贝&元组&条件判断语句1.mp4 │ 千锋Python教程:28.深浅拷贝&元组&条件判断语句2.mp4 │ 千锋Python教程:29.循环语句&关键字 break&pass;&continue1;.mp4 │ 千锋Python教程:30.循环语句&关键字 break&pass;&continue2;.mp4 │ 千锋Python教程:31.循环语句&关键字 break&pass;&continue3;.mp4 │ ├─千锋Python教程:第05章 字典&集合&类型转换&turtle;(1集) │ │ .DS_Store │ │ │ ├─code │ │ 1、dict(字典).py │ │ 2、set.py │ │ 3、类型转换.py │ │ │ └─video │ 千锋Python教程:32.字典&集合&类型转换&turtle1;.mp4 │ ├─千锋Python教程:第06章 函数与高阶函数(7集)) │ │ .DS_Store │ │ │ ├─code │ │ 10、函数也是一种数据.py │ │ 11、匿名函数.py │ │ 12、map&reduce;.py │ │ 13、filter.py │ │ 14、sorted.py │ │ 15、作用域.py │ │ 16、体现作用域.py │ │ 17、修改全局变量.py │ │ 18、修改嵌套作用域中的变量.py │ │ 1、函数概述.py │ │ 2、最简单的函数(无参无返回值).py │ │ 3、函数的参数.py │ │ 4、函数的返回值.py │ │ 5、传递参数.py │ │ 6、关键字参数.py │ │ 7、默认参数.py │ │ 8、不定长参数.py │ │ 9、多个返回值.py │ │ │ └─video │ 千锋Python教程:33.函数概述.mp4 │ 千锋Python教程:34.函数的基本使用1.mp4 │ 千锋Python教程:35.函数的基本使用2.mp4 │ 千锋Python教程:36.匿名函数&高阶函数 map&reduce1;.mp4 │ 千锋Python教程:37.匿名函数&高阶函数 map&reduce2;.mp4 │ 千锋Python教程:38.高阶函数 filter&sorted;.mp4 │ 千锋Python教程:39.作用域&修改变量作用域.mp4 │ ├─千锋Python教程:第07章 闭包&装饰器(5集) │ │ .DS_Store │ │ │ ├─code │ │ 10、多个装饰器.py │ │ 11、装饰器使用场景.py │ │ 12、计数函数执行次数.py │ │ 13、retry装饰器.py │ │ 1、变量的作用域链.py │ │ 2、利用闭包突破作用域链.py │ │ 3、装饰器概念.py │ │ 4、简单装饰器.py │ │ 5、复杂装饰器.py │ │ 6、使用@符号装饰.py │ │ 7、通用装饰器.py │ │ 8、参数的装饰器.py │ │ 9、计算程序运行时间.py │ │ │ └─video │ 千锋Python教程:40.闭包&装饰器1.mp4 │ 千锋Python教程:41.闭包&装饰器2.mp4 │ 千锋Python教程:42.闭包&装饰器3.mp4 │ 千锋Python教程:43.装饰器的使用1.mp4 │ 千锋Python教程:44.装饰器的使用2.mp4 │ ├─千锋Python教程:第08章 迭代器&生成器&偏函数(6集) │ 千锋Python教程:45.可迭代对象&列表生成式&生成器1.mp4 │ 千锋Python教程:46.可迭代对象&列表生成式&生成器2.mp4 │ 千锋Python教程:47.可迭代对象&列表生成式&生成器3.mp4 │ 千锋Python教程:48.斐波拉契数列&迭代器.mp4 │ 千锋Python教程:49.杨辉三角&偏函数&模块概述1.mp4 │ 千锋Python教程:50.杨辉三角&偏函数&模块概述2.mp4 │ ├─千锋Python教程:第09章 模块&包&常用模块&三方模块(14集) │ 千锋Python教程:51.系统模块&自定义模块&包1.mp4 │ 千锋Python教程:52.系统模块&自定义模块&包2.mp4 │ 千锋Python教程:53.系统模块&自定义模块&包3.mp4 │ 千锋Python教程:54.time 模块1.mp4 │ 千锋Python教程:55.time 模块2.mp4 │ 千锋Python教程:56.datetime&calendar;&collections1;.mp4 │ 千锋Python教程:57.datetime&calendar;&collections2;.mp4 │ 千锋Python教程:58.collections&uuid;&base64;模块1.mp4 │ 千锋Python教程:59.collections&uuid;&base64;模块2.mp4 │ 千锋Python教程:60.collections&uuid;&base64;模块3.mp4 │ 千锋Python教程:61.base64&hashlib;&hmac;模块1.mp4 │ 千锋Python教程:62.base64&hashlib;&hmac;模块2.mp4 │ 千锋Python教程:63.itertools 模块&三方模块的安装&pillow; 模块1.mp4 │ 千锋Python教程:64.itertools 模块&三方模块的安装&pillow; 模块2.mp4 │ ├─千锋Python教程:第10章 面向对象(26集) │ 千锋Python教程:65.堆和栈&面向对象思想概述1.mp4 │ 千锋Python教程:66.堆和栈&面向对象思想概述2.mp4 │ 千锋Python教程:67.堆和栈&面向对象思想概述3.mp4 │ 千锋Python教程:68.创建类&对象&对象的方法1.mp4 │ 千锋Python教程:69.创建类&对象&对象的方法2.mp4 │ 千锋Python教程:70.类属性&对象属性&构造方法&析构方法&访问权限1.mp4 │ 千锋Python教程:71.类属性&对象属性&构造方法&析构方法&访问权限2.mp4 │ 千锋Python教程:72.类属性&对象属性&构造方法&析构方法&访问权限3.mp4 │ 千锋Python教程:73.@property 装饰器&__slots__限制&单例概述1.mp4 │ 千锋Python教程:74.@property 装饰器&__slots__限制&单例概述2.mp4 │ 千锋Python教程:75.单例的三种实现方式&__repr__&__str__&继承概述1.mp4 │ 千锋Python教程:76.单例的三种实现方式&__repr__&__str__&继承概述2.mp4 │ 千锋Python教程:77.继承的实现&继承体系&栈和队列&python2;.2之前的继承体系1.mp4 │ 千锋Python教程:78.继承的实现&继承体系&栈和队列&python2;.2之前的继承体系2.mp4 │ 千锋Python教程:79.继承的实现&继承体系&栈和队列&python2;.2之前的继承体系3.mp4 │ 千锋Python教程:80.两种继承体系的区别.mp4 │ 千锋Python教程:81.python2.3-2.7的集成体系&py3;的继承体系&多态1.mp4 │ 千锋Python教程:82.python2.3-2.7的集成体系&py3;的继承体系&多态2.mp4 │ 千锋Python教程:83.Mixin&运算符重载&属性监听&枚举类1.mp4 │ 千锋Python教程:84.Mixin&运算符重载&属性监听&枚举类2.mp4 │ 千锋Python教程:85.Mixin&运算符重载&属性监听&枚举类3.mp4 │ 千锋Python教程:86.垃圾回收机制&类装饰器&魔术方法&人射击子弹案例1.mp4 │ 千锋Python教程:87.垃圾回收机制&类装饰器&魔术方法&人射击子弹案例2.mp4 │ 千锋Python教程:88.垃圾回收机制&类装饰器&魔术方法&人射击子弹案例3.mp4 │ 千锋Python教程:89.邮件&短信发送1.mp4 │ 千锋Python教程:90.邮件&短信发送2.mp4 │ ├─千锋Python教程:第11章 银行操作系统&tkinter; 界面(14集) │ 千锋Python教程:100.Entry控件&其他控件使用演示1.mp4 │ 千锋Python教程:101.Entry控件&其他控件使用演示2.mp4 │ 千锋Python教程:102.其他控件使用演示.mp4 │ 千锋Python教程:103.其他控件使用演示1.mp4 │ 千锋Python教程:104.其他控件使用演示2.mp4 │ 千锋Python教程:91.贪吃蛇演示&银行操作系统1.mp4 │ 千锋Python教程:92.贪吃蛇演示&银行操作系统2.mp4 │ 千锋Python教程:93.贪吃蛇演示&银行操作系统3.mp4 │ 千锋Python教程:94.银行操作系统.mp4 │ 千锋Python教程:95.银行操作系统1.mp4 │ 千锋Python教程:96.银行操作系统2.mp4 │ 千锋Python教程:97.银行操作系统&GUI;概述&tkinter; 概述1.mp4 │ 千锋Python教程:98.银行操作系统&GUI;概述&tkinter; 概述2.mp4 │ 千锋Python教程:99.tkinter组件之 label&button;.mp4 │ ├─千锋Python教程:第12章 异常处理&代码调试&IO;编程&目录遍历(14集) │ 千锋Python教程:105.错误处理1.mp4 │ 千锋Python教程:106.错误处理2.mp4 │ 千锋Python教程:107.代码调试1.mp4 │ 千锋Python教程:108.代码调试2.mp4 │ 千锋Python教程:109.单元测试1.mp4 │ 千锋Python教程:110.单元测试2.mp4 │ 千锋Python教程:111.树状目录层级演示&文档测试&读文件1.mp4 │ 千锋Python教程:112.树状目录层级演示&文档测试&读文件2.mp4 │ 千锋Python教程:113.写文件&编码与解码&StringIO;与B ytesIO1.mp4 │ 千锋Python教程:114.写文件&编码与解码&StringIO;与B ytesIO2.mp4 │ 千锋Python教程:115.os模块&数据持久化文件操作1.mp4 │ 千锋Python教程:116.os模块&数据持久化文件操作2.mp4 │ 千锋Python教程:117.目录遍历1.mp4 │ 千锋Python教程:118.目录遍历2.mp4 │ ├─千锋Python教程:第13章 正则表达式(5集) │ 千锋Python教程:119.正则表达式概述&re; 模块概述&常用函数&单字符匹配语法1.mp4 │ 千锋Python教程:120.正则表达式概述&re; 模块概述&常用函数&单字符匹配语法2.mp4 │ 千锋Python教程:121.正则表达式概述&re; 模块概述&常用函数&单字符匹配语法3.mp4 │ 千锋Python教程:122.正则表达式深入方式使用1.mp4 │ 千锋Python教程:123.正则表达式深入方式使用2.mp4 │ ├─千锋Python教程:第14章 进程和线程(12集) │ 千锋Python教程:124.多任务原理&进程概述&单任务现象&实现多任务1.mp4 │ 千锋Python教程:125.多任务原理&进程概述&单任务现象&实现多任务2.mp4 │ 千锋Python教程:126.多任务原理&进程概述&单任务现象&实现多任务3.mp4 │ 千锋Python教程:127.父子进程&启动进程&进程对象封装1.mp4 │ 千锋Python教程:128.父子进程&启动进程&进程对象封装2.mp4 │ 千锋Python教程:129.进程间的通信&线程概述&启动多线程1.mp4 │ 千锋Python教程:130.进程间的通信&线程概述&启动多线程2.mp4 │ 千锋Python教程:131.线程间数据共享&线程锁1.mp4 │ 千锋Python教程:132.线程间数据共享&线程锁2.mp4 │ 千锋Python教程:133.线程间数据共享&线程锁3.mp4 │ 千锋Python教程:134.定时线程&线程通信&生产者与消费者&线程调度1.mp4 │ 千锋Python教程:135.定时线程&线程通信&生产者与消费者&线程调度2.mp4 │ ├─千锋Python教程:第15章 网络编程(6集) │ 千锋Python教程:136.网络编程概述1.mp4 │ 千锋Python教程:137.网络编程概述2.mp4 │ 千锋Python教程:138.基于TCP的网络编程1.mp4 │ 千锋Python教程:139.基于TCP的网络编程2.mp4 │ 千锋Python教程:140.基于UDP的网络编程.mp4 │ 千锋Python教程:141.全网轰炸.mp4 │ ├─千锋Python教程:第16章 协程&同步异步&并发并行&编码(11集)规范 │ 千锋Python教程:142.协程概述&数据传递&生产者与消费者1.mp4 │ 千锋Python教程:143.协程概述&数据传递&生产者与消费者2.mp4 │ 千锋Python教程:144.同步异步&asyncio;模块块&协程与任务的定义及阻塞与 await1.mp4 │ 千锋Python教程:145.同步异步&asyncio;模块块&协程与任务的定义及阻塞与 await2.mp4 │ 千锋Python教程:146.同步异步&asyncio;模块块&协程与任务的定义及阻塞与 await3.mp4 │ 千锋Python教程:147.并发并行&协程嵌套&获取网页数据1.mp4 │ 千锋Python教程:148.并发并行&协程嵌套&获取网页数据2.mp4 │ 千锋Python教程:149.并发并行&协程嵌套&获取网页数据3.mp4 │ 千锋Python教程:150.chardet 模块&py2;与py3的区别&PEP8;编码规范1.mp4 │ 千锋Python教程:151.chardet 模块&py2;与py3的区别&PEP8;编码规范2.mp4 │ 千锋Python教程:152.chardet 模块&py2;与py3的区别&PEP8;编码规范3.mp4 │ └─千锋Python教程:第17章 Linux&git;(23集) 千锋Python教程:153.Linux概述1.mp4 千锋Python教程:154.Linux概述2.mp4 千锋Python教程:155.git的使用1.mp4 千锋Python教程:156.git的使用2.mp4 千锋Python教程:157.git的使用3.mp4 千锋Python教程:158.git 的使用1.mp4 千锋Python教程:159.git 的使用2.mp4 千锋Python教程:160.安装虚拟机&Ubantu; 镜像1.mp4 千锋Python教程:161.安装虚拟机&Ubantu; 镜像2.mp4 千锋Python教程:162.安装虚拟机&Ubantu; 镜像3.mp4 千锋Python教程:163.Linux 命令1.mp4 千锋Python教程:164.Linux 命令2.mp4 千锋Python教程:165.linux 命令1.mp4 千锋Python教程:166.linux 命令2.mp4 千锋Python教程:167.linux 命令&远程连接 linux.mp4 千锋Python教程:168.vi 编辑器1.mp4 千锋Python教程:169.vi 编辑器2.mp4 千锋Python教程:170.用户管理权限&阿里云的使用1.mp4 千锋Python教程:171.用户管理权限&阿里云的使用2.mp4 千锋Python教程:172.手动安装 Python3.6的环境&虚拟机环境1.mp4 千锋Python教程:173.手动安装 Python3.6的环境&虚拟机环境2.mp4 千锋Python教程:174.git 的使用1.mp4 千锋Python教程:175.git 的使用2.mp4
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值