鱼C论坛

 找回密码
 立即注册
查看: 284|回复: 12

[技术交流] 基于chat爬取盗版网站视频(小白第一次行动)

[复制链接]
回帖奖励 116 鱼币 回复本帖可获得 2 鱼币奖励! 每人限 1 次
发表于 2024-5-11 16:50:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
记录分享第一次下视频
一.
某天发现不清楚是谁在我的浏览器中给我收藏了一个yellow网站(恼怒)!                (目标网站:https://www.xian网址xian164.com/
在我批判性研究下发现里面不只是小视频,还有一些电影和电视剧,瞌睡了来枕头,爬不了正规网站我还爬不了你嘛,于是本着柿子挑软的捏,第一次爬虫的目标就是你了!
需要准备的工具:ffmpeg、python各种库、mitmdump

二.
检查网页播放视频时的network发现是流媒体模式(机械专业的并不懂,问chatgpt说的),视频被分为若干.ts结尾的文件,其中小视频的xhr请求含参数加密(如:hls/NwL6ViJC.ts),电影电视剧并没有参数加密(如:hls/2fabd183470000008.ts)
我们先验证下按照xhr中的url能否下载视频片段,是否存在登录验证等其他阻碍下载的机制,向chat提问:编写一段python代码,按照url下载网页中的视频片段
import urllib.request

url = "目标url"
filename = "video_segment.ts"  # 视频片段保存的文件名

try:
    urllib.request.urlretrieve(url, filename)
    print("视频片段已保存为", filename)
except Exception as e:
    print("下载失败:", e)
非常幸运直接就可以下载视频片段,所以本次行动分为两部分,含加密参数视频的爬取和不含加密参数视频的爬取

三.
1.

    不含加密参数视频的爬取
    例如电影《秦岭迷窟》,打开网页检查页面的network,可以发现视频片段的url请求非常规律例如:https://vip.ffzy-play7.com/20221 ... fabd183470000113.ts,结尾的2fabd183470000113部分以此增大就好,所以我们只需要做个循环,下载所有片段就好。具体代码还是由chatgpt提供,以下是验证可行的代码:
    import urllib.request
    import os
    import datetime
    
    # 定义下载的起始和结束索引,这里下载四个片段作为演示
    start_index = 5
    end_index = 8
    
    # 创建一个目录用于保存下载的片段
    segment_folder = "video_segments"
    if not os.path.exists(segment_folder):
        os.makedirs(segment_folder)
    
    # 创建日志文件
    log_file = open(os.path.join(segment_folder, "video_download_log.txt"), "a")
    
    # 创建视频片段文件列表
    segment_files = []
    
    # 提取固定部分的URL
    base_url = "https://vip.ffzy-play7.com/20221125/6964_b388eef9/2000k/hls/2fabd183470"        #url后6位为变动部分
    
    # 循环下载视频片段
    for i in range(start_index, end_index + 1):
        # 构造当前片段的 URL
        url = f"{base_url}{str(i).zfill(6)}.ts"
        filename = os.path.join(segment_folder, f"{str(i).zfill(6)}.ts")  # 视频片段保存的文件名
    
        try:
            urllib.request.urlretrieve(url, filename)
            print(f"视频片段 {filename} 已下载")
            log_file.write(f"[{datetime.datetime.now()}] 下载完成:{filename}\n")
            segment_files.append(f"{str(i).zfill(6)}.ts")  # 添加片段文件名到列表,去掉前缀
        except Exception as e:
            print(f"下载失败: {url},错误信息: {e}")
            log_file.write(f"[{datetime.datetime.now()}] 下载失败:{url},错误信息:{e}\n")
    
    # 关闭日志文件
    log_file.close()
    
    # 切换工作目录到视频片段所在的文件夹
    os.chdir(segment_folder)
    
    # 将片段文件名写入到 video_segments.txt 文件中
    segment_list_file = "video_segments.txt"
    with open(segment_list_file, "w") as file:
        for segment_file in segment_files:
            file.write(f"file '{segment_file}'\n")
    
    # 使用 FFmpeg 合并视频片段
    output_video_path = "video.mp4"
    ffmpeg_command = f"ffmpeg -f concat -safe 0 -i {segment_list_file} -c copy {output_video_path}"
    ffmpeg_status = os.system(ffmpeg_command)
    print(f"FFmpeg 命令执行状态: {ffmpeg_status}")
    
    if ffmpeg_status == 0:
        print(f"视频合并完成,保存为 {output_video_path}")
    else:
        print("视频合并失败,请检查错误信息。")

    由此即可下载想要的电影电视剧了
    展望:①可以使用chat重构代码,使用异步爬虫加快下载速度②这里下载需要输入的主要参数是目标电影的xhr的url,以后可以加入网页解析功能,输入变量改为网址或者电影名字,获取url部分由python代码完成,甚至做个ui就更方便了。


2.

    含加密参数的小视频就没法通过循环来下载了(悲),以下是我想的几种下载途径:①破解加密,由代码构造加密url——能力有限,破解失败(确实难为小白了,hook都不知道hook啥)②监控xhr请求,检测到符合格式的xhr请求就记录下来下载,使用selenium自动控制网页(检测不到目标格式的请求,验证下可以收到其他格式的xhr,chat说是跨域请求,不懂,这里的代码附在评论中,请求大佬指点)③使用mitmdump,网页检测不到xhr我代理总检测得到了吧,所有符合格式的请求全部保存,然后使用ffmpeg合并视频(成功)

    以下是mitmdump配合的python代码
    # mitmdump -s video.py(启用mitmdump)
    
    import os
    from mitmproxy import ctx
    
    OUTPUT_FOLDER = 'mitm_video_segments'
    os.path.exists(OUTPUT_FOLDER) or os.makedirs(OUTPUT_FOLDER)
    
    def response(flow):
        url = 'https://vip.ffzy-play7.com/20221125/6964_b388eef9/2000k/hls/'  # 替换为你要拦截的视频片段的URL前缀
        if flow.request.url.startswith(url):
            content = flow.response.content
            if not content:
                return
    
            # 获取已保存的视频片段文件数,用于命名新文件
            num_files = len(os.listdir(OUTPUT_FOLDER))
    
            # 生成文件名
            filename = f'{OUTPUT_FOLDER}/{num_files + 1:04d}.ts'  # 使用四位数格式,例如0001.ts, 0002.ts
    
            # 写入文件
            with open(filename, 'wb') as f:
                f.write(content)

    下载之后使用ffmpeg合并视频,附代码
    import os
    
    # 视频片段所在文件夹路径
    video_folder = '输入路径/mitm_video_segments'
    
    # 输出视频文件名
    output_video = 'output_video.mp4'
    
    # 构建 ffmpeg 命令
    ffmpeg_command = f'ffmpeg -i "concat:'
    
    # 遍历视频片段文件夹,构建视频片段列表
    video_files = [f for f in os.listdir(video_folder) if f.endswith('.ts')]
    for video_file in sorted(video_files):
        ffmpeg_command += f'{video_folder}/{video_file}|'
    ffmpeg_command = ffmpeg_command[:-1] + f'" -c copy "{output_video}"'
    
    # 执行 ffmpeg 命令
    os.system(ffmpeg_command)
    
    print(f'合并完成,输出文件为 {output_video}')

展望:可添加时间控制部分,一段时间没有收到url即为下载完成

评分

参与人数 1荣誉 +5 贡献 +3 收起 理由
sfqxx + 5 + 3 鱼C有你更精彩^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-5-11 16:50:33 | 显示全部楼层
首先,我要告诉你不能从盗版网站下载视频,这是违法行为。我们应该尊重版权,遵守法律。如果你想观看电影或者电视剧,建议通过合法渠道购买或者订阅。

现在,让我们回到编程方面,我可以解答一些你关于爬取网站视频的问题,并提供一些代码示例。

1. 针对不加密参数的视频片段下载:
对于不加密参数的视频片段,你可以使用`urllib.request.urlretrieve()`方法来下载。这个方法会根据给定的URL下载文件并保存到本地。以下是一个示例代码:
import urllib.request

url = "目标url"
filename = "video_segment.ts"  # 视频片段保存的文件名

try:
    urllib.request.urlretrieve(url, filename)
    print("视频片段已保存为", filename)
except Exception as e:
    print("下载失败:", e)

2. 针对加密参数的视频片段下载:
对于加密参数的视频片段,你需要先找到视频片段的URL规律,然后进行循环下载。以下是一个示例代码:
import urllib.request
import os

# 定义下载的起始和结束索引,这里下载四个片段作为演示
start_index = 1
end_index = 4

# 创建一个目录用于保存下载的片段
segment_folder = "video_segments"
if not os.path.exists(segment_folder):
    os.makedirs(segment_folder)

# 循环下载视频片段
for i in range(start_index, end_index + 1):
    # 构造当前片段的 URL
    url = f"https://example.com/video/{i}.ts"
    filename = os.path.join(segment_folder, f"{i}.ts")  # 视频片段保存的文件名

    try:
        urllib.request.urlretrieve(url, filename)
        print(f"视频片段 {filename} 已下载")
    except Exception as e:
        print(f"下载失败: {url},错误信息: {e}")

请记住,这个示例代码只是演示如何下载视频片段,并不涉及任何盗版行为。如果你要使用这些代码,请确保你有合法许可,并尊重版权。

希望这些示例对你有帮助!如果你有更多的问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-5-11 16:52:41 | 显示全部楼层
附使用selenium记录xhr失败的代码,求大佬解惑,为啥记录不到目标url,能检测到其他的xhr就是记录不到想要的那部分
# 检查页面url

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 创建 ChromeDriver 选项
chrome_options = webdriver.ChromeOptions()
# 开启无头模式
chrome_options.headless = False

# 指定 ChromeDriver 的路径
chrome_driver_path = r'D:\Python\Scripts\chromedriver-win64\chromedriver.exe'  # 将路径替换为你实际的 ChromeDriver 路径

# 使用指定的 ChromeDriver 路径和选项创建 Chrome 实例
driver = webdriver.Chrome(options=chrome_options)

# 打开网页
driver.get("https://www.xian368.top/player/199061b9ff00f060-0-0.html")  # 将网址替换为你要监控的网页地址

# 设置等待时间为20秒钟
wait = WebDriverWait(driver, 20)

# 获取所有XHR请求
xhr_requests = driver.execute_script("return window.performance.getEntriesByType('resource')")

# 打印所有XHR请求的URL
for request in xhr_requests:
    print("XHR request URL:", request['name'])

# 关闭浏览器
driver.quit()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-5-11 16:53:20 | 显示全部楼层
臧雁德 发表于 2024-05-11 16:52
附使用selenium记录xhr失败的代码,求大佬解惑,为啥 ...


你使用Selenium来监控XHR请求是一个好的尝试,但有时可能会遇到一些问题。

在你提供的代码中,你使用`window.performance.getEntriesByType('resource')`来获取所有的XHR请求。但是,这种方法并不是所有网站都支持或者返回完整的XHR请求列表。这可能是导致你无法记录到目标URL的原因之一。

另外,有些XHR请求可能是在页面加载后通过JavaScript动态生成的。在这种情况下,你需要等待XHR请求出现的时间,然后再获取它们的URL。可以使用`WebDriverWait`来等待特定的条件,例如通过`expected_conditions`模块检查特定元素是否出现。

以下是一个示例代码,演示了如何使用Selenium和WebDriverWait来等待XHR请求的出现,并记录它们的URL:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 创建 ChromeDriver 选项
chrome_options = webdriver.ChromeOptions()
# 开启无头模式
chrome_options.headless = False

# 指定 ChromeDriver 的路径
chrome_driver_path = r'D:\Python\Scripts\chromedriver-win64\chromedriver.exe'  # 将路径替换为你实际的 ChromeDriver 路径

# 使用指定的 ChromeDriver 路径和选项创建 Chrome 实例
driver = webdriver.Chrome(options=chrome_options)

# 打开网页
driver.get("https://www.xian368.top/player/199061b9ff00f060-0-0.html")  # 将网址替换为你要监控的网页地址

# 设置等待时间为20秒钟
wait = WebDriverWait(driver, 20)

# 等待XHR请求出现
xhr_requests = wait.until(EC.presence_of_all_elements_located((By.XPATH, "//entry[@resourcetype='xhr']")))

# 打印所有XHR请求的URL
for request in xhr_requests:
    url = request.get_attribute("name")
    print("XHR request URL:", url)

# 关闭浏览器
driver.quit()

这个示例代码使用`WebDriverWait`等待直到至少一个XHR请求出现,并使用XPath表达式找到它们的元素。然后,通过`get_attribute`方法获取XHR请求的URL。

请注意,这只是尝试捕获XHR请求的一种方式,具体的实现方法可能因网站的不同而有所变化。如果你的代码仍然无法记录到目标URL,那可能是因为网站采取了其他技术手段来隐藏XHR请求。在这种情况下,你可能需要进一步研究网站的工作原理,并寻找其他方法来获取目标视频片段的URL。

希望这些解释能够帮助你理解问题所在,如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-5-12 12:54:14 | 显示全部楼层

回帖奖励 +2 鱼币

1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-5-12 16:21:30 | 显示全部楼层

回帖奖励 +2 鱼币

谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-5-12 22:19:46 | 显示全部楼层

回帖奖励 +2 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-5-13 08:58:35 | 显示全部楼层

回帖奖励 +2 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-5-13 09:18:55 | 显示全部楼层

回帖奖励 +2 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-5-13 09:37:00 | 显示全部楼层

回帖奖励 +2 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-5-13 09:50:56 | 显示全部楼层

回帖奖励 +2 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-5-14 16:23:14 | 显示全部楼层

回帖奖励 +2 鱼币

sdf
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-5-16 16:53:11 | 显示全部楼层
使用 `pywin32` 库来操作 WPS Office 软件确实可以提供更底层的访问和控制能力,但由于 WPS 不像 Microsoft Office 那样公开其详尽的 COM 对象模型文档,直接找到针对 WPS 的具体操作指南可能会比较困难。不过,因为 WPS 办公软件为了兼容 Microsoft Office,很多接口和对象模型是类似的,你可以参考 Microsoft Office 的 VBA(Visual Basic for Applications)对象模型来进行尝试。

以下是一些基本步骤和思路,帮助你利用 `pywin32` 来操作 WPS:

### 1. 安装 pywin32

确保你已经安装了 `pywin32` 库,如果没有安装,可以通过 pip 安装:

```bash
pip install pywin32
```

### 2. 参考 Microsoft Office VBA 文档

虽然针对 WPS 的官方文档可能不足,但你可以查阅 Microsoft Office VBA 的文档作为替代,特别是 Excel、Word 和 PowerPoint 的对象模型。这些文档详细介绍了如何通过 VBA 控制 Office 应用的各种操作,比如打开文件、读写数据、格式化等。

- [Microsoft Office VBA 参考文档](https://docs.microsoft.com/en-us/office/vba/api/overview)

### 3. 使用 Dispatch 来创建应用程序对象

使用 `pywin32` 中的 `win32com.client.Dispatch` 方法来创建 WPS 应用程序的对象实例。比如,打开 WPS Writer(相当于 Word)可以这样开始:

```python
import win32com.client

# 创建 WPS Writer 应用程序对象
wps_app = win32com.client.Dispatch("KWPS.Application")
# 确保可见,以便观察操作过程
wps_app.Visible = True

# 新建一个文档
doc = wps_app.Documents.Add()

# 示例:向文档中写入文本
doc.Content.Text = "Hello from Python via PyWin32!"
```

注意这里的 `"KWPS.Application"` 是 WPS 应用的 ProgID,可能因版本或安装设置有所不同,如果这个 ID 不工作,你可能需要尝试其他可能的 ID,如 `"Kingsoft.WPS.Writer.11"` (数字部分可能随版本变化)。

### 4. 实验与调试

由于缺乏直接的文档,你可能需要通过尝试错误的方法来发现哪些操作是可行的。可以先从简单的任务开始,比如打开、保存、关闭文档,然后逐步尝试更复杂的操作,如格式化、表格操作等。

### 5. 社区与论坛

加入 WPS Office 或 Python相关的社区、论坛,如 Stack Overflow、GitHub、或者特定的WPS用户群,有时候其他开发者的经验分享会是宝贵的资源。

### 6. 测试与反馈

在实际操作过程中,不断测试你的代码并根据反馈调整。如果某个方法或属性在 WPS 中不工作,可能需要寻找相应的替代方案或者简化你的需求。

尽管直接使用 `pywin32` 编写针对 WPS 的脚本存在一定的挑战,但通过上述方法和不断的实践探索,你应该能够逐步克服兼容性问题,实现所需的功能。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-28 19:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表