【Python爬虫sao操作】不用付费也能爬取天狼影院电影

小知识,大挑战!本文正在参与“  程序员必备小知识  ”创作活动

本文已参与 「掘力星计划」 ,赢取创作大礼包,挑战创作激励金

多线程开发可能遇到的问题

假设两个线程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

123.png

播放后动态抓包 看看数据是啥情况 仔细看了一下 发现视频都是 ts文件组成的 一个个片段文件
234.png

看到ts的时候 顿时 感觉自己悟了 这个不就是传说中的 m3u8视频格式嘛

下面 刷新页面 找 m3u8结尾文件

345.png

这会有小伙伴有疑问了 怎么确定他就是? 简单 复制这个 去访问看看

456.png

访问 时候 新建了下载 任务 但是没有后缀 记得保存的时候 后面跟上.ts
567.png

下载后播放 么得问题 就是个小片段

下面使用正则表达式 提取他们 (注:担心看文章的零基础 正则表达式,白又白写的简单 丑一点 好理解 实在不会的可以先去正则表达式官网先学习一下哈。)

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文件
678.png

最后完成 不过这个代码可以改善 小伙伴们可以尝试 用多线程试试。

我是白又白i,一名喜欢分享知识的程序媛❤️
感兴趣的可以关注我的公众号:白又白学Python【非常感谢你的点赞、收藏、关注、评论,一键三连支持】

猜你喜欢

转载自juejin.im/post/7019163877866733582