如何使用python来自动保存百度网盘资源-这样的操作你会吗?

开始

在上一文中,我们保存了百度云盘的地址和提取码,但是这种分享链接很容易被屏蔽,最好的做法就是保存资源到自己的网盘,不过采集的链接有上万个,人肉保存并不现实,所以本文尝试了批量保存资源,如您还没看过上文,这里可以跳转。

爬虫学习3:搭建自己的电影资源网保姆式教学

观察请求

以下面资源链接为例:

在浏览器中输入以上链接,会自动跳转到 https://pan.baidu.com/share/init?surl=tHSxZQueF-Wsa2T0NlT3vQ ,

输入正确提取码后发现直接跳转到资源保存页面了,F12 NETWORK里也看不到此请求的返回值,这时候只能使用Fiddler才能抓到包了。

Fiddler抓包

打开Fiddler,为了不让其它各类请求影响到我们,首先进行简单设置,以此来显示我们想要的请求,点击Filters 进行如下设置,最后点击Actions里的Run Filterset now,就只会显示 pan.baidu.com 域名的请求:

测试post数据

为了得到点击提取文件按钮时发送的请求和post的数据,先尝试输入一个错误的提取码123,查看请求:

https://pan.baidu.com/share/verify?surl=tHSxZQueF-Wsa2T0NlT3vQ&t=1593142082616&channel=chunlei&web=1&app_id=250528&bdstoken=855345cbf66bbfba3d30d5e201ea346f&logid=MTU5MzE0MjA4MjYyMDAuNTM5MjA2Nzg2ODEyNTcxNA==&clienttype=0

看来上面这个url就提取数据的请求,接下来具体看一下都提交了哪些数据:

Form Data中的pwd就是刚才输入的错误提取码,而其它两个参数vcode和vcode_str在没有验证码的情况下也不用管,再看看Query String中的参数,为了测试这些参数有哪些是变化的,我挑选了一些资源链接去尝试,具体过程就省略了,总结如下:

Query String参数是否变化
surl 即资源链接中的最后部分,可直接获取
t 时间戳,可直接获取
channel 固定
web 固定
app_id 固定
bdstoken 固定
logid 变化
clienttype 固定
Form Data参数是否变化
pwd 即提取码
vcode
vcode_str

从上面表格来看,需要手动获取的就是logid,稍微有点经验的话应该都能想到这会不会是js动态生成的,抱着这个心态来到sources标签下,搜索logid关键字,果不其然,有个JS文件里有这个参数,直接定位到相应的行数:

直接在68行打一个断点,查看运行状态:

细心的同学一个很快就能发现上图红框里的值就是第一次请求 https://pan.baidu.com/share/init?surl=tHSxZQueF-Wsa2T0NlT3vQ cookies里的 BAIDUID 的值, logid 就是通过上面一些js代码中的一些算法得到的,cookies如下:

BIDUPSID=EC39F255CF7B146E8ADD4FA37DB16739;BAIDUID=BBBC2B2C1269AF3AA7D113D07FAC5E80:FG=1;  PSTM=1587390447; PANWEB=1; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; BDCLND=C4jsJ4aHacfrqq02TYbUOKGFFDefnJAMNmU%2BI3v5FNM%3D;

水平有限,没办法将这段js改写为python,不过好在python提供了一个执行js代码的库 pyexecjs ,该库运行于Nodejs环境,首先要保证你的机器安装了Nodejs:

pip install pyexecjs

下图即代表安装正确了,execjs可以正常使用

将js代码稍微修改一下,保存为 yunpan.js :


使用execjs执行一下



得到所有的变化参数后就可以提交数据了:


通过Fiddler抓包发现返回的res为下,errno为0即代表提交成功:

{"errno":0,"err_msg":"","request_id":8738382064533520558,"randsk":"g2VwUSYs1KSuOMh9%2FQDVUUwc7ICFq4CZNmU%2BI3v5FNM%3D"}

留意上面的 randsk 。

如果你是用浏览器抓包就会发现输对提取码点击按钮后请求会全部刷新一次,就不能确认到底是哪个请求跳转到资源页面的,只能使用Fiddler才能抓到 POST 成功后的请求,经过测试,发现POST数据后又再次请求了 https://pan.baidu.com/s/1wy0LC4O6iY7l9M6RD25k6w 这个链接,没错,就是上面一开始请求的链接,区别就是这次请求cookie中携带了刚才返回的 randsk 的值。所以再次请求时添加上 randsk :


保存资源

抓包分析

抓包保存资源链接发现为:

#保存链接
https://pan.baidu.com/share/transfer?shareid=4180912663&from=2693937402&ondup=newcopy&async=1&channel=chunlei&web=1&app_id=250528&bdstoken=7a8e1e34b454fd27de65b7662f67c2fa&logid=MTU5MzE4MTYzNDY0NDAuOTE1MzE0NDI5MzI1NTY4OA==&clienttype=0"

Query String 和 Form Data 为:

Query String大部分参数都提到过,可以参考上面,这里出现了新的两个参数 shareid 和 from ,经过测试除了这两个参数和上文中 logid ,其它参数均为固定。

Form Data参数是否变化
fsidlist 变化
path 你自己选择保存的路径,约等于固定
type 固定

到这里又稍微被 shareid 和 from 、 fsidlist 三个参数卡住了,在页面中搜索这三个参数也没有结果,在source中搜索了一下,倒是又一个shareid,但是貌似也关系不大,折腾了一会就想到既然参数名搜不到,那我搜一下参数值试试?,果然在资源页面中搜到了三个参数的值(即 https://pan.baidu.com/s/1wy0LC4O6iY7l9M6RD25k6w 这页面),如下图:

正则表达式即可提取出三个值。


转存

转存时候注意cookie里要携带 BDUSS 和 STOKEN ,这两个参数在资源页面的cookies里,且都为固定的,没有登录的话只有 STOKEN , BDUSS 的值要在登录状态下才能看到,下图时登录后的cookie:

代码如下:


完结,撒花

到这里就结束了,本文讲解了如何使用python转存百度云盘资源。


此文转载文,著作权归作者所有,如有侵权联系小编删除!

原文地址:http://www.cnblogs.com/luohua13950/p/13723860.html

如需要源代码点击这里下载

原文地址:https://www.cnblogs.com/wxys/p/13739338.html