小知识,大挑战!本文正在参与“ 程序员必备小知识 ”创作活动
本文已参与 「掘力星计划」 ,赢取创作大礼包,挑战创作激励金
多线程开发可能遇到的问题
假设两个线程t1和t2都要对全局变量g_num(默认是0)进行加1运算,t1和t2都各对g_num加10次,g_num的最终的结果应该为20。
但是由于是多线程同时操作,有可能出现下面情况:
在g_num=0时,t1取得g_num=0。此时系统把t1调度为”sleeping”状态,把t2转换为”running”状态,t2也获得g_num=0
然后t2对得到的值进行加1并赋给g_num,使得g_num=1
然后系统又把t2调度为”sleeping”,把t1转为”running”。线程t1又把它之前得到的0加1后赋值给g_num。
这样导致虽然t1和t2都对g_num加1,但结果仍然是g_num=1
测试1
import threading
import time
g_num = 0
def work1(num):
global g_num
for i in range(num):
g_num += 1
print("----in work1, g_num is %d---"%g_num)
def work2(num):
global g_num
for i in range(num):
g_num += 1
print("----in work2, g_num is %d---"%g_num)
print("---线程创建之前g_num is %d---"%g_num)
t1 = threading.Thread(target=work1, args=(100,))
t1.start()
t2 = threading.Thread(target=work2, args=(100,))
t2.start()
while len(threading.enumerate()) != 1:
time.sleep(1)
print("2个线程对同一个全局变量操作之后的最终结果是:%s" % g_num)
复制代码
运行结果:
---线程创建之前g_num is 0---
----in work1, g_num is 100---
----in work2, g_num is 200---
2个线程对同一个全局变量操作之后的最终结果是:200
复制代码
进入正文
目标网站:tlvod.com/v-57381.htm… (速度与激情9)
注:文章有配套视频教程,关注私我
工具使用
开发工具:pycharm
开发环境:python3.7, Windows10
使用第三方库:requests
播放后动态抓包 看看数据是啥情况 仔细看了一下 发现视频都是 ts文件组成的 一个个片段文件
看到ts的时候 顿时 感觉自己悟了 这个不就是传说中的 m3u8视频格式嘛
下面 刷新页面 找 m3u8结尾文件
这会有小伙伴有疑问了 怎么确定他就是? 简单 复制这个 去访问看看
访问 时候 新建了下载 任务 但是没有后缀 记得保存的时候 后面跟上.ts
下载后播放 么得问题 就是个小片段
下面使用正则表达式 提取他们 (注:担心看文章的零基础 正则表达式,白又白写的简单 丑一点 好理解 实在不会的可以先去正则表达式官网先学习一下哈。)
import requests # 爬虫第三方包
import re # 正则表达式
from tqdm import tqdm # 这个是滚动条
def Tools(url):
# 防止网站反爬
headers = {
# 代理浏览器 访问
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36 Edg/93.0.961.38'
}
response = requests.get(url, headers=headers)
return response
def save(url, name):
'''
存储ts片段文件
:param url: ts地址
:param name: ts名称
:return:
'''
response = Tools(url).content # 16进制数据
f = open('./video/{}.ts'.format(name), 'ab') # a 文件追加 b进制文件读写
f.write(response)
f.close()
url = 'https://c1.monidai.com/20210907/SOPKxzCy/index.m3u8'
response = Tools(url).text
response = re.sub(r'#EXTM3U', '', response) # 替换
response = re.sub(r'#EXT-X-VERSION:\d*', '', response) # 替换 \d 整数
response = re.sub(r'#EXT-X-TARGETDURATION:\d*', '', response) # 替换
response = re.sub(r'#EXT-X-MEDIA-SEQUENCE:\d*', '', response) # 替换
response = re.sub(r'#EXTINF:\d.\d*,', '', response) # 替换
response = re.sub(r'#EXT-X-ENDLIST', '', response)
response = re.sub(r'#EXTINF:\d\d,', '', response)
response = re.sub(r'#EXTINF:\d,', '', response)
ts_url = response.split()
for link in tqdm(ts_url):
name = link.split('/')[-1] # 获取ts文件名称
save(link, name) # 存储ts片段文件的函数
复制代码
视频下载后 需要合并这些ts文件
最后完成 不过这个代码可以改善 小伙伴们可以尝试 用多线程试试。
我是白又白i,一名喜欢分享知识的程序媛❤️
感兴趣的可以关注我的公众号:白又白学Python【非常感谢你的点赞、收藏、关注、评论,一键三连支持】
近期评论