找回密码
 立即注册
  • QQ空间
  • 回复
  • 收藏

PyQt5:抖音1分钟,人间2小时(抖音视频下载小工具)-3

admin 2019-11-25 14:11 167人围观 Qt相关



PyQt5

93篇

PyQt5:抖音1分钟,人间2小时(抖音视频下载小工具)-3

导读:代码解析-1

LEARN MORE

正文

今天我们来学习下代码。

01

多线程下载

相关多线程的知识点,可以参考:


下面我们来看下代码:
parsesignal = pyqtSignal(str)downsignal = pyqtSignal(list)
我们弄两个信号,一个是给解析视频url用的,一个是给下载视频用的。
defrun(self):    resParse = self.ParsingVideo()
   if resParse != "parse error":        self.downLoadVideo()

多线程里面跑的函数,先看看视频解析是否成功,成功了才下载。
defParsingVideo(self):    userAgent = ["Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50", "Opera/9.80 (Windows NT 6.1; U; zh-cn) Presto/2.9.168 Version/11.50"]    key = random.randint(0,3)    headers = {'content-type': 'application/json', 'User-Agent': userAgent[key]}
   try:        res1 = requests.head(self.shareUrl, headers=headers, allow_redirects=False)        self.cookies = res1.cookies        redirecturl1 = res1.headers["Location"]        res2 = requests.get(redirecturl1, headers=headers, cookies=self.cookies)        playUrl = re.findall(r"playAddr: (.*?),", res2.text, re.S)[0][1:-1]        res3 = requests.head(playUrl, headers=headers, allow_redirects=False, cookies=self.cookies)        self.downloadUrl = res3.headers["Location"]
   except:        self.downloadUrl = "parse error"    self.parsesignal.emit(self.downloadUrl)
   return self.downloadUrl

解析视频用的代码。

userAgent我这里做过了个列表,里面放了4个常用的浏览器ua。
key = random.randint(0,3)
每次解析随机选择一个ua进行操作。也算是避免频繁操作被抖音屏蔽吧,虽然可能实际效果不大。

把http访问放在try…except…里面,出现异常好及时处理。
res1 = requests.head(self.shareUrl, headers=headers, allow_redirects=False)self.cookies = res1.cookiesredirecturl1 = res1.headers["Location"]
requests库的使用方法,取得跳转后的url。
res2 = requests.get(redirecturl1, headers=headers, cookies=self.cookies)playUrl = re.findall(r"playAddr: (.*?),", res2.text, re.S)[0][1:-1]
我们对跳转后的url进行get操作,根据网页源码取得第二次跳转前的url。如下图,这个就是跳转前的地址,这里我们用正则表达式取得。



res3 = requests.head(playUrl, headers=headers, allow_redirects=False, cookies=self.cookies)self.downloadUrl = res3.headers["Location"]
取得第二次跳转后的url。
except:    self.downloadUrl = "parse error"
self.parsesignal.emit(self.downloadUrl)
return self.downloadUrl

要是解析失败,我们把url设置成”parse error”。

最后发出解析后的url信号,并返回。


defdownLoadVideo(self):    r = requests.get(self.downloadUrl, stream=True, cookies=self.cookies)    length = float(r.headers['content-length'])    count = 0    time1 = time.clock()
   with open(self.savefile, 'wb') as f:
       for chunk in r.iter_content(chunk_size = 512):
           if chunk:                f.write(chunk)                count += len(chunk)                p = count / length * 100                intervals = time.clock() - time1                speed = count / 1024 / 1024 / intervals                self.downsignal.emit([p, speed])

这个函数也是requests基本操作,下载相应的文件并计算平均下载速度,大家可以自己体会下。

最后把下载进度和平均下载速度作为信号发射出去。

03

  最    后 

今天的内容就到这儿!下期我们再见!如果你喜欢本篇文章,请给我点赞



赞赏(推荐



分享给你的好友们吧!

欢迎关注微信公众号:学点编程吧。

加油!(ง •̀_•́)ง (*•̀ㅂ•)
未完待续
给我加个鸡腿吧!( ̄︶ ̄)↗



加入我们的学习交流QQ群,一起学习吧!



看完本文有收获?请转发分享给更多人




猜你喜欢:

更多的PyQt5文章请在微信公众号/使用指南/在线学堂/图文教程中查找。






----------------------------------------------------------------------------------------------------------------------
我们尊重原创,也注重分享,文章来源于微信公众号:学点编程吧,建议关注公众号查看原文。如若侵权请联系qter@qter.org。
----------------------------------------------------------------------------------------------------------------------

鲜花

握手

雷人

路过

鸡蛋

yafeilinux和他的朋友们微信公众号二维码

微信公众号

专注于Qt嵌入式Linux开发等。扫一扫立即关注。

Qt开源社区官方QQ群二维码

QQ交流群

欢迎加入QQ群大家庭,一起讨论学习!

我有话说......