見出し画像

PythonとBeautifulSoupを活用してInstagramのハッシュタグを分析してみる

今回やりたい事として、PythonとBeautifulSoupを使って対象となるInstagramのハッシュタグにどれぐらいの頻度でコンテンツの投稿が行われているか、を探ってみたいと思います。

ご存知の通り、ハッシュタグは大人気なものからマニアックやニッチなものまで多種多様で、インスタ投稿する際にどんなタグを使ったらより大きくリーチできるのか、で悩んでおられる方も少なくないと思います。

今回の狙いとしては、各ハッシュタグの投稿数の規模に加え、投稿頻度を算出する事で、特定のハッシュタグで投稿数が落ち込む狙い目なタイミングがどこにあるのか、を探りたいと思います。

注意事項: Instagramはスクレイピングなどを利用規約にて禁止しており、今回の記事ではPythonのお題として取り上げております。これらを利用して運用する事は、利用規約に抵触する可能性が高いので、あくまで自己責任の範囲で行ってください。

まずは環境の準備

今回利用する主なライブラリは下記の通りです。

from bs4 import BeautifulSoup
import requests
import json

InstagramページからJSONデータを入手する

Instagramのページ構造として、投稿等の情報がJavaScript内にJSON形式で埋め込まれているので、こちらはそのJSONデータを取り出す関数モジュールになります。

def get_json_data(url):

   res = requests.get(url)
   html = BeautifulSoup(res.content, 'html.parser')

   pattern = re.compile('window._sharedData = ({.*?});')
   script = html.find("script", text=pattern)
   data = pattern.search(script.text).group(1)
   json_user_data = json.loads(data)

   return(json_user_data)

特定のハッシュタグで投稿される、「投稿頻度」を求める

そしてこちらの関数モジュールは、読み込まれたJSONデータから、特定のハッシュタグのページで投稿されている最新の投稿と、10個前の投稿の時間差を求め、そこから何分毎に投稿されているのか、となる「投稿頻度」を割り出します。

また、収集した情報はCSVデータとして上書き保存するようにしています。

def get_hashtag_stats(tags):
   
   for tag in tags:

       json_hashtag = get_json_data('https://www.instagram.com/explore/tags/'+str(tag))

       number_of_posts = json_hashtag['entry_data']['TagPage'][0]['graphql']['hashtag']['edge_hashtag_to_media']['count']
       timestamp_1st = json_hashtag['entry_data']['TagPage'][0]['graphql']['hashtag']['edge_hashtag_to_media']['edges'][0]['node']['taken_at_timestamp']
       timestamp_1st = datetime.fromtimestamp(timestamp_1st)
       timestamp_10th = json_hashtag['entry_data']['TagPage'][0]['graphql']['hashtag']['edge_hashtag_to_media']['edges'][9]['node']['taken_at_timestamp']
       timestamp_10th = datetime.fromtimestamp(timestamp_10th)

       #最新の投稿と10個前の投稿の時間の差を求める
       diff = timestamp_1st - timestamp_10th

       post_freq= int(diff.total_seconds()/(10*60))

       output_line = [datetime.now().strftime("%d/%m/%Y %H:%M:%S"), str(tag), str(number_of_posts), str(post_freq)]
       print(output_line)

       with open(r'./hashtags_stats.csv', 'a') as f:
           writer = csv.writer(f)
           writer.writerow(output_line)

       if sleep_timer != 0:
           time.sleep(sleep_timer)

   return()

対象となるタグ一覧を配列にする関数モジュール

文字列として指定された一連のハッシュタグを、配列として返します。

def clean_hashtags(tags):

   if tags[0] == '#':

       tags = tags.replace(' ', '')
       hash_array = tags.split('#')

   else:

       hash_array = tags.split(',')

   taglist = [a for a in hash_array if a != '']

   return(taglist)

ハッシュタグの設定

こちらがメインのルーチンになります。今回調べてみたいハッシュタグですが、現在イギリスに住んでいる事もあり、ロンドン関連のものにしてみました。

if __name__ == "__main__":

    hashtags = "#LondonNature #britain #centrallondon #england #explorelondon #greatbritain #ig_london #igerslondon #ilovelondon #ldn #london #london4all #london_masters #london_only #londonbest #londoncity #londoner #londonlife #londonlover #londontown #londonuk #londonview #lovegreatbritain #prettycitylondon #prettylittlelondon #shutup_london #thisislondon #uk #unitedkingdom #visitlondon #visituk"
    get_hashtag_stats(clean_hashtags(hashtags))

調査したハッシュタグ一覧、投稿総数、及び投稿頻度

Pythonを実行して収集されたCSVデータがこちらになります。なお、下記の結果ですが、Excel上で「Freq」順にソートしています。

画像1

ざっくりとした考察

ロンドンに関連した今回のハッシュタグ一覧ですが、タグによってコミュニティのサイズのばらつきがあり、一番大きな「#london」では投稿数が約1.3億件、また一番小さなものだと「#londonbest」が投稿数で4万件といった具合です。

投稿頻度に関しては、調査したハッシュタグ31件のうち、24件が投稿頻度が平均5分以内となっており、データを収集した22時(ロンドン時間)では非常に活発に投稿が行われているのが分かります。よって、この時間帯でこれらのハッシュタグを使うと、タイミング的に他の投稿に埋もれてしまう可能性がたかそうです。

なお、「#london_masters」に関しては、コミュニティサイズが約11万でありながら、投稿頻度が18分おきとなっているので、他の人気のあるタグと比較すると、よりリーチがしやすいかなと思います。

次は定期的にこれを1日かけて実行し、時間帯による変化をこれらのハッシュタグ毎に下記の様なヒートマップでビジュアルに表現するところまでカバーしたいと思います。

画像2

参考とした記事Instagram Hashtag Analysis In Python

この記事が気に入ったら、サポートをしてみませんか?気軽にクリエイターを支援できます。

4

Masaru Suzuki

テック、ガジェット、EDM、スタートアップ界隈でライター活動をしています。海外などの話題な最新ニュースやライフスタイル系のアイテムなどが大好きです。現在イギリス在住にて1児の父親、海外に渡りフル育メンに挑戦中!また、趣味のPythonを使って、様々なデータ分析に挑戦中!
コメントを投稿するには、 ログイン または 会員登録 をする必要があります。