下面我就对“Python爬虫之App爬虫视频下载的实现”的完整攻略进行详细讲解:
目标
本文的目标是实现爬取App中的视频,并进行下载保存。具体包括以下几个步骤:
- 获取App中的视频链接
- 根据链接获取视频的下载地址
- 下载保存视频
步骤
步骤一:获取App中的视频链接
首先需要抓取App中的视频链接。这里以“抖音”App为例,使用mitmproxy进行抓包分析。具体步骤如下:
- 启动mitmproxy,并配置代理。
mitmproxy -p 8888
- 使用手机连接同一Wi-Fi网络,并设置代理为mitmproxy所在IP及端口号。
- 打开抖音App,浏览视频列表,选则要下载的视频。
- 在mitmproxy中找到该视频请求,抓取其中的参数信息,包括用户id、aweme_id和数据接口地址。
例如:
aweme_id=1234567&device_id=1234567890&iid=1234567890&channel=App Store&aid=1128&app_name=aweme&version_code=8.1.0&version_name=8.1.0&device_platform=iphone&ssmix=a&device_type=iPhone%206&os_api=12&os_version=12.1.2&screen_width=640&vid=&device_brand=Apple&app_language=zh-Hans&ac=WIFI&update_version_code=8101&openudid=1234567890123456789012345678901234567890&item_ids=123
其中,数据接口地址为:
https://aweme.snssdk.com/aweme/v1/aweme/detail
- 从抓取到的参数中,构造请求数据,并向数据接口地址发送请求,获取视频的基本信息。
例如:
import requests
headers = {
'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 12_1_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/16C101 douyin/8.1.0 WangXin/1.0.0 NetType/WIFI',
'Cookie': '',
'Referer': ''
}
data = {
'aweme_id': '1234567',
'device_id': '1234567890',
'iid': '1234567890',
'channel': 'App Store',
'aid': '1128',
'app_name': 'aweme',
'version_code': '8.1.0',
'version_name': '8.1.0',
'device_platform': 'iphone',
'ssmix': 'a',
'device_type': 'iPhone 6',
'os_api': '12',
'os_version': '12.1.2',
'screen_width': '640',
'vid': '',
'device_brand': 'Apple',
'app_language': 'zh-Hans',
'ac': 'WIFI',
'update_version_code': '8101',
'openudid': '1234567890123456789012345678901234567890',
'item_ids': '123'
}
response = requests.post('https://aweme.snssdk.com/aweme/v1/aweme/detail', headers=headers, data=data)
video_url = response.json()['aweme_detail']['video']['play_addr']['url_list'][0]
通过解析返回的数据,获取到视频的播放链接。这个链接是短链接,需要进一步转换为长链接才能下载。
步骤二:根据链接获取视频的下载地址
根据视频播放链接,可以使用Python requests库向该链接发送请求,返回的数据中包含了视频的下载地址。代码示例如下:
def get_video_download_url(video_url):
response = requests.head(video_url, allow_redirects=True)
return response.url
其中,在requests.head方法中,添加了allow_redirects=True参数,使得可以自动跟随重定向,最终获取到视频的下载地址。
步骤三:下载保存视频
最后一步是使用Python自带的urllib库进行视频下载。具体代码如下:
import urllib
def download_video(video_url, save_path):
urllib.request.urlretrieve(video_url, save_path)
其中,video_url即为上一步获取到的视频下载地址,save_path则为保存视频的路径。
示例说明
- 抓取B站App中的视频并下载
通过抓包分析,可以获取到B站App中视频播放的地址。其格式为:
https://upos-hz-mirrorakam.akamaized.net/upgcxcode/12/92/166082912/166082912-1-16.mp4?type=cdn七牛
使用步骤二中的方法,可以获取到该地址的下载链接。然后,使用步骤三中的方法,将视频下载和保存到本地。
完整代码如下:
import requests
import urllib
# 获取视频下载地址
def get_video_download_url(video_url):
response = requests.head(video_url, allow_redirects=True)
return response.url
# 下载视频
def download_video(video_url, save_path):
urllib.request.urlretrieve(video_url, save_path)
# B站App视频抓取示例
video_url = 'https://upos-hz-mirrorakam.akamaized.net/upgcxcode/12/92/166082912/166082912-1-16.mp4?type=cdn七牛'
download_url = get_video_download_url(video_url)
save_path = 'video_save_path.mp4'
download_video(download_url, save_path)
- 抓取抖音App中的视频并下载
抖音App中的视频播放链接与B站有所不同,需要使用步骤一中的方法获取视频链接信息。具体步骤已经在前面讲解过了。在此不再赘述。
完整代码如下:
import requests
import urllib
# 获取视频播放链接
def get_video_play_url():
headers = {
'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 12_1_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/16C101 douyin/8.1.0 WangXin/1.0.0 NetType/WIFI',
'Cookie': '',
'Referer': ''
}
data = {
'aweme_id': '1234567',
'device_id': '1234567890',
'iid': '1234567890',
'channel': 'App Store',
'aid': '1128',
'app_name': 'aweme',
'version_code': '8.1.0',
'version_name': '8.1.0',
'device_platform': 'iphone',
'ssmix': 'a',
'device_type': 'iPhone 6',
'os_api': '12',
'os_version': '12.1.2',
'screen_width': '640',
'vid': '',
'device_brand': 'Apple',
'app_language': 'zh-Hans',
'ac': 'WIFI',
'update_version_code': '8101',
'openudid': '1234567890123456789012345678901234567890',
'item_ids': '123'
}
response = requests.post('https://aweme.snssdk.com/aweme/v1/aweme/detail', headers=headers, data=data)
return response.json()['aweme_detail']['video']['play_addr']['url_list'][0]
# 获取视频下载地址
def get_video_download_url(video_url):
response = requests.head(video_url, allow_redirects=True)
return response.url
# 下载视频
def download_video(video_url, save_path):
urllib.request.urlretrieve(video_url, save_path)
# 抖音App视频抓取示例
video_url = get_video_play_url()
download_url = get_video_download_url(video_url)
save_path = 'video_save_path.mp4'
download_video(download_url, save_path)
以上就是“Python爬虫之App爬虫视频下载的实现”的完整攻略。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python爬虫之App爬虫视频下载的实现 - Python技术站