![見出し画像](https://assets.st-note.com/production/uploads/images/14348334/rectangle_large_type_2_b37d8e932003a166f70cec76d7966356.png?width=1200)
PythonとBeautifulSoupを活用してInstagramのハッシュタグを分析してみる
今回やりたい事として、PythonとBeautifulSoupを使って対象となるInstagramのハッシュタグにどれぐらいの頻度でコンテンツの投稿が行われているか、を探ってみたいと思います。
ご存知の通り、ハッシュタグは大人気なものからマニアックやニッチなものまで多種多様で、インスタ投稿する際にどんなタグを使ったらより大きくリーチできるのか、で悩んでおられる方も少なくないと思います。
今回の狙いとしては、各ハッシュタグの投稿数の規模に加え、投稿頻度を算出する事で、特定のハッシュタグで投稿数が落ち込む狙い目なタイミングがどこにあるのか、を探りたいと思います。
注意事項: Instagramはスクレイピングなどを利用規約にて禁止しており、今回の記事ではPythonのお題として取り上げております。これらを利用して運用する事は、利用規約に抵触する可能性が高いので、あくまで自己責任の範囲で行ってください。
【告知】 bosyuでPythonのプログラミングのお手伝いの募集してます
Pythonは手軽に始められる反面、活用できるライブラリなども豊富で、色々と悩んだり壁にぶつかってしまう事があったりすると思います。そんな時は自分のノウハウや英語のスキルを生かしたリサーチ能力を駆使して、全力でお手伝いします!というものです。
このノートを読んで、「こういう応用の仕方はあるのかな?」や「新しくこう言った動作を取り入れてみたんだけど、上手く動かない」と言ったニーズにお答えできるかと思います。詳しくは下記のページにて。
まずは環境の準備
今回利用する主なライブラリは下記の通りです。
from bs4 import BeautifulSoup
import requests
import json
import re
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」順にソートしています。
なお、Instagramはスクレイピングに対して非常に厳しくIPアドレスなどをチェックしているため、よく自分の使っているIPアドレスがブロックされる場合があります。そんな場合は、プロキシサーバーを経由することをオススメします。詳しい内容は下記にまとめてありますので、合わせて一読ください。
ざっくりとした考察
ロンドンに関連した今回のハッシュタグ一覧ですが、タグによってコミュニティのサイズのばらつきがあり、一番大きな「#london」では投稿数が約1.3億件、また一番小さなものだと「#londonbest」が投稿数で4万件といった具合です。
投稿頻度に関しては、調査したハッシュタグ31件のうち、24件が投稿頻度が平均5分以内となっており、データを収集した22時(ロンドン時間)では非常に活発に投稿が行われているのが分かります。よって、この時間帯でこれらのハッシュタグを使うと、タイミング的に他の投稿に埋もれてしまう可能性がたかそうです。
なお、「#london_masters」に関しては、コミュニティサイズが約11万でありながら、投稿頻度が18分おきとなっているので、他の人気のあるタグと比較すると、よりリーチがしやすいかなと思います。
次は定期的にこれを1日かけて実行し、時間帯による変化をこれらのハッシュタグ毎に下記の様なヒートマップでビジュアルに表現するところまでカバーしたいと思います。
参考とした記事: Instagram Hashtag Analysis In Python