使用Python从抓取的链接中提取m3u8链接地址失败求助
使用Python从抓取的链接中提取m3u8链接地址失败求助
嗨,我仔细看了你的问题和代码,发现几个关键问题导致你没法成功提取m3u8链接,咱们一步步来修复:
核心问题分析
你的代码里完全没有处理og:video标签的提取逻辑,而且直接使用了未定义的og_image、og_video、m3u8变量,这不仅会导致脚本报错中断,更根本的是没实现从og:video中抓取m3u8的核心功能。
修复方案及修改后的代码
下面是调整后的完整代码,我标注了关键修改点:
import csv import os import re import time from selenium import webdriver import requests from bs4 import BeautifulSoup # 初始化Chrome驱动 driver = webdriver.Chrome() # 读取站点地图XML文件 response = requests.get('https://www.webcamromania.ro/post-sitemap.xml') soup = BeautifulSoup(response.content, 'xml') # 提取站点地图中的有效链接(过滤图片链接) links = [] for loc in soup.find_all('loc'): link = loc.text if not any(link.endswith(ext) for ext in ['.jpg', '.png']): links.append(link) # 只打开一次CSV文件,避免重复IO操作提升效率 with open('C:/Users/USER/Desktop/data.csv', 'w', newline='', encoding='utf-8') as csvfile: fieldnames = ['link', 'title', 'description', 'og_image', 'og_video', 'm3u8'] writer = csv.DictWriter(csvfile, fieldnames=fieldnames) writer.writeheader() # 遍历目标链接区间,提取数据 for link in links[155:161]: driver.get(link) # 增加等待时间,确保页面动态内容加载完成 time.sleep(3) html = driver.page_source soup = BeautifulSoup(html, 'html.parser') # 提取标题和描述(增加空值判断,避免报错) title = soup.find('title').text if soup.find('title') else '无标题' description = soup.find('meta', {'name': 'description'})['content'] if soup.find('meta', {'name': 'description'}) else '无描述' # 提取og:image和og:video标签内容 og_image = soup.find('meta', property='og:image')['content'] if soup.find('meta', property='og:image') else None og_video_tag = soup.find('meta', property='og:video') og_video_url = og_video_tag['content'] if og_video_tag else None m3u8_link = None # 如果找到og:video链接,尝试提取m3u8地址 if og_video_url: # 情况1:og_video_url本身就是m3u8链接 if og_video_url.endswith('.m3u8'): m3u8_link = og_video_url # 情况2:og_video_url是播放页面,需要进一步解析 else: driver.get(og_video_url) time.sleep(2) video_html = driver.page_source video_soup = BeautifulSoup(video_html, 'html.parser') # 遍历页面脚本,查找包含m3u8的链接(可根据实际页面结构调整) for script in video_soup.find_all('script'): if '.m3u8' in script.text: # 用正则提取完整的m3u8链接 m3u8_match = re.search(r'https?://\S+\.m3u8', script.text) if m3u8_match: m3u8_link = m3u8_match.group() break # 返回原页面,继续处理下一个链接 driver.back() # 将提取到的数据写入CSV writer.writerow({ 'link': link, 'title': title, 'description': description, 'og_image': og_image, 'og_video': og_video_url, 'm3u8': m3u8_link }) # 关闭浏览器驱动 driver.close()
额外注意事项
- 动态内容加载:很多网站的m3u8链接是通过JavaScript动态生成的,单纯用BeautifulSoup可能抓不到,你可以用Selenium的
WebDriverWait等待特定元素加载,或者通过浏览器F12的网络请求面板,找到m3u8的真实请求地址后直接用requests请求。 - 反爬规避:频繁请求容易触发网站反爬机制,建议把固定等待时间改成随机等待(比如
time.sleep(random.randint(2,5))),必要时可以使用代理IP。 - 正则适配:提取m3u8的正则表达式需要根据目标网站的实际字符串格式调整,你可以先打印脚本内容,确认m3u8链接的具体格式后再优化正则规则。
备注:内容来源于stack exchange,提问作者NoName




