2019流行做什么网站网站,南京it外包公司,企业查询天眼查在线查,管理咨询公司需要的能力Python爬虫实战#xff1a;爬取公开课视频并用Qwen3批量生成字幕库 你是不是也遇到过这种情况#xff1f;想学习某个领域的专业知识#xff0c;找到了一个宝藏公开课网站#xff0c;但视频要么没字幕#xff0c;要么字幕质量堪忧#xff0c;看得云里雾里。手动下载视频、…Python爬虫实战爬取公开课视频并用Qwen3批量生成字幕库你是不是也遇到过这种情况想学习某个领域的专业知识找到了一个宝藏公开课网站但视频要么没字幕要么字幕质量堪忧看得云里雾里。手动下载视频、再去找工具生成字幕一套流程下来学习热情都快被磨没了。今天我就来分享一个能彻底解决这个痛点的自动化方案。我们用一个周末的时间写一个Python爬虫把感兴趣的公开课视频“搬”下来然后调用强大的Qwen3智能字幕系统批量给这些视频配上精准的字幕。最后你就能拥有一个专属的、带高质量字幕的垂直领域知识库想什么时候学、怎么学都行。整个过程就像搭积木我们把爬虫和AI字幕生成这两个工具组合起来实现“112”的效果。接下来我会手把手带你走通整个流程从环境搭建到代码编写再到最终的效果展示。放心代码都很直接哪怕你Python刚入门跟着做也能搞定。1. 项目蓝图与核心工具选择在动手写代码之前我们先看看整个项目要做什么以及为什么选择这些工具。简单来说我们的目标是自动抓取视频 - 自动生成字幕 - 整理成库。这听起来可能有点复杂但拆解后就是两个核心步骤每个步骤都有成熟可靠的轮子可以用。1.1 为什么是Python爬虫 Qwen3首先Python爬虫几乎是数据抓取的首选。生态太丰富了像requests、BeautifulSoup、Scrapy这些库让从网页上提取视频链接变得非常简单。我们不需要从零发明轮子站在巨人的肩膀上效率最高。其次为什么选择Qwen3来生成字幕市面上语音转文字的工具很多但很多对于公开课这种专业性强、可能有口音、背景杂音的场景效果并不理想。Qwen3的智能字幕对齐系统在长音频处理、专业术语识别和上下文理解上表现突出它能更好地处理讲师可能的口误、重复或中英文夹杂的情况生成的字幕准确度和可读性更高。更重要的是它提供了清晰的API方便我们集成到自动化流程里。1.2 技术栈与准备工作为了让项目顺利跑起来我们需要准备下面几样东西Python环境建议使用Python 3.8或以上版本。必要的Python库我们主要通过pip安装。requests/scrapy: 用于网页抓取和解析。beautifulsoup4: 解析HTML提取视频链接。pandas: 可能用于整理爬取到的视频信息。qwen3(或对应的SDK): 用于调用字幕生成API。目标网站分析你需要先确定想爬取哪个公开课网站例如某个大学公开课平台、某个专业领域的视频网站。请务必遵守该网站的robots.txt协议仅爬取允许公开访问的内容并控制请求频率避免对对方服务器造成压力。Qwen3 API密钥你需要去Qwen3的官方平台注册并获取一个API Key这是调用服务的凭证。准备好这些我们就可以进入实战环节了。2. 第一步编写爬虫获取视频下载链接爬虫部分是我们的数据源头。这里我以使用requests和BeautifulSoup为例因为它足够轻量适合大多数静态页面。如果目标网站结构复杂如大量JavaScript渲染你可能需要考虑Selenium或Scrapy。假设我们要爬取一个简单的公开课列表页每个课程点进去有视频播放页。2.1 分析页面结构首先用浏览器打开目标网站按F12打开开发者工具。我们需要找到列表页中每个课程条目链接的规律。视频播放页中视频文件真正的下载地址可能是.mp4链接也可能是嵌在video标签里的src。例如你可能发现列表页的课程链接都包含/course/这样的路径而视频地址藏在某个script标签或特定的网络请求里。2.2 编写爬虫代码下面是一个高度简化的示例演示如何抓取列表并解析出视频页面链接。import requests from bs4 import BeautifulSoup import time import re def get_course_links(list_url): 从课程列表页获取所有课程详情页的链接 headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 } try: response requests.get(list_url, headersheaders, timeout10) response.raise_for_status() # 检查请求是否成功 response.encoding response.apparent_encoding except requests.RequestException as e: print(f请求列表页失败: {e}) return [] soup BeautifulSoup(response.text, html.parser) course_links [] # 假设每个课程卡片由一个带有特定class的a标签包裹 # 你需要根据实际网站结构调整这里的选择器 for link in soup.select(a.course-card-link): href link.get(href) if href: # 处理相对链接 full_url requests.compat.urljoin(list_url, href) course_links.append(full_url) print(f共找到 {len(course_links)} 门课程。) return course_links def get_video_url(course_url): 从课程详情页解析出视频的直接下载地址.mp4链接 这是最复杂的一步高度依赖目标网站。 有时视频地址是明文的有时需要解析JavaScript或模拟请求。 headers {User-Agent: 你的浏览器User-Agent} try: resp requests.get(course_url, headersheaders) soup BeautifulSoup(resp.text, html.parser) # 方法1: 直接在video标签中寻找 video_tag soup.find(video) if video_tag and video_tag.get(src): return video_tag[src] # 方法2: 在页面脚本中搜索.mp4链接 (常见) # 使用正则表达式查找可能的视频链接 pattern re.compile(rhttps?://[^\]\.(mp4|m3u8)) matches pattern.findall(resp.text) if matches: # 可能需要进一步过滤选择最可能是主视频的那个 return matches[0] # 方法3: 有些网站通过XHR加载视频地址需要分析网络请求 # 这里可能需要更复杂的抓包和分析甚至使用Selenium print(f在 {course_url} 中未找到明显的视频链接。) return None except Exception as e: print(f解析课程页 {course_url} 失败: {e}) return None # 使用示例 if __name__ __main__: base_list_url https://example-open-course-site.com/courses # 替换成真实地址 all_courses get_course_links(base_list_url) video_info_list [] for idx, course_url in enumerate(all_courses[:3]): # 先测试前3个 print(f正在处理第 {idx1} 个课程: {course_url}) video_url get_video_url(course_url) if video_url: video_info_list.append({course_url: course_url, video_url: video_url}) print(f 找到视频: {video_url}) time.sleep(2) # 礼貌性延迟避免请求过快 print(f\n准备就绪共获取到 {len(video_info_list)} 个视频链接。)关键点提醒User-Agent模拟浏览器访问避免被简单的反爬机制拦截。延迟(time.sleep)在请求间加入延迟是网络爬虫的基本礼仪。链接解析get_video_url函数是核心也是难点你需要根据目标网站具体情况调整。有时可能需要解析m3u8流媒体文件那就需要用到m3u8库等工具。视频下载获取到直接的.mp4链接后可以用requests的流模式下载。如果是m3u8则需要专门的下载器。3. 第二步调用Qwen3 API批量生成字幕拿到视频文件后下一步就是把它变成文字。这里我们假设你已经将视频下载到本地存储为video_files列表。3.1 准备Qwen3 API环境首先安装Qwen3的Python SDK具体包名请以官方文档为准pip install qwen3然后在你的代码中配置API密钥import os from qwen3 import Qwen3Client # 假设的导入方式请参考官方文档 # 从环境变量或配置文件中读取API Key避免硬编码在代码里 API_KEY os.getenv(QWEN3_API_KEY, your-actual-api-key-here) client Qwen3Client(api_keyAPI_KEY)3.2 封装字幕生成函数我们需要一个函数它接收一个视频文件路径调用Qwen3的语音转写或字幕生成接口并返回字幕文本通常是SRT或VTT格式。def generate_subtitles_for_video(video_file_path, output_srt_path): 调用Qwen3 API为单个视频生成字幕并保存为SRT文件。 try: print(f正在为 {os.path.basename(video_file_path)} 生成字幕...) # 1. 读取视频文件为二进制数据 with open(video_file_path, rb) as f: video_data f.read() # 2. 调用Qwen3的语音转写/字幕生成接口 # 注意以下API调用参数和方式为示例务必查阅最新官方文档 response client.audio.transcribe( filevideo_data, modelqwen3-audio, # 指定模型以官方为准 response_formatsrt, # 请求返回SRT格式字幕 languagezh, # 假设视频语言为中文可改为en等 # 可能还有其他参数如temperature, prompt等用于优化效果 ) # 3. 处理响应保存字幕文件 subtitle_text response[text] # 根据实际API响应结构调整 with open(output_srt_path, w, encodingutf-8) as srt_file: srt_file.write(subtitle_text) print(f字幕已保存至: {output_srt_path}) return True except Exception as e: print(f为 {video_file_path} 生成字幕时出错: {e}) return False3.3 实现批量处理现在我们可以将爬虫获取的视频和字幕生成流程串联起来实现批量自动化。import os from pathlib import Path def batch_process_videos(video_info_list, download_dir./downloads, subtitle_dir./subtitles): 批量处理视频下载如果尚未下载并生成字幕。 video_info_list: 列表每个元素是包含course_url和video_url的字典。 # 创建存储目录 Path(download_dir).mkdir(parentsTrue, exist_okTrue) Path(subtitle_dir).mkdir(parentsTrue, exist_okTrue) results [] for info in video_info_list: video_url info[video_url] course_name info.get(course_name, unknown_course) # 生成一个安全的文件名 safe_name .join([c for c in course_name if c.isalnum() or c in ( , -, _)]).rstrip() video_filename f{safe_name}.mp4 video_path os.path.join(download_dir, video_filename) srt_path os.path.join(subtitle_dir, f{safe_name}.srt) # 检查视频是否已下载 if not os.path.exists(video_path): print(f正在下载: {course_name}) if not download_video(video_url, video_path): # 需要实现download_video函数 print(f下载失败跳过: {course_name}) results.append({name: course_name, status: download_failed}) continue else: print(f视频已存在跳过下载: {course_name}) # 检查字幕是否已生成 if not os.path.exists(srt_path): success generate_subtitles_for_video(video_path, srt_path) status subtitle_generated if success else subtitle_failed else: print(f字幕已存在跳过生成: {course_name}) status subtitle_existed results.append({ name: course_name, video_path: video_path, subtitle_path: srt_path, status: status }) # 处理完一个稍作休息避免API限流 time.sleep(1) return results # 一个简单的视频下载函数示例 def download_video(url, save_path): try: headers {User-Agent: Mozilla/5.0} response requests.get(url, headersheaders, streamTrue, timeout30) response.raise_for_status() with open(save_path, wb) as f: for chunk in response.iter_content(chunk_size8192): f.write(chunk) return True except Exception as e: print(f下载视频失败 {url}: {e}) return False # 主流程 if __name__ __main__: # 假设已经从爬虫获取了video_info_list # video_info_list [...] print(开始批量处理视频与生成字幕...) process_results batch_process_videos(video_info_list) print(\n处理完成汇总如下) for res in process_results: print(f- {res[name]}: {res[status]})这段代码构建了一个完整的流水线检查并下载视频 - 检查并调用AI生成字幕 - 保存结果。加入了状态检查避免重复处理。4. 第三步构建与管理你的字幕知识库当批量处理完成后你本地就会有一堆视频文件和对应的SRT字幕文件。但这还不是“知识库”我们需要把它变得更容易检索和使用。4.1 字幕文件的整理与索引我们可以创建一个简单的索引文件如JSON或CSV记录每个视频的元数据标题、来源URL、关键词、处理时间等和对应的字幕文件路径。import json from datetime import datetime def build_subtitle_index(process_results, index_file./subtitle_index.json): 根据处理结果构建索引文件。 index_data [] for res in process_results: if res[status] in [subtitle_generated, subtitle_existed]: # 尝试从字幕文件中提取前几句作为内容摘要 content_preview try: with open(res[subtitle_path], r, encodingutf-8) as f: lines f.readlines() # 提取前5条字幕文本跳过时间码和序号 text_lines [line.strip() for line in lines if line.strip() and not line.strip().isdigit() and -- not in line] content_preview .join(text_lines[:5]) except: content_preview 内容预览获取失败 item { id: len(index_data) 1, course_name: res[name], video_path: os.path.abspath(res[video_path]), subtitle_path: os.path.abspath(res[subtitle_path]), content_preview: content_preview[:200] ... if len(content_preview) 200 else content_preview, # 截取预览 processed_at: datetime.now().isoformat(), source_url: res.get(source_url, ) # 可以从video_info_list传入 } index_data.append(item) with open(index_file, w, encodingutf-8) as f: json.dump(index_data, f, ensure_asciiFalse, indent2) print(f字幕索引已构建共 {len(index_data)} 条记录保存至 {index_file}) return index_data4.2 实现简单的本地搜索功能有了索引我们就可以实现一个根据关键词搜索字幕内容的功能。这里用一个简单的文本匹配来演示。def search_in_subtitles(index_data, keyword): 在索引数据中搜索包含关键词的字幕项。 results [] keyword_lower keyword.lower() for item in index_data: # 在课程名和内容预览中搜索 if (keyword_lower in item[course_name].lower()) or (keyword_lower in item[content_preview].lower()): results.append(item) else: # 更深入的搜索直接打开字幕文件查找效率较低适合小规模 try: with open(item[subtitle_path], r, encodingutf-8) as f: content f.read() if keyword_lower in content.lower(): results.append(item) except: pass return results # 使用示例 if __name__ __main__: # 加载索引 with open(./subtitle_index.json, r, encodingutf-8) as f: my_index json.load(f) search_term 机器学习 # 你想搜索的关键词 found_items search_in_subtitles(my_index, search_term) print(f找到 {len(found_items)} 个与 {search_term} 相关的内容) for item in found_items: print(f - 课程: {item[course_name]}) print(f 预览: {item[content_preview]}) print(f 字幕文件: {item[subtitle_path]}\n)这样一个具备基本存储、索引和搜索功能的本地字幕知识库就初具雏形了。你可以根据需要用数据库如SQLite替代JSON文件来管理索引或者开发一个带Web界面的应用来展示和搜索你的知识库。5. 总结与展望走完这一趟你会发现将公开课视频变成可搜索、可回顾的字幕知识库并没有想象中那么遥不可及。核心就是两个自动化步骤的串联用Python爬虫解决“获取”的问题用Qwen3这样的AI工具解决“理解”转写的问题。实际做下来最花时间的部分往往不是写代码而是分析目标网站的结构找到稳定获取视频源的方法。每个网站都不一样这部分需要一些耐心和技巧。而一旦爬虫稳定运行后面的批量字幕生成就是“一劳永逸”的享受了。看着AI快速、准确地将音频转化为结构化的文字那种效率提升的感觉非常棒。这个方案还有很大的扩展空间。比如你可以用Qwen3的API对生成的字幕进行二次加工提取关键词、生成课程摘要甚至做成问答对让你的知识库更加智能。或者将流程部署到云服务器上设定定时任务让它自动抓取网站更新实现知识库的持续增长。当然也要时刻牢记合法合规地使用爬虫尊重数据版权仅将技术用于个人学习与研究。希望这个实战案例能给你带来启发帮你打造属于自己的高效学习工具。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。