1. Charles获取视频接口
爬取之前先将手机与PC至于同局域网并确保手机WIFI的代理端口为8888,然后打开Charles获取视频请求的链接,如图:
2. 手动上滑触发视频请求接口
自动化滑动刷新有尝试过,但是由于技术有限,不能实现抖音APP的登录,所以用Charles只能获取视频下载链接,而不能获取其他有效信息,比如视频的名称、作者名称、获赞数、转发量等。
3. Python脚本获取视频信息
使用Python脚本拦截response爬取视频信息并下载视频,同时将视频信息存储至JSON。
4. 视频无水印
如图:
from mitmproxy import ctx
import json
import requests
import time
import os
'''
想要学习Python?Python学习交流群:984632579满足你的需求,资料都已经上传群文件,可以自行下载!
'''
def response(flow):
"""
抓取抖音标题、APP视频链接、作者、抖音ID、发布时间、获赞数、评论和转发数等信息, 并将结果保存为JSON格式.
:return: None
"""
# 通过Charles获取的抖音视频信息的URL接口
url = 'https://api.amemv.com/'
if flow.request.url.startswith(url):
# 获取服务器返回的响应
text = flow.response.text
# 转化为Json格式
dyjson = json.loads(text)
info = ctx.log.info
# 获取视频列表
aweme_list = dyjson.get('aweme_list')
# 遍历列表,获取每个视频的相应数据
for i in range(len(aweme_list)):
# 视频标题
title = aweme_list[i].get('share_info').get('share_title')
# 视频链接
videourl = aweme_list[i].get('video').get('play_addr').get('url_list')[0]
# 保存视频
res = requests.get(videourl, stream=True)
# 规范文件命名
_str = ['\\', '/', ':', '*', '?', '"', '<', '>', '|', '.', '..', '?']
for _ in _str:
if _ in title:
title.replace(_, '')
# 判断文件路径是否存在
save_dir = './video/'
if not os.path.exists(save_dir):
os.mkdir(save_dir)
with open('{}/{}.mp4'.format(save_dir, title), 'wb') as f:
f.write(res.content)
# 作者名称
nickname = aweme_list[i].get('author').get('nickname')
# 抖音ID
short_id = aweme_list[i].get('author').get('short_id')
# 发布时间
create_time = aweme_list[i].get('create_time')
# 格式化
create_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(create_time))
# 获赞、评论、转发数
digg_count = aweme_list[i].get('statistics').get('digg_count')
comment_count = aweme_list[i].get('statistics').get('comment_count')
share_count = aweme_list[i].get('statistics').get('share_count')
# 显示所有获取信息
info("标题:" + title)
info("URL:" + videourl)
info("作者: " + nickname)
info("ID: " + short_id)
info("发布时间: " + create_time)
info("获赞:" + str(digg_count))
info("评论:" + str(comment_count))
info("转发:" + str(share_count))
info('-'*80)
# 保存为json文件
data = {
'title': title,
'url': videourl,
'nickname': nickname,
'douyin_id': short_id,
'create_time': create_time,
'diggs': digg_count,
'commments': comment_count,
'shares': share_count
}
# 下载视频
with open('./douyin.json', 'a', encoding='utf-8') as f:
f.write(json.dumps(data, indent=2, ensure_ascii=False))
f.write(', \n')