heroku SQL Webアプリケーション

【Python】Herokuのデータベースにスクレイピングした情報を書き込む

この記事は約6分で読めます。

 

こんにちは、ミナピピン(@python_mllover)です!

 

今回はherokuのデータベースにPythonで収集した情報を保存する手順を紹介したいと思います。

 

herokuの基本的なことについては以下の記事に記載しておりますので、まずそちらを参考としてください!

 

関連記事:Python製プログラムを「Heroku scheduler」を使って無料で定期実行する

 

Herokuにポスグレを追加する

 

# herokuにログインする
$ heroku login

 

# プロジェクトに接続
$ heroku git:remote -a (プロジェクト名)

 

 

Heroku で PostgreSQL を使うために、アドオンを追加します。

$ heroku addons:add heroku-postgresql

 

アドオンを追加したらデータベースを作成します。

#データベースを作成
$ heroku addons:create heroku-postgresql:hobby-dev

 

 

ここで出てくるhobby-devとはherokuのプラン名でこれを指定することで無料でDBを作成できます。ただし1万行までしか書き込みができないみたいです。

 

しかもこれはアプリ単体ではなくアカウント全体の話みたいです。これはちょっと痛いですね・・・とりあえず1万行超えたときの無難な対応は有料プランに移行する、というところみたいです。

 

参考:PostgreSQL のプランを Free から Hobby に移行する(Heroku) – ブログ

 

他にもアプリの仕様として会員情報を保存するようなものでなければ、都度別の場所にバックアップを取ったりcsvに吐き出しておくなどして無料プランでやりくりすることもできそうです。

 

参考:Heroku postgresqlアドオンの無料プランで制限に達したとき | ikapblog

参考:herokuのデータベースをリセット/リストア/再構築する – Qiita

参考:MetabaseをHerokuで使って、10000行を超えて無料の限界が来たときの対処法 | Be full stack

 

DB情報を見る

 

下記のコマンドでHerokuのDB情報を見ることができます。

$ heroku pg:info

 

<実行結果>

 

データベースのURLを確認する

 

heroku上のデータベースのURLを確認する

$ heroku run python
>>> a = os.environ.get('DATABASE_URL')
>>> print(a)
postgres://~

 

このURLは次で使用するのでコピペしてどこかにメモっておきましょう。

 

Pythonでスクレピングした情報をherokuのデータベースに書き込む

 

<main.py>

# ライブラリの読み込み
import requests 
import json 
from sqlalchemy import create_engine
import tweepy
from datetime import datetime
import pandas as pd

# ご自身のTwitterのAPI鍵を入力してください
CK = ''                             # Consumer Key
CS = ''     # Consumer Secret
AT = '' # Access Token
AS = ''         # Accesss Token Secert

#認証情報を設定
auth=tweepy.OAuthHandler(CK, CS)
auth.set_access_token(AT, AS)

#APIインスタンスの作成
api=tweepy.API(auth)

# データベースへ接続(自身のサーバーのデータベースのURLを入力してください) 
engine = create_engine('postgresql://~', echo = False)

#-特定のユーザーのユーザー情報を取得する(例 @hogehoge⇒hogehoge)
user = api.get_user(screen_name="never_be_a_pm")

# 取得したデータをデータフレームにする
df = pd.DataFrame([[datetime.now(), user.created_at, user.screen_name, user.description, user.friends_count,user.followers_count]],
columns=['timestamp','create_date', 'user_name', 'profile', 'frends','follower'])

# テーブルに書き込む
df.to_sql('twitter_userdata', con = engine, if_exists='append')

# データベースの中身を確認する(デバック用)
print(engine.execute('SELECT * FROM twitter_userdata').fetchall())

 

<reqirement.txt>

pandas==1.2.0
requests==2.25.1
numpy==1.19.4
sqlalchemy==1.4.12
tweepy==3.8

 

<runtime.txt>

python-3.7.10

 

<Procile>

web: python main.py

 

これをherokuにデプロイしてコードが動くかを確認します。

 

# herokuにデプロイ
$ git add .
$ git commit
$ git push heroku master

# コードの確認
$ heroku run python main.py

 

エラーなく↓みたいな取得した情報がプリントされれば成功です。

[(0, datetime.datetime(2021, 5, 5, 7, 39, 59, 613144), datetime.datetime(2016, 4, 7, 10, 1, 21), 'never_be_a_pm', 'イン ディバースという小さい会社をやってます。メガベンチャーからITベンチャーに転職し、その後独立し、起業。Webマーケティング、 データ分析、プログラミングと嫁、吉祥寺という街が好きです。IT業界のキャリアについて発信しているメディア「DAINOTE」やって ます。ICU卒', 1003, 28915)~

 

定期的に実行する場合は以下の記事を参考にしてください!

関連記事:Python製プログラムを「Heroku scheduler」を使って無料で定期実行する

 

 

ご質問などございましたらmentaにて受け付けております!

では~

 

 

関連記事:【Python】Heroku+Flaskでサーバレスアプリをデプロイする

 

 

 

 

コメント

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