Pythonを使ってTikTokからユーザーの動画情報を取得する

プログラミング

「TikTokの動画の再生数やいいね数を取得したい」
「TikTokのスクレイピングが上手くいかない」
「PythonでTikTokのデータを収集したい」

このような場合には、この記事の内容が参考になります。
この記事では、TikTokから動画情報を取得する方法を解説しています。

本記事の内容

  • 動画情報取得について
  • TikTokApi
  • s_v_web_id
  • ユーザーの動画情報を取得する

それでは、上記に沿って解説していきます。

動画情報取得について

最初に、今回TikTokから取得するデータを明確にしておきます。

基本的には、公開されているデータを取得できます。
例えば、次のような動画があります。

動画URLはもちろん、動画説明のテキスト情報などを取得できます。
あとは、再生数、いいね数なども取得可能です。

長いですが、実際に取得できるデータは以下。

{'id': '7020677135996161282', 'desc': '大学芋風🥰 #さつまいもの塩キャラメルカリカリ #さつまいも #塩キャラメル #キャラメル #大学芋 #tiktokレシピ #料理動画 #デリッシュキッチン #delishkitchen', 'createTime': 1634628778, 'video': {'id': '7020677135996161282', 'height': 1024, 'width': 576, 'duration': 19, 'ratio': '720p', 'cover': 'https://p77-sign-sg.tiktokcdn.com/obj/tos-alisg-p-0037/14708f66332140c6801d420bb37cb951?x-expires=1635220800&x-signature=0AHFj6hw%2FcBpvC3EQyKPUB%2Bi1YI%3D', 'originCover': 'https://p16-sign-sg.tiktokcdn.com/obj/tos-alisg-p-0037/a5de2e6ac5a94105aa42b3c8cd9eecf5_1634628779?x-expires=1635220800&x-signature=e%2FIetfWw7FiXAaNaf27%2B63pQiuU%3D', 'dynamicCover': 'https://p16-sign-sg.tiktokcdn.com/obj/tos-alisg-p-0037/6ba54fa9c2ae4b3988203ada1a73071a_1634628779?x-expires=1635220800&x-signature=Gp%2FM5tlWSezDkA%2Fopj2GBXiNHw8%3D', 'playAddr': 'https://v16-web.tiktok.com/video/tos/alisg/tos-alisg-pve-0037/158b27b217634a959145f6c754728f0f/?a=1988&br=3944&bt=1972&cd=0%7C0%7C1&ch=0&cr=0&cs=0&cv=1&dr=3&ds=3&er=&expire=1635223831&ft=9wMeReBO4kag3&l=202110252250120101902182222F0C23AA&lr=tiktok&mime_type=video_mp4&net=0&pl=0&policy=3&qs=0&rc=Mzpkb2c6Zjk6ODMzODgzNEApOjYzNzg7PDw1N2hpOjllZmdecnEvcjRvNmtgLS1kLy1zczMuL2EwNGIwYF4wXi0xXzY6Yw%3D%3D&signature=724d2836917338e9f2ace8ae7c36ab24&tk=0&vl=&vr=', 'downloadAddr': 'https://v16-web.tiktok.com/video/tos/alisg/tos-alisg-pve-0037/158b27b217634a959145f6c754728f0f/?a=1988&br=3944&bt=1972&cd=0%7C0%7C1&ch=0&cr=0&cs=0&cv=1&dr=3&ds=3&er=&expire=1635223831&ft=9wMeReBO4kag3&l=202110252250120101902182222F0C23AA&lr=tiktok&mime_type=video_mp4&net=0&pl=0&policy=3&qs=0&rc=Mzpkb2c6Zjk6ODMzODgzNEApOjYzNzg7PDw1N2hpOjllZmdecnEvcjRvNmtgLS1kLy1zczMuL2EwNGIwYF4wXi0xXzY6Yw%3D%3D&signature=724d2836917338e9f2ace8ae7c36ab24&tk=0&vl=&vr=', 'shareCover': ['', 'https://p16-sign-sg.tiktokcdn.com/tos-alisg-p-0037/a5de2e6ac5a94105aa42b3c8cd9eecf5_1634628779~tplv-tiktok-play.jpeg?x-expires=1635220800&x-signature=iVvM3gcrPVaks80LnCY%2FMGzZW20%3D', 'https://p16-sign-sg.tiktokcdn.com/tos-alisg-p-0037/a5de2e6ac5a94105aa42b3c8cd9eecf5_1634628779~tplv-tiktokx-share-play.jpeg?x-expires=1635220800&x-signature=s3WwGtO4p3hlaCxsFpgpeFAmH1s%3D'], 'reflowCover': 'https://p16-sign-sg.tiktokcdn.com/obj/tos-alisg-p-0037/14708f66332140c6801d420bb37cb951?x-expires=1635220800&x-signature=gANGihrLXGxkY3M%2BgCAZwscprro%3D', 'bitrate': 2019788, 'encodedType': 'normal', 'format': 'mp4', 'videoQuality': 'normal', 'encodeUserTag': '', 'codecType': 'h264', 'definition': '720p'}, 'author': {'id': '6815178063489795073', 'uniqueId': 'delishkitchen', 'nickname': 'デリッシュキッチン【公式】', 'avatarThumb': 'https://p16-sign-sg.tiktokcdn.com/aweme/100x100/tiktok-obj/1663862298807298.jpeg?x-expires=1635285600&x-signature=BjXx7gyWp6%2BMwhsDF9PwZtR%2FZhA%3D', 'avatarMedium': 'https://p16-sign-sg.tiktokcdn.com/aweme/720x720/tiktok-obj/1663862298807298.jpeg?x-expires=1635285600&x-signature=zE7kIDvS5CrIAYqUKwFuKz3mLK4%3D', 'avatarLarger': 'https://p77-sign-sg.tiktokcdn.com/aweme/1080x1080/tiktok-obj/1663862298807298.jpeg?x-expires=1635285600&x-signature=4%2BqG6GjQ3Jsgz5kTpet%2FrAV%2BHZ0%3D', 'signature': '簡単おかずや時短レシピを動画でお届け🍳\n手抜きに見えないおいしい料理を紹介しています✨', 'verified': True, 'secUid': 'MS4wLjABAAAAn4P3ufwhsl9ZIIPkHg7H-0Un48XB05bc-L6XqHJ-wh2YQYhQ1B0gNRwJZ_NhNDlP', 'secret': False, 'ftc': False, 'relation': 0, 'openFavorite': False, 'commentSetting': 0, 'duetSetting': 0, 'stitchSetting': 0, 'privateAccount': False}, 'music': {'id': '7013284311893805057', 'title': 'Yu-Ke', 'playUrl': 'https://sf16-ies-music-va.tiktokcdn.com/obj/tos-useast2a-ve-2774/731aa21729054aa286cacdc79229f1c3', 'coverThumb': 'https://p16-amd-va.tiktokcdn.com/img/tos-useast2a-v-2774/fbf34e9f0d394c14b3bbb8e6bd284948~c5_100x100.jpeg', 'coverMedium': 'https://p16-amd-va.tiktokcdn.com/img/tos-useast2a-v-2774/fbf34e9f0d394c14b3bbb8e6bd284948~c5_200x200.jpeg', 'coverLarge': 'https://p16-amd-va.tiktokcdn.com/img/tos-useast2a-v-2774/fbf34e9f0d394c14b3bbb8e6bd284948~c5_720x720.jpeg', 'authorName': 'LiSA', 'original': False, 'duration': 30, 'album': 'Yu-Ke'}, 'challenges': [{'id': '7020676385748287489', 'title': 'さつまいもの塩キャラメルカリカリ', 'desc': '', 'profileThumb': '', 'profileMedium': '', 'profileLarger': '', 'coverThumb': '', 'coverMedium': '', 'coverLarger': '', 'isCommerce': False}, {'id': '5934520', 'title': 'さつまいも', 'desc': '', 'profileThumb': '', 'profileMedium': '', 'profileLarger': '', 'coverThumb': '', 'coverMedium': '', 'coverLarger': '', 'isCommerce': False}, {'id': '1595808050686978', 'title': '塩キャラメル', 'desc': '', 'profileThumb': '', 'profileMedium': '', 'profileLarger': '', 'coverThumb': '', 'coverMedium': '', 'coverLarger': '', 'isCommerce': False}, {'id': '204396', 'title': 'キャラメル', 'desc': '', 'profileThumb': '', 'profileMedium': '', 'profileLarger': '', 'coverThumb': '', 'coverMedium': '', 'coverLarger': '', 'isCommerce': False}, {'id': '85604972', 'title': '大学芋', 'desc': '', 'profileThumb': '', 'profileMedium': '', 'profileLarger': '', 'coverThumb': '', 'coverMedium': '', 'coverLarger': '', 'isCommerce': False}, {'id': '1609646471352322', 'title': 'tiktokレシピ', 'desc': '10月7日(木)〜10月20日(水)の14日間、TikTokレシピ大賞を実施します🌰🥕募集部門は素早く簡単に作れる「#簡単レシピ」、おうちで作れるクオリティの高い「#お菓子作り」、低カロリーでダイエットにぴったりの「#ダイエット飯」、定番レシピや商品にひと手間加えた「#アレンジレシピ」、CapCutを使ってレシピ動画作成した「#capcut」です。「#TikTokレシピ」+応募したい部門のハッシュタグをつけて動画を投稿するだけで参加できます。入賞者には料理がさらに楽しくなる調理器具をプレゼントします🍳🥘\n詳しくはこちら:https://activity.tiktok.com/magic/eco/runtime/release/615ab6c9539a020316458b18?appType=tiktok', 'profileThumb': 'https://p16-sg.tiktokcdn.com/obj/tiktok-obj/38f6e0a9bd1c59483093af7c0b15085e', 'profileMedium': 'https://p16-sg.tiktokcdn.com/obj/tiktok-obj/38f6e0a9bd1c59483093af7c0b15085e', 'profileLarger': 'https://p16-sg.tiktokcdn.com/obj/tiktok-obj/38f6e0a9bd1c59483093af7c0b15085e', 'coverThumb': 'https://p16-sg.tiktokcdn.com/obj/tiktok-obj/4c4932dfbf92e478a1a87a24407ef5af', 'coverMedium': 'https://p16-sg.tiktokcdn.com/obj/tiktok-obj/4c4932dfbf92e478a1a87a24407ef5af', 'coverLarger': 'https://p16-sg.tiktokcdn.com/obj/tiktok-obj/4c4932dfbf92e478a1a87a24407ef5af', 'isCommerce': False}, {'id': '1596142481648641', 'title': '料理動画', 'desc': '見ているだけでためになる?癒される?そんな調理中の様子を撮影して投稿しよう!🍽', 'profileThumb': 'https://p16-sg.tiktokcdn.com/obj/tiktok-obj/01138e3203708cc9154029139122f39d', 'profileMedium': 'https://p16-sg.tiktokcdn.com/obj/tiktok-obj/01138e3203708cc9154029139122f39d', 'profileLarger': 'https://p16-sg.tiktokcdn.com/obj/tiktok-obj/01138e3203708cc9154029139122f39d', 'coverThumb': 'https://p16-sg.tiktokcdn.com/obj/tiktok-obj/a92a4a02bab0f8da6d06b971daf82354', 'coverMedium': 'https://p16-sg.tiktokcdn.com/obj/tiktok-obj/a92a4a02bab0f8da6d06b971daf82354', 'coverLarger': 'https://p16-sg.tiktokcdn.com/obj/tiktok-obj/a92a4a02bab0f8da6d06b971daf82354', 'isCommerce': False}, {'id': '1618753442231298', 'title': 'デリッシュキッチン', 'desc': '', 'profileThumb': '', 'profileMedium': '', 'profileLarger': '', 'coverThumb': '', 'coverMedium': '', 'coverLarger': '', 'isCommerce': False}, {'id': '1627421967227905', 'title': 'delishkitchen', 'desc': '', 'profileThumb': '', 'profileMedium': '', 'profileLarger': '', 'coverThumb': '', 'coverMedium': '', 'coverLarger': '', 'isCommerce': False}], 'stats': {'diggCount': 5685, 'shareCount': 196, 'commentCount': 10, 'playCount': 142600}, 'duetInfo': {'duetFromId': '0'}, 'originalItem': False, 'officalItem': False, 'textExtra': [{'awemeId': '', 'start': 7, 'end': 24, 'hashtagName': 'さつまいもの塩キャラメルカリカリ', 'hashtagId': '7020676385748287489', 'type': 1, 'userId': '', 'isCommerce': False, 'userUniqueId': '', 'secUid': '', 'subType': 0}, {'awemeId': '', 'start': 25, 'end': 31, 'hashtagName': 'さつまいも', 'hashtagId': '5934520', 'type': 1, 'userId': '', 'isCommerce': False, 'userUniqueId': '', 'secUid': '', 'subType': 0}, {'awemeId': '', 'start': 32, 'end': 39, 'hashtagName': '塩キャラメル', 'hashtagId': '1595808050686978', 'type': 1, 'userId': '', 'isCommerce': False, 'userUniqueId': '', 'secUid': '', 'subType': 0}, {'awemeId': '', 'start': 40, 'end': 46, 'hashtagName': 'キャラメル', 'hashtagId': '204396', 'type': 1, 'userId': '', 'isCommerce': False, 'userUniqueId': '', 'secUid': '', 'subType': 0}, {'awemeId': '', 'start': 47, 'end': 51, 'hashtagName': '大学芋', 'hashtagId': '85604972', 'type': 1, 'userId': '', 'isCommerce': False, 'userUniqueId': '', 'secUid': '', 'subType': 0}, {'awemeId': '', 'start': 52, 'end': 62, 'hashtagName': 'tiktokレシピ', 'hashtagId': '1609646471352322', 'type': 1, 'userId': '', 'isCommerce': False, 'userUniqueId': '', 'secUid': '', 'subType': 0}, {'awemeId': '', 'start': 63, 'end': 68, 'hashtagName': '料理動画', 'hashtagId': '1596142481648641', 'type': 1, 'userId': '', 'isCommerce': False, 'userUniqueId': '', 'secUid': '', 'subType': 0}, {'awemeId': '', 'start': 69, 'end': 79, 'hashtagName': 'デリッシュキッチン', 'hashtagId': '1618753442231298', 'type': 1, 'userId': '', 'isCommerce': False, 'userUniqueId': '', 'secUid': '', 'subType': 0}, {'awemeId': '', 'start': 80, 'end': 94, 'hashtagName': 'delishkitchen', 'hashtagId': '1627421967227905', 'type': 1, 'userId': '', 'isCommerce': False, 'userUniqueId': '', 'secUid': '', 'subType': 0}], 'secret': False, 'forFriend': False, 'digged': False, 'itemCommentStatus': 0, 'showNotPass': False, 'vl1': False, 'itemMute': False, 'authorStats': {'followingCount': 0, 'followerCount': 268900, 'heartCount': 3800000, 'videoCount': 247, 'diggCount': 0, 'heart': 3800000}, 'privateItem': False, 'duetEnabled': True, 'stitchEnabled': True, 'shareEnabled': True, 'isAd': False, 'duetDisplay': 0, 'stitchDisplay': 0}

見えているデータはもちろん、それ以外の情報も取得できるということです。
このデータを取得するための方法を解説します。

そして、今回は複数の動画分をまとめて取得できます。
具体的には、ユーザー単位で最新のモノから〇件という具合です。

では、動画情報を取得する方法を説明していきます。
Pythonを利用するのは、大前提とします。

その上で、次の二つが必要となります。

  • TikTokApi
  • s_v_web_id

それぞれを下記で説明していきます。

TikTokApi

TikTokApiは、Pythonライブラリです。
TikTokApiを用いて、TikTokからデータを取得します。

詳細は、次の記事で解説しています。

上記記事を参考にして、TikTokApiのインストールを行います。
これだけでもTikTokから、動画情報を取得することは可能です。

しかし、何度かプログラムを動かすとエラーがでることになります。
それは、TikTok側の監視によるモノです。

TikTokとしては、データを取得されたくありません。
データを企業向けに販売などして、ビジネスをしている事情もあるわけですからね。

だからこそ、プログラムで自動的にデータを取得されないように監視しているのです。
人間の行う処理から逸脱すれば、プログラムだと判定(ボット判定)されます。

そのような判定をされた場合、TikTokApiは次のようなエラーを表示します。

TikTokApi.exceptions.TikTokCaptchaError: TikTok blocks this request displaying a Captcha  
Tip: Consider using a proxy or a custom_verifyFp as method parameters

おそらく、次のような認証がTikTokの画面上で出ているのでしょう。
(実際にはどんなCaptchaが出ているのかは不明)

そのために、TikTokApiによる作業が中断されたということです。
解決策としては、次の2点があります。

  • プロキシの利用
  • custom_verifyFpの利用

プロキシの利用については、次の記事が参考になります。

しかし、プロキシをすぐに用意できる人はそんなにいません。
実は、やろうと思えば結構簡単に自分専用のプロキシは用意はできます。

ここでは、custom_verifyFpを利用することで対応します。
そのための方法を次に説明します。

s_v_web_id

custom_verifyFpのFpは、fingerprintのことでしょう。
つまり、custom_verifyFpは個人を識別するための値です。

この値が、あればTikTokでボット判定されないようになります。
あくまで、ボット判定を受ける可能性が減るだけです。

やり過ぎると、custom_verifyFpがあってもボット判定は受けます。
実際に、ボット判定されました。
その場合は、再度custom_verifyFpの値を変更します。

では、custom_verifyFpに設定する値はどこで取得できるのでしょうか?
それには、Cookieを確認します。

まず、TikTokにアクセスします。
そして、その画面上でChrome DevTools(デベロッパーツール)を開きます。

「Application」でCookieの中身を確認することが可能です。
ここで、s_v_web_idという項目があることを確認できます。

s_v_web_idの「verify_」で始まるデータをコピーします。
これが、custom_verifyFpに設定する値となります。

では、実際にcustom_verifyFpする方法を説明します。

ユーザーの動画情報を取得する

実際に、動画情報を取得していきます。
そのコード上で、custom_verifyFpの設定も行っています。

では、まずは動画情報を取得したいユーザーを決めましょう。
今回は、次のアカウントを対象とします。

デリッシュキッチン【公式】
https://www.tiktok.com/@delishkitchen?

from TikTokApi import TikTokApi

WEB_ID = "verify_●●●"
USER_NAME = "delishkitchen"

# インスタンス生成
api = TikTokApi.get_instance(custom_verifyFp=WEB_ID)

user_id = None
sec_udi = None

# user_idとsec_idを取得する
result = api.by_username(USER_NAME, count=1)
for tiktok in result:
    user_id = tiktok["author"]["id"]
    sec_udi = tiktok["author"]["secUid"]

if user_id is not None:
    # ユーザーの投稿を取得する
    result = api.user_posts(user_id, sec_udi, count=300, cursor=0)
    # 取得件数
    print(len(result))
    for tiktok in result:
        id = tiktok["id"]
        desc = tiktok["desc"]
        diggCount = tiktok["stats"]["diggCount"]
        shareCount = tiktok["stats"]["shareCount"]
        commentCount = tiktok["stats"]["commentCount"]
        playCount = tiktok["stats"]["playCount"]

        # 再生数と動画説明
        print(str(playCount) + " " + desc)
        #print(tiktok)

上記を実行した結果は、以下。

10 
40800 卵焼き器で❤️ #ハロウィンロール #ハロウィン #ロールケーキ #卵焼き器 #tiktokレシピ #料理動画 #デリッシュキッチン #delishkitchen 
142700 大学芋風🥰 #さつまいもの塩キャラメルカリカリ #さつまいも #塩キャラメル #キャラメル #大学芋 #tiktokレシピ #料理動画 #デリッシュキッチン #delishkitchen 
429400 カリッ❤️もちっ❤️ #ロングフライドポテト #ポテト #フライドポテト #おやつ #tiktokレシピ #デリッシュキッチン #delishkitchen #料理動画 
180000 とっても可愛いオバケに大変身👻 #おばけスイートポテト #おばけ #スイートポテト #ハロウィン #さつまいも #tiktokレシピ #料理動画 #デリッシュキッチン #delishkitchen 
94700 コクうますっぱ❣️ #バターぽん酢なす #バターぽん酢 #バター #ポン酢 #なす #tiktokレシピ #料理動画 #デリッシュキッチン #delishkitchen 
32800 オーブンがなくても作れる🥰 #レンジで抹茶チョコチーズテリーヌ #レンジ #抹茶 #チーズテリーヌ #チーズ #テリーヌ #tiktokレシピ #料理動画 #デリッシュキッチン #delishkitchen 
32200 トロッと美味しい❤️ #肉巻き半熟卵 #肉巻き #半熟卵 #半熟 #卵 #tiktokレシピ #料理動画 #デリッシュキッチン #delishkitchen 
28300 甘栗でお手軽に🌰 #型なしモンブラン #モンブラン #栗 #甘栗 #tiktokレシピ #料理動画 #デリッシュキッチン #delishkitchen 
32600 甘辛い味付けがやみつき❤️ #チーズタッカルビ焼うどん #焼きうどん #チーズタッカルビ #チーズ #ホットプレート #tiktokレシピ #料理動画 #デリッシュキッチン #delishkitchen 
63500 ホットケーキミックスでお手軽レシピ🥰 #もちもちチーズパン #もちもち #フライパン #ホットケーキミックス #チーズパン #チーズ #パン #tiktokレシピ #料理動画 #デリッシュキッチン #delishkitchen #デリッシュキッチン

最新の10個を取得するコードです。
そして、再生数と動画説明だけを表示しています。

では、コードを説明します。

WEB_ID = "verify_●●●"  
USER_NAME = "delishkitchen"

WEB_IDに設定した値が、custom_verifyFpに設定されます。
WEB_IDに、s_v_web_idの値を設定するということです。

s_v_web_idについては、利用期限があると思われます。
Captcha関連のエラーが出たら、都度再発行しましょう。
キャッシュクリアで再発行できます。

USER_NAMEは、投稿を取得したアカウント名を設定します。
この部分は不要に感じますが、user_idとsec_idのために関数を呼んでいます。

result = api.by_username(USER_NAME, count=1)

user_postsを利用するためには、user_idとsec_idが必要になります。
USER_NAMEだけでuser_postsを利用できれば、もっとシンプルなコードになりますけどね。

    # ユーザーの投稿を取得する 
    result = api.user_posts(user_id, sec_udi, count=10, cursor=0)

上記の「count=10」で取得する動画投稿の数を設定しています。
公式のドキュメントによると、2000まで対応しているようです。

以上、ユーザーの動画情報を取得する方法についての説明でした。

タイトルとURLをコピーしました