使用Python爬虫爬取某视频素材网站视频资源
2021/9/13 17:34:54
本文主要是介绍使用Python爬虫爬取某视频素材网站视频资源,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
最近在学视频剪辑,从网上找了很多视频素材,也发现了一些好的素材网站,比如这个网站:www.mazwai.com,就有很多免费的高清视频素材。我有时想获取通过某个关键字搜索到的所有相关视频素材的信息,手工点击效率太低,正好最近在学python爬虫,于是想到了用爬虫来获取视频素材信息。
比如我想搜索无人机相关的视频,我在搜索框里输入drone,出来的网址是这样的。
我们打开chrome的开发者工具,刷新网页,可以看到第一条请求的响应,其中就包括了很多视频素材的信息。
随着我们把页面往下拉,我们看到有新的视频素材被刷新出来,这让我们想到页面是通过ajax异步更新的,我们选择XHR来查看ajax请求。
首先第一条,我们分析了一下,没有我们网页上的视频信息,应该是一个外链信息,我们用不上,我们直接看后面的请求。后面每一条请求格式看起来都一样,我们拿第一个来分析一下。
我们可以看到这是一个GET类型的请求,请求的参数有两个:path和params。其中params的值又是一个字典,里面又包含了很多其他参数。我们再对比一下其他请求的参数可以发现,path参数内容完全一致,params参数中只有pge和offset_resp_videos在更新。并且pge值从1更新到4后就不再改变,而offset_resp_videos更新到106后也不再改变。
我们进一步分析了一下响应,当pge是1和2时,每条响应都包含30个视频信息,当pge是3时,只有9条视频信息,当pge是4时,已经没有视频信息了。这说明当pge=3时,所有的视频信息都已经获取完毕。所以我们模拟ajax获取视频信息时,pge的范围是1-3,而通过分析也可以得出:offset_resp_videos=(pge-1) * 30 + 37,此时我们就可以构造出通过python模拟ajax请求时的url了。
我们通过查看Elements信息,可以看到每个视频的html信息。
其中通过静态请求获取的是前30个视频,其余的是通过ajax异步请求获取。静态获取的是html格式,我们可以直接解析;通过ajax获取的响应是json格式,我们需要用json库来处理,获取其中的视频信息的html文本。
可以看到ajax的响应中,elements元素是个列表,其中的每个元素就是视频信息的html文本,与静态网页中的格式相同,所以我们需要用json库来获取ajax响应中的视频信息元素。
对于视频素材,我们比较关心的包括id,时长,分辨率,标题,预览图链接,视频链接。我们可以通过xpath来获取相关信息。
下面是相关代码:
from urllib.parse import urlencode import requests import json from lxml import etree import time import csv items = [] headers = { 'Host': 'mazwai.com', 'Referer': 'https://mazwai.com/stock-video-footage/drone', 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36', 'X-Requested-With': 'XMLHttpRequest', } # 获取静态网页 def get_first_page(): base_url = "https://mazwai.com/stock-video-footage/drone" try: rsp = requests.get(base_url, headers=headers) if rsp.status_code == 200: return rsp.text except requests.ConnectionError as e: print('Error:', e.args) # 解析静态网页 def parse_html_result(result): html = etree.HTML(result) elements = html.xpath('//div[contains(@class, "video-responsive")]') print(len(elements)) for element in elements: element = etree.HTML(etree.tostring(element)) parse_html_element(element) # 模拟ajax请求获取动态网页 def get_follow_page(page, start_idx): base_url = "https://mazwai.com/api/?" params = '{' + '"pge":{},"recordsPerPage":30,"recordsPerPage":30,"rec":30,"json_return":true,"infinite_scroll": true,"offset_resp_videos":{},"category": "drone"'.format(page, start_idx + (page-1)*30) + '}' total = { 'path': 'elasticsearch/listResults', 'params': params } url = base_url + urlencode(total) print(url) try: rsp = requests.get(url, headers=headers) if rsp.status_code == 200: return rsp.text except requests.ConnectionError as e: print('Error:', e.args) # 解析ajax响应 def parse_json_result(result): rsp = json.loads(result) for element in rsp['elements']: element = etree.HTML(element) parse_html_element(element) # 解析包含视频信息的单个元素 def parse_html_element(element): item = [] id = element.xpath('//div[contains(@class, "video-responsive")]/@id') imgsrc = element.xpath('//img/@src') videosrc = element.xpath('//img/@data-video-source') title = element.xpath('//img/@title') duration = element.xpath('//div[@class="video-resolution-length-info"]/span[@class="duration"]/text()') resolution = element.xpath('//div[@class="video-resolution-length-info"]/span[@class="resolution"]/text()') item.append(id[0]) item.append(title[0]) item.append(duration[0]) item.append(resolution[0]) item.append(imgsrc[0]) item.append(videosrc[0]) items.append(item) def write_csv(): with open('data.csv', 'w') as csvfile: writer = csv.writer(csvfile) writer.writerow(['id', 'title', 'duration', 'resolution', 'img_url', 'video_url']) writer.writerows(items) # 主函数 def main(): # 获取第一页并解析 result = get_first_page() if result is not None: parse_html_result(result) time.sleep(2) # 获取后续页并解析 for page in range(1, 4): result = get_follow_page(page, 37) parse_json_result(result) time.sleep(2) # 存成csv文件 write_csv() if __name__ == '__main__': main()
执行结果:
最终把提取到的信息存成csv文件,后续也可以通过链接自动下载图片和视频文件进行保存。
我们可以通过修改程序支持输入关键字信息爬取其他的搜索信息,并且通过总条数自动计算需要爬取多少页,这里不再赘述。
这篇关于使用Python爬虫爬取某视频素材网站视频资源的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-14获取参数学习:Python编程入门教程
- 2024-11-14Python编程基础入门
- 2024-11-14Python编程入门指南
- 2024-11-13Python基础教程
- 2024-11-12Python编程基础指南
- 2024-11-12Python基础编程教程
- 2024-11-08Python编程基础与实践示例
- 2024-11-07Python编程基础指南
- 2024-11-06Python编程基础入门指南
- 2024-11-06怎么使用python 计算两个GPS的距离功能-icode9专业技术文章分享