从网站捕获视频流到fi

2024-10-01 17:38:27 发布

您现在位置:Python中文网/ 问答频道 /正文

对于我的图像分类项目,我需要收集分类的图像,对我来说,一个好的来源将是世界各地不同的网络摄像头在互联网上播放视频。像这个:

https://www.skylinewebcams.com/en/webcam/espana/comunidad-valenciana/alicante/benidorm-playa-poniente.html

我对视频流和网页抓取没有什么经验,所以在互联网上搜索信息后,我用python编写了这段天真的代码:

url='https://www.skylinewebcams.com/a816de08-9805-4cc2-94e6-2daa3495eb99'
r1 = requests.get(url, stream=True)
filename = "stream.avi"

if(r1.status_code == 200):
    with open(filename,'w') as f:
        for chunk in r1.iter_content(chunk_size=1024):
            f.write(chunk)

else:
    print("Received unexpected status code {}".format(r.status_code))

其中url地址取自网站的视频块源:

^{pr2}$

但它不起作用(avi文件为空),即使在浏览器中视频流工作良好。有谁能解释一下如何将视频流捕获到文件中吗?在


Tags: https图像comurlstream视频wwwstatus
2条回答

从那以后我有了一些进步。代码如下:

print ("Recording video...")
url='https://hddn01.skylinewebcams.com/02930601ENXS-1523680721427.ts'
r1 = requests.get(url, stream=True)
filename = "stream.avi"

num=0
if(r1.status_code == 200):
    with open(filename,'wb') as f:
        for chunk in r1.iter_content(chunk_size=1024):
            num += 1
            f.write(chunk)
            if num>5000:
                print('end')
                break

else:
    print("Received unexpected status code {}".format(r.status_code))

现在我可以在文件里写一些视频。我更改的是1)在open(文件名,'wb')中将'w'改为'wb'以写入二进制数据,但最重要的是2)更改了url。我在ChromeDevTools的“网络”中查看了浏览器发送的请求以获取实时流,并复制了最新的一个,它请求一些.ts文件。在

接下来,我了解了如何获取.ts视频文件的地址。可以这样使用m3u8模块(可由pip安装):

^{pr2}$

视频文件的播放列表将是这样的

['https://hddn04.skylinewebcams.com/02930601ENXS-1523720836405.ts',
 'https://hddn04.skylinewebcams.com/02930601ENXS-1523720844347.ts',
 'https://hddn04.skylinewebcams.com/02930601ENXS-1523720852324.ts',
 'https://hddn04.skylinewebcams.com/02930601ENXS-1523720860239.ts',
 'https://hddn04.skylinewebcams.com/02930601ENXS-1523720868277.ts',
 'https://hddn04.skylinewebcams.com/02930601ENXS-1523720876252.ts']

我可以从列表中下载每一个视频文件。在

剩下的唯一问题是,为了加载播放列表,我需要先在浏览器中打开网页。否则播放列表将是空的。打开网页可能会启动流式处理,这会在服务器上创建可以请求的m3u8文件。我仍然不知道如何从python初始化流媒体,而不在浏览器中打开页面。在

列表显示为空,因为您正在发出一个没有头的HTTP请求(这意味着您肯定是以编程方式执行的),而且大多数站点只直接响应带有403的请求。在

您应该使用像Requests或pycurl这样的库向请求添加头,它们应该可以正常工作。对于一个示例请求(带有标题),您可以在观看流媒体时打开web浏览器的开发人员控制台,找到一个m3u8 url的HTTP请求,右键单击它,然后“复制为cURL”。请注意,每个请求都可能需要发送特定于站点的任意标头。在

如果你想用不同的标题抓取多个站点,和/或想在将来证明你的代码,如果它们改变了标题、地址或格式,那么你可能需要更高级的东西。最坏的情况是,您可能需要运行一个headless浏览器来使用WebDriver/Selenium打开站点并捕获它生成请求的请求。在

请记住,您可能需要阅读每个站点的ToS,否则您可能正在执行非法活动。破坏ToS的同时进行抓取基本上是数字入侵,我认为至少craigslist已经基于这个标准赢得了诉讼。在

相关问题 更多 >

    热门问题