3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

食べログとSNSの評価を比較してみた [その1]~ツイート取得・店舗選別~

Last updated at Posted at 2021-10-09

はじめに

Python初学者のまさやです!

皆様は、カフェやレストランの情報を何から取得していますでしょうか?
最近は、食べログなどのサイトだけではなく、SNSで確認される方もいるのではないでしょうか?

私は前職、中小企業のPRのお手伝いを行っていました。
お客様にはSNSでの情報発信の必要性も訴えてきましたが、それは本当に必要だったのでしょうか!?

今回はPythonの練習としてTwitterAPIにてツイートの取得。
食べログのスクレイピングを行い、評価の比較を行ってみました!!!


####環境設定
Python 3.7.2
Google Colaboratory
インストールした外部パッケージは都度コードの先頭に記載


以下4記事がまとめて3分で読める!
[3分で読める] 食べログとSNSの評価を比較してみた~ショート編~

##簡単なあらすじ(リンク付き!)

#1.ツイートデータの取得(2021年09月20日~27日/1週間分)

__コード一覧はこちら__
#各種必要ライブラリ等のインストール
!pip install requests_oauthlib

from requests_oauthlib import OAuth1Session
import json
import datetime, time, sys
import tweepy
import pandas as pd
import re
import csv
import urllib.request
import zipfile
import traceback

#利用申請が承認された後のAPIキーの設定
consumer_key = 'xxxxxxxxxxxxxxx'
consumer_secret = 'xxxxxxxxxxxxxxx'
access_token ='xxxxxxxxxxxxxxx'
access_secret = 'xxxxxxxxxxxxxxx'

session = OAuth1Session(consumer_key, consumer_secret, access_token, access_secret)
url = 'https://api.twitter.com/1.1/search/tweets.json'

tweet = []
list_text = []
list_id = []
list_user = []
list_created_at = []
list_favorite = []
list_retweet = []
list_followers = []

#ツイートのタイムラインを取得する
df = pd.DataFrame(columns=['text','id','name','created_at','favorite_count',"retweet_count","followers_count"])

try:
  def get_tweets(query):
    global df
    mid = -1
  
    #1度に100件のツイートを取得する
    while True:
      res = session.get(url, params = {'q':targets, 'count':100, 'max_id': mid})
      res_text = json.loads(res.text)

     #取得したツイートをそれぞれのリストに格納
      for tweet in res_text['statuses']:
        list_text.append(tweet['text'])
        list_id.append(tweet['id'])
        list_user.append(tweet['user']['screen_name'])
        list_created_at.append(tweet['created_at'])
        list_favorite.append(tweet['favorite_count'])
        list_retweet.append(tweet["retweet_count"])
        list_followers.append(tweet["user"]["followers_count"])
      
    #リストのデータをDataFrameに格納
      df_tmp = pd.DataFrame(columns=['text','id','name','created_at','favorite_count',"retweet_count","followers_count"])
      df_tmp = df_tmp.assign(text=list_text, id=list_id, name=list_user, created_at=list_created_at,favorite_count=list_favorite,retweet_count=list_retweet,followers_count=list_followers)
      df = pd.concat([df,df_tmp])

   #一定数ツイートを取得したのち、再度続きからツイートを取得するために
      if "next_results" in res_text["search_metadata"].keys():
        next_url = res_text['search_metadata']['next_results']
        pattern = r".*max_id=([0-9]*)\&.*"
        ite = re.finditer(pattern, next_url)
        for i in ite:
            mid = i.group(1)
            break
      else:
        traceback.print_exc()
        break

   #500件まで情報を取得したら終了
      print(len(tweet))
      if len(tweet) >= 500:
        break

    return df

  #xに検索する店舗名を記入
 #-RTでリツイートを除くツイートを取得
  targets = [u'xxxx -RT']
  df = pd.concat([df,get_tweets(targets)])

except:
  print('error')
  traceback.print_exc()
else:
  print('no_error')
finally:
  print('finish')

####TwitterAPI利用登録
まずは、TwitterAPIを利用するため登録。
以下のサイトを参考にしました。
2021年度版 Twitter API利用申請の例文からAPIキーの取得まで詳しく解説

####ツイート取得

for tweet in res_text['statuses']:
        list_text.append(tweet['text'])
        list_id.append(tweet['id'])
        list_user.append(tweet['user']['screen_name'])
        list_created_at.append(tweet['created_at'])
        list_favorite.append(tweet['favorite_count'])
        list_retweet.append(tweet["retweet_count"])
        list_followers.append(tweet["user"]["followers_count"])

      df_tmp = pd.DataFrame(columns=['text','id','name','created_at','favorite_count',"retweet_count","followers_count"])
      df_tmp = df_tmp.assign(text=list_text, id=list_id, name=list_user, created_at=list_created_at,favorite_count=list_favorite,retweet_count=list_retweet,followers_count=list_followers)
      df = pd.concat([df,df_tmp])

今回取得するツイート情報は下記

取得情報 用途
ツイート文書(text) 感情分析のため
ユーザーID(id) 重複ツイート検出のため
ユーザー名(name) 重複ツイート検出のため
ツイート日(created_at) 正しく1週間分取得できているか確認するため
いいね数(favorite_count) 今後の展望
リツイート数(retweet_count) 今後の展望
フォロワー数(followers_count) 今後の展望

####ツイート取得条件

while True:
      res = session.get(url, params = {'q':targets, 'count':100, 'max_id': mid})

      if "next_results" in res_text["search_metadata"].keys():
        next_url = res_text['search_metadata']['next_results']
        pattern = r".*max_id=([0-9]*)\&.*"
        ite = re.finditer(pattern, next_url)
        for i in ite:
            mid = i.group(1)
            break

      else:
        traceback.print_exc()
        break

      print(len(tweet))
      if len(tweet) >= 500:
        break

    return df

ツイートを取得するにあたり、TwitterAPIにより課せられたルールとして、
1度に取得できるツイート数や、リクエスト回数などが定められています。
今回は1回で100件のツイートを取得し、500件まで取得を続けるコードになります。

また、100件取得した場合、
再度最新のツイートを取得せず、続きから始めるようmax_idを設定し取得しました。

####取得した感想
PnjVl78ORnK3LD91633929221_1633929239.png

  • ユーザーID/ユーザー名はどちらかのみで十分
  • textにはSNSならではの顔文字や文脈が多く、正しく感情分析が可能か不安。
  • 「-RT」でリツイートを除外することはできたが、引用ツイートが意外と多かった。
  • 今後、ツイートした人だけではなく、「フォロワー」と「いいね数」、「リツイート」などインフルエンサーポイントを追加して、ツイートに反応した人の点数も加点してオリジナルランキングも作成してみたい。

#2.店舗の選別
####店舗の検索
取得できるツイートは1週間以内と限られています。
そのため、1週間のうちにツイート数が多いカフェまたはスイーツ専門店を探します。
探す方法は、食べログにて

  • 「東京/カフェ・喫茶」ランキング上位100位
  • 「東京/カフェ・喫茶」口コミ数上位100位
  • カフェ百名店2021/2020

の中からツイート数が多い上位10店舗のツイートデータをを使用。

~リンクはこちら!~
ランキング上位100位
口コミ上位100位
カフェ百名店2021
スイーツ百名店2020

alt

####検索方法
検索で使用するコードは1.ツイートデータの取得を使用します。
targetsに記入する店舗名は正式名所ではなく、ツイートされやすそうな名前で検索します。

記入名
例)
スターバックス コーヒー ジャパン: Starbucks Coffee Japan
「スタバ」 や 「スターバックス」などのツイート数が多いワードを採用 

例外
検索した際、カフェの情報ではないものがたくさん取得される店舗に関しては対象外とします。
例)
パティスリー
→「パティスリー リョーコ」/「パティスリー・パリセヴェイユ」/「パティスリー プレジール」
などパティスリーでは情報が混在し、
フルネームではツイート数が激減してしまいました。

####ノミネート10店舗
上記にてツイート数が多かった10店舗は以下になります!

店名 検索名 取得ツイート数
キル フェ ボン キルフェボン 2385
ピエール・エルメ ピエールエルメ 996
ブルーボトルコーヒー ブルーボトル 731
ケンズカフェ東京 ケンズカフェ 647
マリアージュフレール マリアージュフレール 527
ひみつ堂 ひみつ堂 419
資生堂パーラー 資生堂パーラー 395
和栗や 和栗や 326
アンリ・シャルパンティエ アンリ・シャルパンティエ 292
銀座ウエスト 銀座ウエスト 268
  • 200~300件程度の候補から上位10店舗を抽出!!!
  • 反省点として、500件までと定義したコードがうまく作動しておらず、ツイート数にばらつきがでてしまった。今後、原因に関しても考えてみたい。
  • ツイート数が予想より少なく、200件を超える店舗がほぼなかった。やはり、カフェなどの情報をSNSにアップする際、Twitterではなく、Instagramが選ばれる傾向がある予想。
  • 店舗名を決める際、「パティスリー」などの文言は、他店舗と混合するためSNSには不向き。また、英語表記の店舗名は外国人の名前やツイートと混合してしまい、こちらも不向きだと思った。

~季節に関して~

  • 「ひみつ堂」は人気かき氷屋。夏には3時間以上並ぶことも。まだまだ、残暑が厳しく10月を前にしてもツイートは多かった。
  • 和栗やは栗の季節を目前に「食べたい」など期待に対するツイート多数。栗が収穫できない季節には店を閉めるほど徹底された品質管理にも"限定感"が相まってツイート数が多かったと推測。

続く!
[その2]
3.ツイートデータの前処理

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?