基于chat爬取盗版网站视频(小白第一次行动)
记录分享第一次下视频{:5_109:}一.
某天发现不清楚是谁在我的浏览器中给我收藏了一个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/20221125/6964_b388eef9/2000k/hls/2fabd183470000113.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 =
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. 针对不加密参数的视频片段下载:
对于不加密参数的视频片段,你可以使用`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 小助理,如未能正确解答您的问题,请继续追问。 附使用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() 臧雁德 发表于 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 小助理,如未能正确解答您的问题,请继续追问。 1 {:10_256:} {:10_277:} {:10_279:}{:10_279:}{:10_279:}{:10_279:} {:10_256:}{:10_256:}{:10_256:} {:10_256:}{:10_256:}{:10_256:}{:10_256:}{:10_256:} sdf 使用 `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 应用的各种操作,比如打开文件、读写数据、格式化等。
- (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 的脚本存在一定的挑战,但通过上述方法和不断的实践探索,你应该能够逐步克服兼容性问题,实现所需的功能。 {:7_113:}
页:
[1]