干货教程:【Python】抖音采集话题/音乐/用户作品和喜欢+调用Aria2下载+fire

优采云 发布时间: 2022-11-22 16:26

  干货教程:【Python】抖音采集话题/音乐/用户作品和喜欢+调用Aria2下载+fire

  抖音集合开源仓库

  介绍

  Python 获取数据 + Vue 写入接口 + Aria2 下载

  根据抖音的各种链接或ID,通过网页界面采集视频作品并下载到本地计算机。

  支持用户主页链接或sec_uid/主题挑战和音乐配乐链接或ID。

  支持下载喜欢的列表(需要喜欢的列表可见)。

  使用0x00安装依赖项

  在程序目录中打开命令行,然后输入

  pip install -r requirements.txt

  0x01 使用界面

  双击打开启动.bat,或在程序目录中打开命令行,输入

  python ui.py

  0x02 直接修改 douyin.py 中的相关参数

  完全不懂 Python 的朋友使用命令行或操作界面。

  0x03 使用 exec.py 直接从命令行运行以查看命令列表,或使用 -h 参数查看帮助

  python exec.py

python exec.py -h

python exec.py download -h

python exec.py download_batch -h

  使用函数名称调用程序

  --type  指定下载类型,默认值:--type=user

--limit 指定采集数量,默认值:--limit=0(不限制)

  例如,采集

用户的所有作品:

  python exec.py download https://v.douyin.com/xxxx/

python exec.py download 用户的secuid

  例如,采集

用户喜欢的前 10 部作品:

  python exec.py download MS4wLjABAAAAl7TJWjJJrnu11IlllB6Mi5V9VbAsQo1N987guPjctc8 --type=like --limit=10

python exec.py download 用户的secuid

  例如,采集

音乐配乐的前 10 首作品:

  python exec.py download https://v.douyin.com/xxxx/ --type=music --limit=10

python exec.py download 音乐ID --type=music --limit=10

  TODO知识点:抖音相关Aria2相关Python相关命令行模块、火相关UI模块、pywebview相关抖音集合部分源码

  # -*- encoding: utf-8 -*-

'''

@File    :   douyin.py

@Time    :   2021年03月12日 18:16:57 星期五

@Author  :   erma0

@Version :   1.0

@Link    :   https://erma0.cn

@Desc    :   抖音用户作品采集

'''

import json

import os

import time

from urllib.parse import parse_qs, urlparse

import requests

from download import Download

class Douyin(object):

    """

    抖音用户类

    采集作品列表

    """

    def __init__(self, param: str, limit: int = 0):

        """

        初始化用户信息

        参数自动判断:ID/URL

        """

        self.limit = limit

        self.http = requests.Session()

        self.url = ''

        self.type = 'unknow'

        self.download_path = '暂未定义目录'

        # ↑ 预定义属性,避免调用时未定义 ↑

        self.param = param.strip()

        self.sign = 'TG2uvBAbGAHzG19a.rniF0xtrq'  # sign可以固定

        self.__get_type()  # 判断当前任务类型:链接/ID

        self.aria2 = Download()  # 初始化Aria2下载服务,先不指定目录了,在设置文件名的时候再加入目录

        self.has_more = True

        self.finish = False

        # 字典格式方便入库用id做key/取值/修改对应数据,但是表格都接收数组

        self.videosL = []  #列表格式

        # self.videos = {}  #字典格式

        self.gids = {}  # gid和作品序号映射

    def __get_type(self):

        """

        判断当前任务类型

        链接/ID

        """

        if '://' in self.param:  # 链接

            self.__url2redirect()

        else:  # ID

            self.id = self.param

    def __url2redirect(self):

        """

        取302跳转地址

        短连接转长链接

        """

        headers = {  # 以前作品需要解析去水印,要用到移动端UA,现在不用了

            'User-Agent':

            'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1 Edg/89.0.4389.82'

        }

        try:

            r = self.http.head(self.param, headers=headers, allow_redirects=False)

            self.url = r.headers['Location']

        except:

            self.url = self.param

    def __url2id(self):

        try:

            self.id = urlparse(self.url).path.split('/')[3]

        except:

            self.id = ''

    def __url2uid(self):

        try:

<p>

" />

            query = urlparse(self.url).query

            self.id = parse_qs(query)['sec_uid'][0]

        except:

            self.id = ''

    def get_sign(self):

        """

        网页sign算法,现在不需要了,直接固定

        """

        self.sign = 'TG2uvBAbGAHzG19a.rniF0xtrq'

        return self.sign

    def get_user_info(self):

        """

        取用户信息

        查询结果在 self.user_info

        """

        if self.url:

            self.__url2uid()

        url = 'https://www.iesdouyin.com/web/api/v2/user/info/?sec_uid=' + self.id

        try:

            res = self.http.get(url).json()

            info = res.get('user_info', dict())

        except:

            info = dict()

        self.user_info = info

        # 下载路径

        username = '{}_{}_{}'.format(self.user_info.get('short_id', '0'),

                                     self.user_info.get('nickname', '无昵称'), self.type)

        self.download_path = Download.title2path(username)  # 需提前处理非法字符串

    def get_challenge_info(self):

        """

        取话题挑战信息

        查询结果在 self.challenge_info

        """

        if self.url:

            self.__url2id()

        url = 'https://www.iesdouyin.com/web/api/v2/challenge/info/?ch_id=' + self.id

        try:

            res = self.http.get(url).json()

            info = res.get('ch_info', dict())

        except:

            info = dict()

        self.challenge_info = info

        # 话题挑战下载路径

        username = '{}_{}_{}'.format(self.challenge_info.get('cid', '0'),

                                     self.challenge_info.get('cha_name', '无标题'), self.type)

        self.download_path = Download.title2path(username)  # 需提前处理非法字符串

    def get_music_info(self):

        """

        取音乐原声信息

        查询结果在 self.music_info

        """

        if self.url:

            self.__url2id()

        url = 'https://www.iesdouyin.com/web/api/v2/music/info/?music_id=' + self.id

        try:

            res = self.http.get(url).json()

            info = res.get('music_info', dict())

        except:

            info = dict()

        self.music_info = info

        # 音乐原声下载路径

        username = '{}_{}_{}'.format(self.music_info.get('mid', '0'), self.music_info.get('title', '无标题'),

                                     self.type)

        self.download_path = Download.title2path(username)  # 需提前处理非法字符串

    def crawling_users_post(self):

        """

        采集用户作品

        """

        self.type = 'post'

        self.__crawling_user()

    def crawling_users_like(self):

        """

        采集用户喜欢

        """

        self.type = 'like'

        self.__crawling_user()

    def crawling_challenge(self):

        """

        采集话题挑战

        """

        self.type = 'challenge'

        self.get_challenge_info()  # 取当前信息,用做下载目录

        # https://www.iesdouyin.com/web/api/v2/challenge/aweme/?ch_id=1570693184929793&count=9&cursor=9&aid=1128&screen_limit=3&download_click_limit=0&_signature=AXN-GQAAYUTpqVxkCT6GHQFzfg

        url = 'https://www.iesdouyin.com/web/api/v2/challenge/aweme/'

        cursor = '0'

        while self.has_more:

            params = {

                "ch_id": self.id,

                "count": "21",  # 可调大 初始值:9

                "cursor": cursor,

                "aid": "1128",

                "screen_limit": "3",

                "download_click_limit": "0",

                "_signature": self.sign

            }

            try:

                res = self.http.get(url, params=params).json()

                cursor = res['cursor']

                self.has_more = res['has_more']

                self.__append_videos(res)

            except:

                print('话题挑战采集出错')

  

        print('话题挑战采集完成')

    def crawling_music(self):

        """

        采集音乐原声

        """

        self.type = 'music'

        self.get_music_info()  # 取当前信息,用做下载目录

        # https://www.iesdouyin.com/web/api/v2/music/list/aweme/?music_id=6928362875564067592&count=9&cursor=18&aid=1128&screen_limit=3&download_click_limit=0&_signature=5ULmIQAAhRYNmMRcpDm2COVC5j

        url = 'https://www.iesdouyin.com/web/api/v2/music/list/aweme/'

        cursor = '0'

        while self.has_more:

            params = {

                "music_id": self.id,

                "count": "21",  # 可调大 初始值:9

                "cursor": cursor,

                "aid": "1128",

                "screen_limit": "3",

                "download_click_limit": "0",

                "_signature": self.sign

            }

            try:

                res = self.http.get(url, params=params).json()

                cursor = res['cursor']

                self.has_more = res['has_more']

                self.__append_videos(res)

            except:

                print('音乐原声采集出错')

        print('音乐原声采集完成')

    def __crawling_user(self):

        """

        采集用户作品/喜欢

        """

        self.get_user_info()  # 取当前用户信息,昵称用做下载目录

        max_cursor = 0

        # https://www.iesdouyin.com/web/api/v2/aweme/like/?sec_uid=MS4wLjABAAAAaJO9L9M0scJ_njvXncvoFQj3ilCKW1qQkNGyDc2_5CQ&count=21&max_cursor=0&aid=1128&_signature=2QoRnQAAuXcx0DPg2DVICdkKEY&dytk=

        # https://www.iesdouyin.com/web/api/v2/aweme/post/?sec_uid=MS4wLjABAAAAaJO9L9M0scJ_njvXncvoFQj3ilCKW1qQkNGyDc2_5CQ&count=21&max_cursor=0&aid=1128&_signature=DrXeeAAAbwPmb.wFM3e63w613m&dytk=

        url = 'https://www.iesdouyin.com/web/api/v2/aweme/{}/'.format(self.type)

        while self.has_more:

            params = {

                "sec_uid": self.id,

                "count": "21",

                "max_cursor": max_cursor,

                "aid": "1128",

                "_signature": self.sign,

                "dytk": ""

            }

            try:

                res = self.http.get(url, params=params).json()

                max_cursor = res['max_cursor']

                self.has_more = res['has_more']

                self.__append_videos(res)

            except:

                print('作品采集出错')

        print('作品采集完成')

    def __append_videos(self, res):

        """

        数据入库

        """

        if res.get('aweme_list'):

            for item in res['aweme_list']:

                info = item['statistics']

                info.pop('forward_count')

                info.pop('play_count')

                info['desc'] = Download.title2path(item['desc'])  # 需提前处理非法字符串

                info['uri'] = item['video']['play_addr']['uri']

                info['play_addr'] = item['video']['play_addr']['url_list'][0]

                info['dynamic_cover'] = item['video']['dynamic_cover']['url_list'][0]

                info['status'] = 0  # 下载进度状态;等待下载:0,下载中:0.xx;下载完成:1

                # 列表格式

                self.videosL.append(info)

                # 字典格式

                # self.videos[info['aweme_id']] = info

                # 此处可以直接添加下载任务,不过考虑到下载占用网速,影响采集过程,所以采集完再下载

            if self.limit:

                more = len(self.videos) - self.limit

                if more >= 0:

                    # 如果给出了限制采集数目,超出的删除后直接返回

                    self.has_more = False

                    # 列表格式

                    self.videosL = self.videosL[:self.limit]

                    # 字典格式

                    # for i in range(more):

                    #     self.videos.popitem()

                    # return

        else:  # 还有作品的情况下没返回数据则进入这里

            print('未采集完成,但返回作品列表为空')

    def download_all(self):

        """

        作品抓取完成后,统一添加下载任务

        可选择在外部注册回调函数,*敏*感*词*下载任务状态

        """

        for id, video in enumerate(self.videosL):

            # for id, video in self.videos.items():

            gid = self.aria2.download(url=video['play_addr'],

                                      filename='{}/{}_{}.mp4'.format(self.download_path, video['aweme_id'],

                                                                     video['desc'])

                                      # ,options={'gid': id}  # 指定gid

                                      )

            self.gids[gid] = id  # 因为传入gid必须16位,所以就不指定gid了,另存一个字典映射

        print('下载任务投递完成')</p>

  技巧:拼多多大神是怎么复制抖音爆款上传到自己店铺的?这个工具无需授权

  随着抖音小店的火爆,不少拼多多商家开始在抖音上寻找爆款商品,急需一款抖音宝到拼多多小店收款的工具。

  今天要跟大家分享的是一款支持斗尚拼的工具。不仅可以采集复制宝物上架,还可以采集宝物进行分析优化。下面我主要介绍大家用的比较多的3个工具:

  ①宝贝复制:一键复制抖音小店宝贝上传至拼多多,支持批量采集

,可快速完成发货!

  工具支持多次开启,无需授权,不绑定电脑。店铺团版支持5-200家店铺!

  ②图片处理器:抖音店铺宝贝图片一键采集

  工具限时免费,快来试用吧~

  本工具可以一键采集下载淘喜、拼多多、京东、豆店宝的主图、sku图、详情页、750详情图、主图视频、搜索列表展示图等,还可以自动拼接详情图片。

  宝贝优化过程中,卖家可以采集竞品宝贝图片进行分析,并一键导出数据,方便美工学习和模仿。

  ③宝贝详情(评论/sku/买家秀/问大家)分析器:一键采集

抖音店铺宝贝评论/sku/买家秀/问大家

  工具限时免费,快来试用吧~

  一键采集

淘喜、拼多多、京东、豆店等各大平台评论、sku占比分析、下载买家秀等,并支持一键拆分评论根、根占比分析、挖掘产品卖点。重点采集

问大家,分析买家痛点。

  工具免费分享,有需要的卖家可以免费试用!

  下面,小编就为大家详细讲解一下拼多多宝贝复制工具的使用方法:

  1.采集

宝贝

  数据来源包括淘宝/天猫、1688、抖音小店、拼多多批发等平台。也就是说,卖家可以在淘宝、1688、抖音小店、批发商上采集

宝贝并上传到自己的店铺。

  工具限时免费,快来试用吧~

  淘宝平台采集宝贝数据,需要登录普通买家账号。如果采集

太多,可以在多个帐户之间切换。1688和淘宝账号一样。

  无需登录即可采集

拼多多批发宝贝数据。如果您采集

了拼多多宝贝的数据,可以通过手机号和token登录。

  多多宝的采集

方式可以通过关键词和分类采集

,也可以全店采集

、其他平台采集

、复制或批量导入。

  2.上传配置

  宝贝收好后,进入配置页面:

  

" />

  工具限时免费,快来试用吧~

  还没有收到工具的卖家可以免费试用,还有限时会员权限!

  一、价格

  拼多多上的商品价格包括单价、单价、折扣价、最低SKU价等,采集

淘宝宝贝一般默认为折扣价,折扣价显示如下图:

  如果优惠价格是临时活动,没有优惠后,源链接价格会上涨。

  拼多多默认单价,可以通过加百分比、加减固定金额、指定价格等方式设置。

  工具限时免费,快来试用吧~

  2. 图片

  主图可以默认不处理,也可以选择以下几张作为主图。采集到的淘宝宝贝只有5张主图,工具可以自动补全10张主图。

  细节图也可以不处理,也可以去掉指定位置的地图,保留编号,也可以插入自定义细节图,自定义细节加水印。

  对于采集到的淘宝宝贝,高度超过1500的详细图片可以自动压缩分割,压缩可以减少图片空间的占用。

  注意:处理图片时,一定要勾选【使用图片空间上传图片】!如果你复制视频,你需要有上传视频的权限!

  3.标题

  标题设置包括标题清词(启用本地自定义过滤)、标题过滤词、标题替换(宝贝ID=新标题)等。标题可以通过添加前缀/后缀或直接替换来处理。

  可以设置新标题只保留采集

宝贝标题前的字符数。特殊分类支持长标题校验【上传宝贝标题支持10个字符】。

  标题重组可以分裂根,随机打乱和重组。

  4.类别

  因为商品类目是跨平台的,只是部分商品的类目分类会有所不同。需要手动指定四级类别(每个类别级别都必须选择),但大多数情况下默认匹配上一个类别。

  5.单品

  SKU规格配置,不同平台有不同的SKU属性,可以过滤/替换符号和违禁词,自动分割SKU名称和备注,商家也可以自定义SKU。

  注意:如果没有sku,默认添加一个sku,最大数量限制为24个!

  6.属性

  

" />

  商品类型可根据实际情况选择,如普通商品、虚拟商品、*敏*感*词*商品、积分卡或海外抄送个人邮寄等。

  设置品牌(可以选择不使用该品牌或更换其他品牌),设置产品编码,是否支持假一赔十,7天无理由,坏了赔,是否秒-手/虚拟产品,您还可以自定义属性。

  7. 运输

  商家可以设置物流重量、物流类型、发货时间。

  还没有收到工具的卖家,点击↓即可免费试用!

  3.上传

  点击保存设置后,会跳转至上传页面,如下图:

  工具限时免费,快来试用吧~

  卖家可以通过浏览器操作将宝贝信息上传至列表,保存至草稿箱,或直接上架。如果上传失败,则不会保存到草稿箱。

  此外,该页面还可以清空上传列表,删除勾选的宝贝,去除上传成功导出失败的链接,选择运费模板,一键勾选跳过重复上传的宝贝。

  繁琐的操作也变得简单方便。通过工具装货,不仅可以解放双手,还可以减少失误,大大提高工作效率。

  4.宝贝管理

  对于店铺宝贝,卖家可以在宝贝列表中选择时间范围内的店铺、类目、商品id数据,批量下架、修改价格和库存等,一键删除/清空宝贝。

  工具限时免费,快来试用吧~

  可设置清洁宝贝的创建时间、访问人数、采集

人数、销量等,并可一键导出数据,查看修改失败记录。

  注:右键列表可以查看上一个宝贝的链接。

  五、服务保障

  这款宝贝复制工具不仅功能稳定,而且还有完善的服务体系。多名技术人员24/7在线,随时处理用户问题。

  无论是工具安装问题,还是日常操作问题,卖家总能找到工作人员实时沟通。

  同时,工具技术团队会定期采集

用户需求,进行有针对性的开发和研发,并保持工具功能版本不断更新,满足大家对商品的需求。

  如果您需要工具,可以免费试用!

  以上是宝贝复制工具的概况。功能稳定,服务保障完善。商户可以轻松完成装货操作,大大提高工作效率。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线