Python爬取 "抖音" App短视频信息

1. Charles获取视频接口

 爬取之前先将手机与PC至于同局域网并确保手机WIFI的代理端口为8888,然后打开Charles获取视频请求的链接,如图:

video_url

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')

 

### Python API 开发教程 #### 获取视频基础数据 对于想要利用Python进行API开发并获取视频的基础数据,可以参照官方文档提供的指南。开发者需先注册成为⾳开放平台成员,并申请相应的权限来访问所需的数据接口[^1]。 ```python import requests def get_video_basic_data(video_id, access_token): url = f"https://open.douyin.com/video/data/?video_ids={video_id}" headers = { 'Content-Type': 'application/json', 'Authorization': f'Bearer {access_token}' } response = requests.get(url=url, headers=headers) data = response.json() return data ``` 此函数展示了如何发送HTTP GET请求至指定URL以取得特定ID下的视频基本信息,同时包含了必要的头部信息用于身份验证。 #### 获取视频点赞数据 除了基本资料外,有时也需要收集用户的互动情况比如点赞数量。这同样可以通过调用API实现,不过需要注意的是,仅限于最近三十天内创建的内容才会有记录可查[^3]。 ```python def get_like_data(video_id, start_date, end_date, access_token): url = "https://open.douyin.com/aweme/v1/statistics/item/" params = { 'item_ids': video_id, 'start_time': int(start_date.timestamp()), 'end_time': int(end_date.timestamp()) } headers = {'Authorization': f'Bearer {access_token}'} resp = requests.post(url=url, json=params, headers=headers).json() likes_info = resp.get('data', []) return likes_info ``` 上述代码片段演示了怎样向服务器提交POST请求去查询某时间段内的点赞详情,其中时间戳转换是为了满足API参数的要求。 #### 处理无水印视频下载链接 当涉及到更复杂的场景如提供无水印版本的视频文件供用户下载时,则可能遇到跨域资源共享(CORS)等问题导致403错误发生。解决办法之一是在服务端设置正确的响应头允许前端发起安全请求;另一种方式则是调整客户端脚本确保正确解析由后端传来的JSON对象作为资源路径[^4]。 ```python from django.http import JsonResponse import json def prepare_download_link(request): download_url = "http://example.com/path/to/file" desc = "Description of the file." # JSON序列化处理后的字符串可以直接嵌入HTML模板中被JavaScript读取 context = { 'download_url': json.dumps(download_url), 'desc': json.dumps(desc) } return render(request, 'douyin.html', context=context) # HTML部分省略... <script type="text/javascript"> function download(){ window.open({{ download_url|safe }}); } </script> ``` 这段例子说明了在Django框架下准备可供点击触发下载动作所需的环境配置以及页面渲染逻辑,特别强调了`json.dumps()`方法的重要性及其作用范围延伸到了视图层与模版间的交互过程之中。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值