You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用Python从抓取的链接中提取m3u8链接地址失败求助

使用Python从抓取的链接中提取m3u8链接地址失败求助

嗨,我仔细看了你的问题和代码,发现几个关键问题导致你没法成功提取m3u8链接,咱们一步步来修复:

核心问题分析

你的代码里完全没有处理og:video标签的提取逻辑,而且直接使用了未定义的og_imageog_videom3u8变量,这不仅会导致脚本报错中断,更根本的是没实现从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

火山引擎 最新活动