Python自动化实战:基于Playwright与FFmpeg的M3U8视频流一站式抓取方案
1. 为什么我们需要一个“一站式”的M3U8视频抓取方案如果你经常在网上找一些学习资料、纪录片或者想保存一些有趣的短视频肯定遇到过这种情况打开一个视频网站播放很流畅但当你右键想“另存为”时却发现根本找不到下载按钮。或者你费劲找到了一个下载器却发现对这个网站无效因为网站用了复杂的反爬机制。这时候一个通用的、能应对各种网站的视频下载工具就显得尤为重要。我刚开始学Python那会儿也遇到过这些麻烦。后来我发现很多网站的视频流都采用了一种叫HLSHTTP Live Streaming的协议而它的核心就是一个叫做M3U8的文本文件。这个文件本身不包含视频数据但它像一个“节目单”里面列出了成百上千个叫做TSTransport Stream的小视频分片地址。我们的目标就是拿到这个“节目单”然后按照顺序把所有的“节目片段”下载下来最后拼成一个完整的视频。听起来简单对吧但实际操作起来坑可不少。首先你怎么从五花八门的网页里自动找到那个M3U8文件的地址有些网站把它藏得很深或者需要执行特定的JavaScript才能生成。其次这些TS分片下载链接可能会动态变化或者需要携带特定的请求头比如Referer、User-Agent甚至一些自定义的Token才能访问。更头疼的是很多视频为了防盗链还会对TS分片进行AES-128加密你需要从M3U8文件里找到密钥Key和初始向量IV才能解密。手动处理这些步骤太繁琐了。所以我花了些时间结合Playwright和FFmpeg折腾出了一套高度自动化的Python方案。这套方案的核心思想就是你只需要给我一个视频播放页的URL剩下的所有事情——模拟访问、拦截M3U8、下载TS、解密、合并——全部由脚本自动完成。它就像一个不知疲倦的“数字工人”帮你把脏活累活都干了。接下来我就带你一步步拆解这个方案并分享完整的代码和踩过的坑。2. 核心工具选型为什么是Playwright FFmpeg工欲善其事必先利其器。在构建这个自动化方案时工具的选择直接决定了方案的通用性和健壮性。我对比过几种常见方案最终锁定了Playwright和FFmpeg这个黄金组合。2.1 Playwright不只是“另一个”浏览器自动化工具你可能听说过Selenium它确实是老牌的浏览器自动化框架。但我选择Playwright主要是因为它有几个杀手锏级别的优势特别适合我们这种“网络嗅探”场景。首先Playwright的“请求/响应拦截”功能强大且易用。我们不需要去分析复杂的网页结构也不需要去逆向可能被混淆的JavaScript代码。我们只需要启动一个浏览器实例打开目标页面然后监听所有的网络响应。一旦发现响应URL中包含.m3u8且内容以#EXTM3U开头我们就立刻把它捕获下来。这种方法几乎是“降维打击”因为它模拟的是真实用户的浏览器行为能绕过绝大多数基于客户端JavaScript渲染或用户行为验证的反爬措施。其次Playwright支持无头Headless模式并且速度极快。你可以在服务器后台默默地运行它不需要弹出图形界面节省资源。它的浏览器上下文Context功能可以轻松模拟不同的设备、用户代理和屏幕尺寸这对于需要模拟移动端访问的网站非常有用。我在代码里就提供了模拟PC端和移动端两种上下文的示例你可以根据目标网站灵活切换。最后Playwright的API设计非常现代和友好同步和异步两种模式都支持与Python的集成也很顺畅。相比之下处理一些动态加载的页面时Selenium的等待逻辑有时会显得笨拙而Playwright的wait_for_*系列方法则更加精准和高效。2.2 FFmpeg音视频处理的“瑞士军刀”下载下来的一堆TS文件我们需要把它们合并成一个完整的视频文件比如MP4。你当然可以自己写代码读取每个TS文件的二进制数据然后拼接。但这里有个大坑TS文件直接二进制拼接有时会导致音视频不同步或播放器无法识别。这是因为TS流内部有精确的时间戳PTS/DTS等信息。专业的做法是使用FFmpeg。它是一个命令行工具但功能强大到令人发指。我们只需要告诉它“这里有一个TS文件列表或者一个包含了所有TS的合并文件请把它无损地转换成MP4。” FFmpeg会处理好所有的容器格式转换、编码流复制等底层细节确保输出的视频质量和原始流完全一致。在我们的方案里解密后的TS文件无论是明文还是解密后的会先被我们拼接成一个大的临时TS文件然后交给FFmpeg一句命令完成最终转换。这比我们自己去处理媒体容器要可靠得多。2.3 Python粘合剂与调度中心Python在这里扮演着“大脑”和“粘合剂”的角色。我们用Python调用Playwright打开网页用Python解析捕获到的M3U8文本用Python的多线程池高速下载TS分片用Python调用pycryptodome库进行AES解密最后再用Python的os.system调用FFmpeg命令行完成合并。整个流程被Python串成了一个无缝的管道。3. 实战第一步用Playwright智能捕获M3U8文件理论说再多不如一行代码。让我们看看如何用Playwright抓到那个关键的M3U8文件。这是整个流程的起点也是最关键的一步。首先你需要安装Playwright库。打开你的终端或命令提示符执行以下命令pip install playwright安装完成后还需要安装它对应的浏览器内核playwright install这个步骤会下载Chromium、Firefox和WebKitSafari内核的可执行文件通常需要一点时间。现在来看核心的捕获代码。我把它写在了main.py的main函数里。为了让你更清楚我把它拆解出来from playwright.sync_api import sync_playwright def capture_m3u8(url): m3u8_contents {} # 用来存储捕获到的M3U8内容和其URL page_title page_url with sync_playwright() as p: # 启动浏览器headlessTrue表示无头模式不显示界面 browser p.chromium.launch(headlessTrue) # 创建一个浏览器上下文可以在这里设置User-Agent、视口大小等来模拟不同设备 context browser.new_context( user_agentMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ..., # 一个常见的PC浏览器UA viewport{width: 1920, height: 1080} ) page context.new_page() # 定义响应监听器这是我们的“捕兽夹” def on_response(response): nonlocal page_title, page_url resp_url response.url # 关键判断URL中包含m3u8并且响应文本以#EXTM3U开头 if .m3u8 in resp_url and response.text().startswith(#EXTM3U): print(f[捕获成功] M3U8 URL: {resp_url}) # 将M3U8内容和其URL保存下来 m3u8_contents[resp_url] response.text() # 顺便记录下页面标题和URL后续用作文件名和Referer page_title page.title() page_url page.url # 将监听器绑定到页面的‘response’事件上 page.on(response, on_response) # 导航到目标网址 page.goto(url, wait_untilnetworkidle) # ‘networkidle’表示等待网络基本空闲 # 有些页面需要滚动才能触发视频流加载所以模拟滚动一下 page.evaluate(window.scrollTo(0, document.body.scrollHeight * 0.5);) # 等待几秒确保所有异步请求比如视频流请求都发出来了 page.wait_for_timeout(5000) # 关闭资源 page.close() context.close() browser.close() return m3u8_contents, page_title, page_url这段代码的精髓在于page.on(response, on_response)。它为页面设置了一个全局监听器每一个网络响应都会经过这个函数。我们只筛选出我们想要的M3U8响应。wait_untilnetworkidle和page.wait_for_timeout(5000)是为了给页面足够的加载时间确保视频播放器已经发起请求。对于某些懒加载严重的网站你可能需要增加等待时间或模拟更多的用户交互如点击播放按钮。踩坑提醒有些网站的M3U8文件URL可能不直接包含.m3u8字符串或者响应头Content-Type是application/vnd.apple.mpegurl。为了更强的通用性你可以把判断条件改成检查响应头的Content-Type或者同时检查URL和内容。我在提供的完整代码中采用了更宽松的判断if m3u8 in response.url and #EXTM3U in response.text()在实践中证明兼容性很好。4. 拆解M3U8获取TS列表与解密密钥成功捕获到M3U8文件内容一段文本后我们就拿到了“藏宝图”。接下来需要解析这张图找出所有宝藏TS分片的位置以及打开宝藏的钥匙解密密钥。一个典型的加密M3U8文件内容如下#EXTM3U #EXT-X-VERSION:3 #EXT-X-KEY:METHODAES-128,URIhttps://example.com/key.key,IV0x1234567890abcdef1234567890abcdef #EXT-X-MEDIA-SEQUENCE:0 #EXT-X-TARGETDURATION:5 #EXTINF:5.000, https://example.com/segment0.ts #EXTINF:5.000, https://example.com/segment1.ts我们的解析任务有三个判断是否加密查找#EXT-X-KEY标签。如果METHOD是AES-128则表示TS分片被AES-128-CBC加密。提取密钥和IV如果加密从URI属性中获取密钥文件的下载地址从IV属性中获取初始向量IV。IV有时是十六进制字符串如0x...有时是纯数字需要统一处理。提取所有TS分片URL收集所有不以#开头的行它们就是TS分片的地址。这里有个关键点TS地址可能是相对路径。比如上面例子如果是segment0.ts我们就需要根据M3U8文件自身的URL拼接出完整的绝对地址。我写了一个专门的解析函数parse_m3u8_file它返回一个包含所有信息的数据结构from collections import namedtuple import logging M3u8EncryptType Enum(M3u8EncryptType, [UNKNOWN, PLAIN, AES128]) ProcResult namedtuple(ProcResult, enc_method key_url iv ts_url_list) def parse_m3u8_file(m3u8_req_url: str, m3u8_content: str) - ProcResult: 解析M3U8文件内容 :param m3u8_req_url: 请求这个M3U8文件的完整URL用于拼接相对路径 :param m3u8_content: M3U8文件的文本内容 :return: ProcResult对象包含加密类型、密钥URL、IV、TS URL列表 # 1. 提取基础URL用于拼接 base_url m3u8_req_url[:m3u8_req_url.rfind(/) 1] # 2. 判断加密类型并提取密钥和IV enc_method M3u8EncryptType.PLAIN key_url None iv None key_line_start m3u8_content.find(#EXT-X-KEY:) if key_line_start ! -1: # 找到了加密行 key_line m3u8_content[key_line_start: m3u8_content.find(\n, key_line_start)] if METHODAES-128 in key_line: enc_method M3u8EncryptType.AES128 # 提取URI (密钥地址) uri_start key_line.find(URI) 5 uri_end key_line.find(, uri_start) key_url key_line[uri_start:uri_end] # 提取IV iv_start key_line.find(IV) if iv_start ! -1: iv_part key_line[iv_start3:].split(,)[0].strip() # 处理0x开头的十六进制格式 if iv_part.startswith(0x): iv iv_part[2:] # 去掉0x else: iv iv_part # 3. 提取所有TS分片URL并处理相对路径 ts_urls [] for line in m3u8_content.splitlines(): line line.strip() if line and not line.startswith(#): if line.startswith(http): ts_urls.append(line) else: # 相对路径需要拼接 ts_urls.append(base_url line) return ProcResult(enc_method, key_url, iv, ts_urls)这个函数处理了加密判断、密钥/IV提取和URL拼接这几个核心逻辑。有了它我们就把一团文本信息转化成了结构化的、可操作的数据。5. 高速下载与解密多线程与AES-128-CBC实战拿到TS分片列表后下一步就是下载。一个视频可能有几百甚至上千个TS文件如果一个个顺序下载会慢得让人无法忍受。我们必须并行下载。5.1 使用线程池并发下载Python的concurrent.futures模块提供了ThreadPoolExecutor非常适合这种I/O密集型任务网络下载。我们可以创建一个线程池把每个TS文件的下载任务提交进去。from concurrent.futures import ThreadPoolExecutor, as_completed import requests import os def download_ts_files(ts_url_list, referer_url, save_dir, ts_name_list): 多线程下载TS文件 :param ts_url_list: TS文件URL列表 :param referer_url: Referer头很多网站会校验这个 :param save_dir: 文件保存目录 :param ts_name_list: 输出参数按顺序存储TS文件名 :return: 是否全部下载成功 if not os.path.exists(save_dir): os.makedirs(save_dir) headers { User-Agent: 你的User-Agent, Referer: referer_url # 这个非常重要 } failed_urls [] def download_one(ts_url): try: # 从URL中提取出文件名 filename ts_url.split(/)[-1].split(?)[0] ts_name_list.append(filename) # 记录顺序 filepath os.path.join(save_dir, filename) # 如果文件已存在跳过下载支持断点续传 if os.path.exists(filepath): print(f文件已存在跳过: {filename}) return True print(f开始下载: {filename}) resp requests.get(ts_url, headersheaders, timeout15) resp.raise_for_status() # 如果状态码不是200抛出异常 with open(filepath, wb) as f: f.write(resp.content) print(f下载完成: {filename}) return True except Exception as e: print(f下载失败 {ts_url}: {e}) failed_urls.append(ts_url) return False # 使用线程池max_workers控制并发数不宜过大如20-50 with ThreadPoolExecutor(max_workers30) as executor: # 提交所有任务 future_to_url {executor.submit(download_one, url): url for url in ts_url_list} # 等待所有任务完成 for future in as_completed(future_to_url): future.result() # 这里会抛出任务执行过程中的异常 return len(failed_urls) 0这里有几个关键点Referer请求头绝大多数视频网站都会校验这个头它必须是视频所在页面的域名。我们从Playwright捕获的页面URL中提取出来。错误重试网络请求可能失败完善的代码应该加入重试机制。我提供的完整代码中每个下载任务都有最多10次重试。并发控制max_workers不宜设置过大否则可能会被目标网站封IP或者拖慢你自己的网络。一般20-50是个比较合理的范围。断点续传通过检查文件是否已存在可以实现简单的断点续传功能。5.2 AES-128-CBC解密如果M3U8文件指示了加密那么下载下来的TS文件是密文无法直接播放。我们需要用之前解析到的密钥Key和初始向量IV进行解密。AES是一种对称加密算法AES-128表示密钥长度是128位16字节。CBC是其中一种工作模式它需要一个额外的IV初始向量来增加安全性。解密过程是标准化的我们可以用pycryptodome这个库轻松完成。首先安装它pip install pycryptodome解密代码如下from Crypto.Cipher import AES from Crypto.Util.Padding import unpad import os def decrypt_ts_files(key_bytes, iv_hex_str, ts_file_dir, ts_name_list, output_file): 解密TS文件并合并 :param key_bytes: 密钥16字节的bytes对象 :param iv_hex_str: IV十六进制字符串不带0x :param ts_file_dir: TS文件所在目录 :param ts_name_list: TS文件名列表按顺序 :param output_file: 解密合并后的输出文件路径 # 将十六进制的IV字符串转换为bytes iv_bytes bytes.fromhex(iv_hex_str) # 确保IV是16字节 if len(iv_bytes) ! 16: raise ValueError(IV长度必须为16字节) # 创建AES解密器 cipher AES.new(key_bytes, AES.MODE_CBC, iv_bytes) with open(output_file, wb) as out_f: for ts_name in ts_name_list: ts_path os.path.join(ts_file_dir, ts_name) with open(ts_path, rb) as in_f: encrypted_data in_f.read() # 解密 decrypted_data cipher.decrypt(encrypted_data) # 移除PKCS7填充如果存在 try: plain_data unpad(decrypted_data, AES.block_size) except ValueError: # 有些TS分片可能没有填充直接使用解密后的数据 plain_data decrypted_data out_f.write(plain_data) print(f解密合并完成文件已保存至: {output_file})解密的关键在于AES.new(key_bytes, AES.MODE_CBC, iv_bytes)创建了解密器然后对每个TS分片的二进制数据调用decrypt方法。解密后数据可能带有PKCS7填充需要用unpad移除。但注意并非所有加密的TS流都使用标准填充有些可能没有填充。所以代码里加了一个异常处理如果解填充失败就使用原始解密数据。这在实践中是可行的。6. 最终组装调用FFmpeg生成完美MP4经过下载和解密我们现在有了一个包含了所有TS分片数据的临时大文件。但直接把这个.ts文件改名为.mp4很多时候播放器是无法识别的或者会出现音视频问题。这时就需要FFmpeg出场了。FFmpeg是一个命令行工具所以我们需要用Python的subprocess或os.system来调用它。合并转换的命令非常简单ffmpeg -i input.tmp.ts -c copy output.mp4-i input.tmp.ts指定输入文件。-c copy这是一个非常重要的参数。它告诉FFmpeg进行“流复制”而不是重新编码。这意味着它只是把输入文件中的视频流、音频流等原封不动地复制到新的MP4容器中速度极快且是无损的不会损失任何画质。output.mp4输出文件名。在Python中这样调用import subprocess import os def merge_with_ffmpeg(input_ts_path, output_mp4_path): 使用FFmpeg合并TS文件为MP4 # 构建命令 cmd [ffmpeg, -i, input_ts_path, -c, copy, output_mp4_path] # 隐藏FFmpeg的控制台输出可选 with open(os.devnull, w) as devnull: result subprocess.run(cmd, stdoutdevnull, stderrsubprocess.STDOUT) # 检查命令是否成功执行 if result.returncode 0: print(f视频合并成功: {output_mp4_path}) return True else: print(f视频合并失败返回码: {result.returncode}) return False重要提示你需要确保系统已经安装了FFmpeg并且其可执行文件路径在系统的环境变量PATH中。在Windows上你可以去FFmpeg官网下载编译好的版本解压后将bin目录添加到系统路径。在macOS上可以用brew install ffmpeg安装。在Linux上用sudo apt install ffmpeg或yum install ffmpeg。7. 整合与优化打造健壮的一站式脚本现在我们已经有了所有功能模块捕获、解析、下载、解密、合并。接下来就是把它们串联起来并增加一些“工业级”的优化让它真正变得健壮和好用。7.1 完整的流程控制主函数main的流程如下输入接收一个视频页面URL作为参数。捕获使用Playwright打开页面监听并捕获所有M3U8响应。遍历处理一个页面可能包含多个视频比如剧集列表所以对捕获到的每一个M3U8文件循环处理。解析调用parse_m3u8_file解析出TS列表和加密信息。获取密钥如果是加密的先去下载密钥文件。下载TS使用线程池并发下载所有TS分片到临时目录。解密与初步合并根据加密类型将TS文件解密或直接读取并合并成一个大的临时TS文件。FFmpeg转换调用FFmpeg将临时TS文件转换为最终的MP4文件。清理删除临时目录和文件。命名使用网页标题作为输出MP4的文件名多个视频则自动添加序号。7.2 错误处理与日志记录一个健壮的脚本必须能处理各种异常。网络可能断开网站可能改版密钥可能下载失败。我的代码中加入了大量的try...except块并在关键步骤记录日志。我使用了Python的logging模块将日志同时输出到控制台和文件app.log这样出问题时可以方便地排查。例如在下载TS文件时单个分片下载失败不应该导致整个任务崩溃。代码中会记录失败的分片并继续尝试其他分片。最终如果全部成功才进行下一步。7.3 模拟与反爬应对Playwright的强大之处在于可以高度模拟真人浏览器。在代码中我创建浏览器上下文时设置了完整的User-Agent、视口大小、语言偏好甚至一些额外的HTTP头如sec-ch-ua。这能让我们的请求看起来更像来自一个真实的Chrome或Edge浏览器降低被识别为爬虫的风险。对于需要登录或者有复杂验证的网站你可以进一步使用Playwright的page.fill()、page.click()等方法模拟登录过程并将登录后的Cookie状态保存下来用于后续的请求。7.4 如何使用这个脚本我将所有功能模块化分成了两个文件parallel_download_m3u8.py包含下载、解析、解密逻辑和main.py主入口和Playwright捕获逻辑。你需要按照以下步骤操作安装依赖pip install playwright requests pycryptodome playwright install确保系统已安装FFmpeg赋予脚本执行权限Linux/macOSchmod x main.py运行脚本python main.py https://你的视频页面网址或者直接运行./main.py https://你的视频页面网址脚本运行后你会在终端看到详细的日志最终在当前目录下生成以网页标题命名的.mp4文件。最后一点经验之谈网络环境千变万化没有一套代码能保证100%通用。这个方案提供了强大的基础框架和核心逻辑。当你遇到新的网站时可能需要微调一些参数比如Playwright的等待时间、请求头、或者M3U8解析的正则表达式。但有了这个框架你解决问题的效率会大大提高。希望这个详细的分享能帮你打开自动化视频处理的大门把更多时间花在享受内容上而不是寻找和下载内容的过程中。如果在使用中遇到具体问题多看看日志那是最好的调试助手。

相关新闻

Flutter 组件 signals 的适配 鸿蒙Harmony 实战 - 驾驭细粒度响应式状态管理、实现鸿蒙端极致 UI 刷新与数据流向审计方案

Flutter 组件 signals 的适配 鸿蒙Harmony 实战 - 驾驭细粒度响应式状态管理、实现鸿蒙端极致 UI 刷新与数据流向审计方案

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net Flutter 组件 signals 的适配 鸿蒙Harmony 实战 - 驾驭细粒度响应式状态管理、实现鸿蒙端极致 UI 刷新与数据流向审计方案 前言 在鸿蒙(OpenHarmony)生态的极简 UI…

2026/7/4 9:02:55 阅读更多 →
STM32CubeMX实战:SD卡+DMA+FatFs文件系统配置与性能优化

STM32CubeMX实战:SD卡+DMA+FatFs文件系统配置与性能优化

1. 从零开始:为什么你需要SD卡DMAFatFs这个组合? 如果你正在用STM32做数据采集、音频录制、图像存储或者任何需要记录大量数据的项目,那你肯定遇到过存储的难题。内部Flash太小,外扩SRAM又贵又麻烦,这时候一张小小的SD…

2026/5/17 11:15:33 阅读更多 →
GD32F303CG实战:I2C读写BL24C256A EEPROM的5个常见坑与解决方案

GD32F303CG实战:I2C读写BL24C256A EEPROM的5个常见坑与解决方案

GD32F303CG实战:I2C读写BL24C256A EEPROM的5个常见坑与解决方案 最近在做一个基于GD32F303CG的智能传感器项目,需要频繁地将校准参数和运行日志存储到外部EEPROM里。我选用了BL24C256A这颗32KB的芯片,想着I2C接口简单,应该很快就能…

2026/7/4 5:53:51 阅读更多 →

最新新闻

2026深度评测!7款AI论文写作平台,哪款才是你的心头好

2026深度评测!7款AI论文写作平台,哪款才是你的心头好

AI写论文工具介绍 在2026年的学术写作智能化浪潮中,越来越多人选择使用AI写论文工具。许多现有的工具在撰写硕士和博士论文等长篇作品时,往往面临一些难题。它们的理论深度常常不足,逻辑结构也显得松散。这使得普通的AI论文写作工具无法满足…

2026/7/5 7:26:09 阅读更多 →
如何在原神中突破60帧限制:终极帧率解锁完整指南

如何在原神中突破60帧限制:终极帧率解锁完整指南

如何在原神中突破60帧限制:终极帧率解锁完整指南 【免费下载链接】genshin-fps-unlock unlocks the 60 fps cap 项目地址: https://gitcode.com/gh_mirrors/ge/genshin-fps-unlock 你是否厌倦了原神60帧的限制,想要在提瓦特大陆体验更流畅的战斗和…

2026/7/5 7:24:06 阅读更多 →
STM32驱动WS2812智能LED的硬件设计与固件优化

STM32驱动WS2812智能LED的硬件设计与固件优化

1. 项目背景与硬件选型考量WS2812智能LED与STM32L432KC的组合在嵌入式灯光控制领域堪称黄金搭档。作为一名长期从事嵌入式开发的工程师,我最初选择这套方案是看中了STM32L432KC的低功耗特性(运行模式下仅100μA/MHz)与WS2812的高集成度优势。…

2026/7/5 7:24:06 阅读更多 →
XUnity.AutoTranslator深度解析:Unity游戏自动翻译技术指南

XUnity.AutoTranslator深度解析:Unity游戏自动翻译技术指南

XUnity.AutoTranslator深度解析:Unity游戏自动翻译技术指南 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 在全球化游戏体验日益重要的今天,语言障碍成为许多玩家面临的现实问题。…

2026/7/5 7:22:05 阅读更多 →
Python xhs库终极指南:5分钟上手小红书数据采集完整教程

Python xhs库终极指南:5分钟上手小红书数据采集完整教程

Python xhs库终极指南:5分钟上手小红书数据采集完整教程 【免费下载链接】xhs 基于小红书 Web 端进行的请求封装。https://reajason.github.io/xhs/ 项目地址: https://gitcode.com/gh_mirrors/xh/xhs 小红书作为中国最受欢迎的社交电商平台,每天…

2026/7/5 7:20:04 阅读更多 →
YOLOv11 改进 - SPPF模块   替代SPP,FFocal Modulation焦点调制:即插即用轻量设计优化全局语义捕获

YOLOv11 改进 - SPPF模块 替代SPP,FFocal Modulation焦点调制:即插即用轻量设计优化全局语义捕获

前言 本文介绍了焦点调制网络(FocalNets)及其在YOLOv11中的结合应用。FocalNets完全用焦点调制模块替代自注意力,该模块由焦点上下文化、门控聚合和逐元素仿射变换组成,能有效建模视觉中的标记交互。它通过局部特征聚焦、全局信息…

2026/7/5 7:16:03 阅读更多 →

日新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻