【爬虫&APP逆向006】异步案列实现&selenium

本文介绍了使用selenium进行网页交互,包括元素定位、执行JavaScript、页面等待以及如何处理滑动验证。同时,讨论了在爬虫中如何进行异步操作,如使用协程和线程池,并讲述了如何规避网站对selenium的检测,通过JS注入来隐藏自动化脚本的痕迹。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

M3U8流视频数据爬虫(不重要)

HLS技术介绍

    现在大部分视频客户端都采用HTTP Live Streaming(HLS,Apple为了提高流播效率开发的技术),而不是直接播放MP4等视频文件。HLS技术的特点是将流媒体切分为若干【TS片段】(比如几秒一段),然后通过一个【M3U8列表文件】将这些TS片段批量下载供客户端播放器实现实时流式播放。因此,在爬取HLS的流媒体文件的思路一般是先【下载M3U8文件】并分析其中内容,然后在批量下载文件中定义的【TS片段】,最后将其【组合】成mp4文件或者直接保存TS片段。

M3U8文件详解

    如果想要爬取HLS技术下的资源数据,首先要对M3U8的数据结构和字段定义非常了解。M3U8是一个扩展文件格式,由M3U扩展而来。那么什么是M3U呢?

M3U文件

    M3U这种文件格式,本质上说不是音频视频文件,它是音频视频文件的列表文件,是纯文本文件。
    M3U这种文件被获取后,播放软件并不是播放它,而是根据它的记录找到媒体的网络地址进行在线播放。也就是说,M3U格式的文件只是存储多媒体播放列表,并提供了一个指向其他位置的音频视频文件的索引,播放的是那些被指向的文件。
    为了能够更好的理解M3U的概念,我们先简单做一个M3U文件(myTest.m3u)。在电脑中随便找几个MP3,MP4文件依次输入这些文件的路径,myTest.m3u文件内容如下
        E:\Users\m3u8\刘德华 - 无间道.mp4
        E:\Users\m3u8\那英 - 默.mp3
        E:\Users\m3u8\周杰伦 - 不能说的秘密.mp4
        E:\Users\m3u8\花粥 - 二十岁的某一天.mp3
        E:\Users\m3u8\周深 - 大鱼.mp4

M3U8文件

    M3U8也是一种M3U的扩展格式(高级的M3U,所以也属于M3U)。
    M3U8示例:**大家会看到在该文件中有大量的ts文件的链接地址,这个就是我们之前描述的真正的视频文件。其中任何一个ts文件都是一小段视频,可以单独播放。我们做视频爬虫的目标就是把这些ts文件都爬取下来。
        #EXTM3U
        #EXT-X-VERSION:3
        #EXT-X-TARGETDURATION:6
        #EXT-X-PLAYLIST-TYPE:VOD
        #EXT-X-MEDIA-SEQUENCE:0
        #EXTINF:3.127,
        /20230512/RzGw5hDB/1500kb/hls/YZefAiEF.ts
        #EXTINF:3.127,
        /20230512/RzGw5hDB/1500kb/hls/FsliUCL6.ts
        #EXTINF:3.127,
        /20230512/RzGw5hDB/1500kb/hls/DD7c47bz.ts
        #EXT-X-ENDLIST

实战

需求:

        https://www.mjtt5.tv/

具体操作

        进入视频播放页
        点击播放按钮,定位ts数据包,从中提取ts片段的url,探究url的规律
        打开抓包工具,刷新页面,全局搜索m3u8定位到找到m3u8文件
        解析m3u8文件提取文件中ts片段链接

同步操作代码

import requests
from urllib.parse import urljoin
import re
import os
dirName = 'tsLib'
if not os.path.exists(dirName):
    os.mkdir(dirName)

headers  = {
   
    'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36'
}
#m3u8地址
url = "https://cdn13.tvtvgood.com/202310/20/c1959422deee/playlist.m3u8?token=d5i9GCr3ljqGsSf48-aG2w&expires=1698221543"
page_text = requests.get(url=url,headers=headers).text
page_text = page_text.strip()

#解析出每一个ts切片的地址
ts_url_list = []
for line in page_text.split('\n'):
    if not line.startswith('#'):
        ts_url = line
        #不同ts下载地址
        ts_url = 'https://cdn13.tvtvgood.com/202310/20/c1959422deee/'+ts_url
        ts_url_list.append(ts_url)

print(ts_url_list)
#请求到每一个ts切片的数据
for url in ts_url_list:
    #获取ts片段的数据
    ts_data = requests.get(url=url,headers=headers).content
    ts_name = url.split('/')[-1]
    ts_path = dirName+'/'+ts_name
    with open(ts_path,'wb') as fp:
        #需要将解密后的数据写入文件进行保存
        fp.write(ts_data)
    print(ts_name,'下载保存成功!')

# ts文件的合并,最好网上找专业的工具进行合并,自己手动合并会经常出问题

异步操作代码:协程

#https://cdn8.tvtvgood.com/202206/21/6abfb3237d01/playlist8.ts
#https://cdn8.tvtvgood.com/202206/21/6abfb3237d01/playlist7.ts
import requests
import os
import asyncio
import aiohttp
from threading import Thread
dirName = 'tsLib'
if not os.path.exists(dirName):
    os.mkdir(dirName)

headers  = {
   
    'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36'
}
#m3u8文件的url
m3u8_file_url = 'https://cdn8.tvtvgood.com/202206/21/6abfb3237d01/playlist.m3u8?token=9vVIuesP2MAZ4G1V6y6DnA&expires=1698927688'
m3u8_text = requests.get(url=m3u8_file_url,headers=headers).text

ts_url_list = [] #存储解析出来的每一个ts片段的url
for line in m3u8_text.split('\n'):
    if not line.startswith('#'):
        ts_url = line
        ts_url = 'https://cdn8.tvtvgood.com/202206/21/6abfb3237d01/'+ts_url
        ts_url_list.append(ts_url)

#基于协程实现异步的ts片段的请求
async def get_reqeust(url):#参数url就是ts片段的请求url
    async with aiohttp.ClientSession() as req:
        async with await req.get(url=url,headers=headers) as response:
            ts_data = await response.read()
            dic = {
   'ts_data':ts_data,'ts_title':url.split('/')[-1]}
            return dic

def save_ts_data(t):
    dic = t.result()
    ts_data = dic['ts_data']
    ts_title = dic['ts_title']
    ts_path = dirName + '/' + ts_title
    with open(ts_path,'wb') as fp
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

初遇我ㄖ寸の热情呢?

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值