77Lifeworkベータ版

77Lifeworkベータ版

IT関係の話をメインとして、その他私の趣味や雑記用のブログです。ここに書いた内容が少しでも参考になれば嬉しいです。

Pythonによるスクレイピングで炭焼きさわやかに待たずに入れる時間帯を調べる

こんにちは。タイトルが意味不明かもしれませんが、これは以下の記事の続き的な立ち位置です。
www.77-lifework.com

さわやかの待ち時間を調べられるサイトを定期的にスクレイピングし、待ち時間をスプレッドシートに記録した上、どの時間帯が空いているのか調べてみようというテーマです。
動機や背景は前の記事と同じなので、はしょります。
割と真剣にやっちゃいましたので、ぜひご覧ください。

処理の流れと出力結果

まず、使用しているプログラミング言語Pythonで、待ち時間をスクレイピングし、Googleスプレッドシートに結果を書き込むプログラムを作成しました。これをLinuxサーバに配置し、cronで15分ごとに実行しています。
結果は以下のようになります。日付ごとのシートが作成され、各店舗の待ち時間が書き込まれています。
f:id:J-back:20200126001754p:plain:w700

営業時間外の場合は「-1」を書き込むようにしています。データベースで管理するほど大量のデータを扱う気はなかったので、今回は代わりにスプレッドシートを使用しました。

Pythonのコード

さて、今回のPythonコードですが、以下です。

# coding: UTF-8
import os
import locale
import gspread
from oauth2client.service_account import ServiceAccountCredentials
import slackweb
import time
import datetime
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

# 定数宣言
SLACKURL_ex = '例外発生時のslack通知用URLを入力'

#jsonファイルを指定
CREDENTIAL_JSON = 'スプレッドシートアクセスのためのjsonファイルのパスを指定'

# main処理
def main():

    scope = ['https://spreadsheets.google.com/feeds',
            'https://www.googleapis.com/auth/drive']

    # 認証
    credentials = ServiceAccountCredentials.from_json_keyfile_name(CREDENTIAL_JSON, scope)
    gc = gspread.authorize(credentials)

    # 対象ブックを指定
    target_book = gc.open('sawayaka_analysis')

    # 現在日付を取得
    now_date = datetime.date.today().strftime('%Y-%m%d')

    # シート名一覧を取得
    worksheet_list = target_book.worksheets()
    sheetname_list = []
    for wsList in worksheet_list:
        sheetname_list.append(wsList.title)

    if not now_date in sheetname_list :
        target_book.add_worksheet(title=now_date, rows=100, cols=26)
    
    # 書き込み対象のシートを指定
    target_sheet = target_book.worksheet(now_date)

    # スクレイピング対象URL
    URL = "https://www.genkotsu-hb.com/airwait.php"

    # スクレイピング実行
    try:

        # 現在時刻取得
        now_time = datetime.datetime.now().strftime('%H:%M')       

        # Chrome設定
        options = Options()
        options.add_argument('--headless')

        # Chromeを起動してurlを開く
        driver = webdriver.Chrome(options=options)
        driver.get(URL)
        time.sleep(20)

        # 文字コードをUTF-8に変換し、html取得
        html = driver.page_source.encode('utf-8')
        soup = BeautifulSoup(html, "html.parser")

        # 対象店名読み込み
        storeTagList = soup.find_all('div', class_='sc-fONwsr bmOhpB')

        # 店名入力対象セルを取得
        storeName_cells = target_sheet.range(1,1,1,len(storeTagList)+1)
        storeName_cells[0].value = '時刻/待ち時間' 

        for i in range(0, len(storeTagList)):
            storeName_cells[i+1].value = str(storeTagList[i]).replace('<div class="sc-fONwsr bmOhpB">', '').replace('</div>', '')

        # スプレッドシートへ店名書き込み
        target_sheet.update_cells(storeName_cells)

        # 待ち時間入力対象列を決定
        colList = target_sheet.col_values(1)
        target_rownum = len(colList) + 1

        # 待ち時間入力対象セルを取得
        waitTime_cells = target_sheet.range(target_rownum,1,target_rownum,len(storeTagList)+1)
        waitTime_cells[0].value = now_time

        for i in range(0, len(storeTagList)):
            # tagとclassを指定して要素を取り出す
            storeElement = soup.find('div', string=storeName_cells[i+1].value)
            waitingTimeObj = storeElement.find_parent('a').find('div',class_='sc-ipXKqB iHAIGD')

            if (waitingTimeObj is not None):
                waitTime_cells[i+1].value = waitingTimeObj.text.replace("約","").replace("分待ち", "")
            else:
                # 受付時間外は-1を代入
                waitTime_cells[i+1].value = -1

        # スプレッドシートへ待ち時間書き込み        
        target_sheet.update_cells(waitTime_cells)
            
    except Exception as e:
        message = "[例外発生]"+ os.path.basename(__file__) +"\n"+"type:{0}".format(type(e))+"\n"+"args:{0}".format(e.args)
        slackweb.Slack(url = SLACKURL_ex).notify(text = message)

    finally:
        # 起動したChromeを閉じる
        driver.close()
        driver.quit()


if __name__ == '__main__':
    main()

スプレッドシートへの書き込み処理については以下の記事を参考にしてください。
www.77-lifework.com


ちなみに、

# 定数宣言
SLACKURL_ex = '例外発生時のslack通知用URLを入力'

ってところと

   except Exception as e:
        message = "[例外発生]"+ os.path.basename(__file__) +"\n"+"type:{0}".format(type(e))+"\n"+"args:{0}".format(e.args)
        slackweb.Slack(url = SLACKURL_ex).notify(text = message)

ってところはなくても大丈夫です。
不測の事態が起きた時に通知されてるといいなー、と思ってslackに通知する処理を入れているだけなので、本プログラムの動作には関係ない部分です。

このコードを毎日15分ごとに実行した結果がさっき貼ったスプレッドシートの画像ですね。とりあえず全店舗について取得していますが、ある程度しぼっても良いかな、とも思います。

データ分析

分析、というほどすごいことはできないのですが(というか、スクレイピングできたところで結構満足してしまっています)、せっかくデータ取得したので、少し中身を見てみましょう。
Pythonコードを実行して作成したスプレッドシートのデータを使って、ある1週間について「御殿場インター店」の空き具合を曜日ごとにまとめたものが以下です。
f:id:J-back:20200126003412p:plain:w700

これをグラフにしてみると、以下のようになります。
平日に比べて土日のほうが全体的な待ち時間が多いのが見て取れますね、これは感覚的にも正しい結果です。
また、日曜日は基本的にどの時間帯も混んでいますが、土曜日だったら16:00〜17:30ぐらいが少し空いていそうな感じですね。
とはいえ、今回はデータが7日間分しかないので、たまたまこの土曜日だけこの傾向となっているのかもしれません。
もっと長い期間で曜日ごとに平均を出したりすれば、より現実に近い傾向がつかめるのではないでしょうか。
f:id:J-back:20200126003954p:plain:w700

最後に

今回はさわやかの待ち時間データを取得して分析するところまでやってみました。今回はさわやかの待ち時間というテーマでやりましたが、こんな感じで様々なデータを集めて分析してみるとおもしろいですね、アイデア次第でいろいろ応用がききそうです。
最後まで読んでくださり、ありがとうございました。

Apacheを複数起動(複数インスタンスを構成)する

はじめに

今回はLinux上にインストールしたApacheを複数同時に起動する方法を書いていきます。
ここではApacheインスタンスを2つ起動しますが、それぞれのインスタンスへのアクセスはポート番号で区別することとします。
(もちろん、IPアドレスでも区別できます)

構成情報

CentOS 7.7(1908)
Apache 2.4
・ポート番号
 インスタンス1:80
 インスタンス2:8080


アクセスする時のイメージは下図のような感じです。
f:id:J-back:20191110232259j:plain:w600

Apacheインストール準備

今回はApacheのソースファイルをダウンロードし、コンパイルしてインストールする方法で進めます。
Apacheコンパイルにはいくつかパッケージが必要なので、先にインストールしておきます。

まずは以下のパッケージをyumでインストールします。

yum -y install gcc pcre pcre-devel expat-devel

Apacheのソースファイルをコンパイルするためには「apr」と「apr-util」が必要なので、これらのソースファイルを以下のリンク先からダウンロードします。tar.gz形式を選択しましょう。
apr.apache.org


ダウンロードしたtarファイルをSCP等でインストール先のサーバに配置します。ここでは「/tmp」に置きました。
f:id:J-back:20191112232627p:plain:w600

以下コマンドで解凍します。

cd /tmp
tar -zxvf apr-1.6.5.tar.gz
tar -zxvf apr-util-1.6.1.tar.gz


aprを「/opt/apr-1.6.5」にインストールします。

cd /tmp/apr-1.6.5/
./configure --prefix=/opt/apr-1.6.5
make
make install

下記のエラーが出た場合にはconfigureファイルを編集します。

rm: cannot remove 'libtoolT': No such file or directory

以下のように変更します。

vi /tmp/apr-1.6.5/configure

変更前:
$RM "$cfgfile"
変更後:
$RM -f "$cfgfile"

f:id:J-back:20191112233058p:plain:w600



次にapr-utilを「/opt/apr-util-1.6.1」にインストールします。

cd /tmp/apr-util-1.6.1/
./configure --prefix=/opt/apr-util-1.6.1 --with-apr=/opt/apr-1.6.5
make
make install


また、Apacheの実行用ユーザを作成しておきます。

useradd -s /sbin/nologin apache
groupadd apache
usermod -aG apache apache

Apacheコンパイル

以下のダウンロードページからApacheのソースファイルをダウンロードします。
httpd.apache.org


tar.gz形式のソースファイルを選択しましょう。
f:id:J-back:20191109232457p:plain:w600

ダウンロードしたソースファイルをSCP等でインストール先のサーバに配置します。
ここでは「/tmp」に配置したので、以下コマンドで解凍します。

cd /tmp
tar -zxvf httpd-2.4.41.tar.gz

以下コマンドでコンパイルします。

cd /tmp/httpd-2.4.41/
./configure --prefix=/opt/httpd-2.4.41 --with-apr=/opt/apr-1.6.5 --with-apr-util=/opt/apr-util-1.6.1
make
make install

ここまでで1つ目のApacheをインストールすることができたので、次は2つ目のApacheをインストールしていきましょう。
2つ目のApacheディレクトリ名を「httpd-2.4.41-ex」として「/opt/httpd-2.4.41-ex」にインストールします。

cd /tmp
./configure --prefix=/opt/httpd-2.4.41-ex --with-apr=/opt/apr-1.6.5 --with-apr-util=/opt/apr-util-1.6.1
make
make install

これで独立した2つのApacheをインストールすることができました。
最後にインストールしたディレクトリの所有者・グループをapacheに変更しておきましょう。

chown -R apache /opt/httpd-2.4.41
chgrp -R apache /opt/httpd-2.4.41
chown -R apache /opt/httpd-2.4.41-ex
chgrp -R apache /opt/httpd-2.4.41-ex

IPアドレス・ポートの設定

ここからは、インストールした2つのApacheが使用するIP・ポートを設定します。
今回は以下のように、同じIPアドレス・別々のポートでアクセスするようにしました。

httpd-2.4.41
 ServerRoot:/opt/httpd-2.4.41
 IPアドレス:192.168.1.12
 ポート:80

httpd-2.4.41-ex
 ServerRoot:/opt/httpd-2.4.41-ex
 IPアドレス:192.168.1.12
 ポート:8080


まずは1つ目のインスタンスhttpd-2.4.41」の設定をするため、「/opt/httpd-2.4.41/conf/httpd.conf」をエディタで開きます。

ServerRootが「/opt/httpd-2.4.41」となっていることを確認。
f:id:J-back:20191123141325p:plain:w600


使用するIPとポートの指定部分で「Listen 192.168.1.12:80」と記述します。
f:id:J-back:20191123141540p:plain:w600


UserとGroupは「apache」を指定しておきましょう。
f:id:J-back:20191123141725p:plain:w600


DocumentRootが「/opt/httpd-2.4.41/htdocs」であることを確認します。
f:id:J-back:20191123141843p:plain:w600


ここまでできたら、「/opt/httpd-2.4.41/conf/httpd.conf」を保存して閉じます。

次に2つ目のインスタンスhttpd-2.4.41-ex」の設定ファイル「/opt/httpd-2.4.41-ex/conf/httpd.conf」を開き、
・ServerRootが「/opt/httpd-2.4.41-ex」となっていることを確認
・使用するIPとポートの指定部分で「Listen 192.168.1.12:8080」と記述
・UserとGroupは「apache」を指定
・DocumentRootが「/opt/httpd-2.4.41-ex/htdocs」であることを確認
を実施します。

Apacheをサービスに登録

インストールした2つのApacheをそれぞれ別のサービスとして登録しましょう。
まずは「/etc/systemd/system」に「httpd24.service」というファイルを作成し、中身を以下のように記述します。

[Unit]
Description=httpd24
After=network.target remote-fs.target nss-lookup.target
Documentation=man:httpd(8)
Documentation=man:apachectl(8)

[Service]
Type=forking
ExecStart=/opt/httpd-2.4.41/bin/apachectl -f /opt/httpd-2.4.41/conf/httpd.conf -k start
ExecReload=/opt/httpd-2.4.41/bin/apachectl -k graceful
ExecStop=/opt/httpd-2.4.41/bin/apachectl -k stop
PrivateTmp=true

[Install]
WantedBy=multi-user.target


2つ目のインスタンスについても同様に「/etc/systemd/system」に「httpd24-ex.service」というファイルを作成し、中身を以下のように記述します。

[Unit]
Description=httpd24-ex
After=network.target remote-fs.target nss-lookup.target
Documentation=man:httpd(8)
Documentation=man:apachectl(8)

[Service]
Type=forking
ExecStart=/opt/httpd-2.4.41-ex/bin/apachectl -f /opt/httpd-2.4.41-ex/conf/httpd.conf -k start
ExecReload=/opt/httpd-2.4.41-ex/bin/apachectl -k graceful
ExecStop=/opt/httpd-2.4.41-ex/bin/apachectl -k stop
PrivateTmp=true

[Install]
WantedBy=multi-user.target

2つのインスタンスのファイルを用意できたら、起動してみましょう。

systemctl start httpd24

以下コマンドで起動できているか確認します。

systemctl status httpd24

f:id:J-back:20191123145904p:plain:w600

同様に、2つ目のインスタンスも起動しましょう。

systemctl start httpd24-ex

以下コマンドでプロセスを確認し、それぞれ起動していればOKです。

ps aux | grep httpd

f:id:J-back:20191123152759p:plain:w600

2つのインスタンスの動作確認

ブラウザを起動して「http://192.168.1.12」にアクセスすると、1つ目のインスタンスが応答しています。
f:id:J-back:20200320163541p:plain:w600

また、「http://192.168.1.12:8080」にアクセスすると、2つ目のインスタンスが応答します。
f:id:J-back:20200320163700p:plain:w600


しかし、この状態だと両方とも初期画面なので、それぞれのインスタンスが応答しているのか分かりずらいですね。
そこで、初期画面にインスタンスの番号を表示するように少し書き換えます。
1つ目のインスタンスの初期画面として表示されるのは「/opt/httpd-2.4.41/htdocs/index.html」なので、これを以下のように編集します。

<html>
    <body>
        <h1>It works!<br></h1>
        Instance1
    </body>
</html>

この状態で再び「http://192.168.1.12」にアクセスすると、以下のように「Instance1」と表示されていますね。
f:id:J-back:20200320173021p:plain:w600



また、2つ目のインスタンスの初期画面として表示されるのは「/opt/httpd-2.4.41-ex/htdocs/index.html」なので、これも以下のように編集します。

<html>
    <body>
        <h1>It works!<br></h1>
        Instance2
    </body>
</html>

こちらも編集後、「http://192.168.1.12:8080」にアクセスすると、「Instance2」が表示されています。
f:id:J-back:20200320173138p:plain:w600


最後に

以上で2つのApacheインスタンスをインストールし、起動させることができました。
最後までお読みいただき、ありがとうございました。

Pythonで株価をスクレイピングしてスプレッドシートに書き込む

目的

今回はPythonを使って、スプレッドシートに記載されている銘柄を読み込んで株価を調べ、結果をスプレッドシートに反映する、というプログラムを書いていきます。
ここでは以下のようなスプレッドシートを対象にします。
f:id:J-back:20191012205515p:plain:w600


プログラムの流れは以下のようなイメージです。
f:id:J-back:20191012192348j:plain:w600


なお、スクレイピングを実行するときは、対象のサイトに迷惑をかけないようにアクセス回数や頻度に注意しましょう。
現実的に人間がアクセスするぐらいの感覚で、アクション一つ一つの間に待ち時間を入れるようにするのが良いと思います。

Pythonの動作環境設定

まずはPythonの動作環境を設定しましょう。以下の記事で説明しています。
すでに設定できている方はスキップしてください。
www.77-lifework.com


Pythonスプレッドシートの連携方法

これも少し準備が必要です。以下の記事参照です。
www.77-lifework.com


Pythonのコード

最終的なコードは以下のようになりました。
readSpreadsheet(gc)でスプレッドシートから銘柄コードを読み込んで、スクレイピングを実施。
取得した株価のリスト(price_list)をwriteSpreadsheet(gc, value_list)によってスプレッドシートへ書き込んでいます。

# coding: UTF-8
import gspread
from oauth2client.service_account import ServiceAccountCredentials
from bs4 import BeautifulSoup
import requests
import time
import slackweb
  
# 例外発生通知用のslackのurl
SLACKURL_ex = '各自のslack連携用URLを入れてください'
  
# main処理
def main():
  
    scope = ['https://spreadsheets.google.com/feeds',
            'https://www.googleapis.com/auth/drive']
  
    #jsonファイルを指定
    credentials = ServiceAccountCredentials.from_json_keyfile_name('各自のjsonファイル名を入れてください', scope)
  
    # 認証
    gc = gspread.authorize(credentials)
  
    # 対象銘柄コード読み取り
    code_list = readSpreadsheet(gc)
  
    # 書き込み対象リスト定義
    price_list = []
  
  
    for i in range(1, len(code_list)):
  
        # スクレイピング対象URL
        URL = 'https://kabutan.jp/stock/?code=' + code_list[i]
  
        # スクレイピング実行
        try:
            #対象URLにリクエスト
            req = requests.get(URL)
            time.sleep(3)
  
            # 文字コードをUTF-8に変換し、html取得
            soup = BeautifulSoup(req.text, 'html.parser')
  
            # tagとclassを指定して要素を取り出す
            stock_price = soup.find('div', id='stockinfo_i1').find('span', class_='kabuka').text
            price_list.append(stock_price.replace('円',''))
  
        except Exception as e:
            message = "[例外発生]stock-price\n"+"type:{0}".format(type(e))+"\n"+"args:{0}".format(e.args)
            slackweb.Slack(url = SLACKURL_ex).notify(text = message)
            break
  
    # スプレッドシートへ株価を書き込む
    writeSpreadsheet(gc, price_list)
  
  
def readSpreadsheet(gc):
  
    # 読み込むシートを指定
    target_sheet = gc.open('test_sheet').worksheet('stock')
  
    # 指定した列のセルの値を読み込む
    value_list = target_sheet.col_values(1)
  
    return value_list
  
  
def writeSpreadsheet(gc, value_list):
  
    # 書き込み対象のシートを指定
    target_sheet = gc.open('test_sheet').worksheet('stock')
  
    for i in range(0,len(value_list)):
        #対象のセルに値を書き込む(row, col, value)
        target_sheet.update_cell(i+2, 3, value_list[i])
  
  
if __name__ == '__main__':
    main()


上記コードでは、スクレイピング中に例外が発生した際にはslackに通知するようにしてみました。
Pythonとslackの連携設定については、以下をご覧ください。
www.77-lifework.com


実際にコードを実行してみると・・・

f:id:J-back:20191012211454p:plain:w600

という感じで、株価が記載されています!


ちなみにスクレイピングの対象とするサイトから必要な情報(今回であれば株価)を抽出するときは、ブラウザで対象のページにアクセスし、
ページのソースを確認しましょう。
GoogleChromeであれば、対象のページを開いた状態でキーボードのF12を押すと、ページのソースhtmlを見ることができます。
f:id:J-back:20191012210218p:plain:w600


これを見ると、株価の値を取得するには、「 idが 'stockinfo_i1' のdivタグ」配下にある「classが 'kabuka' のspanタグ」を抽出すれば良いことが分かります。
このように、スクレイピングする際には対象のページを確認した上で、どのように必要な情報を取得するか考えてプログラムを組めばOKです。

最後に

これで指定した銘柄の株価をスプレッドシートに反映することができるようになりました。
このプログラムを1日1回自動実行する、など、cronやタスクスケジューラで設定しておけば、自分で調べる手間が省けますね。
最後まで読んでいただき、ありがとうございました。

PythonでGoogleスプレッドシートを操作する

はじめに

今回はPythonのプログラムからGoogleスプレッドシートの内容を読み込んだり、スプレッドシートに対して値を書き込んだり、をはじめとする、Pythonとスプレッドを連携させるための設定方法を書いていきます。

これができると、Pythonスクレイピングした情報をスプレッドシートで管理、共有することができるようになります。
スプレッドシートはクライアントPCの環境に依存せずに使用できるので、何かと便利ですよね。会社で使っている方も多いのではないでしょうか。

Google Cloud PlatformのAPI設定

まずはGoogleアカウントにログインした状態で、以下のリンクを開きましょう。
Googleのアカウントを持っていない場合は、新規登録しておきましょう。
console.cloud.google.com



リンク先を開くと以下の画面が表示されるので、「プロジェクトの選択」をクリック。
f:id:J-back:20191006234515p:plain:w600



「新しいプロジェクト」を選択。
f:id:J-back:20191006234556p:plain:w600



プロジェクト名を入力し、「作成」を選択。
f:id:J-back:20191006234633p:plain:w600



APIとサービス」の「ライブラリ」を選択。
f:id:J-back:20191006234723p:plain:w600



「プロジェクトの選択」をクリック。
f:id:J-back:20191006234821p:plain:w600



先ほど作成したプロジェクトを選択。
f:id:J-back:20191006235000p:plain:w600



以下の画面が表示されます。
f:id:J-back:20191006235108p:plain:w600



Google Drive」と入力して検索し、「Google Drive API」を選択します。
f:id:J-back:20191007000658p:plain:w600




「有効にする」を選択。
f:id:J-back:20191007000822p:plain:w600



以下の画面が表示されます。
f:id:J-back:20191007000901p:plain:w600



今度は「Google Sheets」と入力して検索し、「Google Sheets API」を選択します。
f:id:J-back:20191007000934p:plain:w600



「有効にする」を選択。
f:id:J-back:20191007001039p:plain:w600



以下の画面が表示されます。
f:id:J-back:20191007001112p:plain:w600

認証情報の設定

次に、メニューバーから、「認証情報」を選択します。
f:id:J-back:20191007003204p:plain:w600



「認証情報を作成」をクリックし、「サービス アカウント キー」を選択します。
f:id:J-back:20191007003252p:plain:w600



サービスアカウント名に任意の値を入力します。
f:id:J-back:20191007003457p:plain:w600



役割は「Project」の「編集者」を選択し、「作成」をクリックします。
f:id:J-back:20191007003540p:plain:w600



json形式のファイルがPCにダウンロードされます。
f:id:J-back:20191007003709p:plain:w600



サービス アカウント キーにIDが作成されていればOKです。
f:id:J-back:20191007003833p:plain:w600



ここで、ダウンロードしたjsonファイルを開くと

"client_email": "XXXXXXXX@YYYYYYYY"

と記載されている箇所があるので、「XXXXXXXX@YYYYYYYY」をコピーしておきましょう。


スプレッドシート側の設定

Pythonから操作したいスプレッドシートを開き、右上の「共有」をクリックします。
f:id:J-back:20191008000812p:plain:w600



「ユーザー」の部分に、先ほどコピーした「"client_email": "XXXXXXXX@YYYYYYYY",」の「XXXXXXXX@YYYYYYYY」を貼り付けます。
f:id:J-back:20191008001300p:plain:w600

これでスプレッドシートの設定は完了です。

必要なパッケージをインストール

以下2つのパッケージが必要となります。
・gspread
・oauth2client


以下コマンドを実行してインストールします。

pip install gspread
pip install oauth2client


または、環境によっては以下のコマンドとなります。ご自身の環境にあったものを実行してください。

pip3 install gspread
pip3 install oauth2client

これを実行すると、以下のような表示となります。
f:id:J-back:20191008002820p:plain:w600


f:id:J-back:20191008002839p:plain:w600


これでパッケージインストールはOKです。

Pythonプログラムを編集

以下のコードを作成し、実行しましょう。


# coding: UTF-8
import gspread
from oauth2client.service_account import ServiceAccountCredentials
  
scope = ['https://spreadsheets.google.com/feeds',
         'https://www.googleapis.com/auth/drive']
  
#jsonファイルを指定
credentials = ServiceAccountCredentials.from_json_keyfile_name('各自のjsonファイル名を入れてください', scope)
  
# 認証
gc = gspread.authorize(credentials)
  
# 読み込むスプレッドシートをファイル名で指定
target_book = gc.open('test_sheet')
  
# 読み込むシートをシート名で指定
target_sheet = target_book.worksheet('シート1')
  
#対象のセルに文字列を書き込み
target_sheet.update_acell('A1', 'test')


これを実行すると、以下のようにスプレッドシートのA1セルに「test」と書き込まれました!
f:id:J-back:20191008004650p:plain:w600


なお、上記プログラムを実行する際は、Pythonのファイルと同じ場所にjsonファイルも配置しておいてくださいね。

最後に

PythonのプログラムからGoogleスプレッドシートを操作する設定について書きました。これを応用すればPythonで集めたデータや解析結果などをスプレッドシートで管理することもできますね。

最後まで読んでいただき、ありがとうございました。

PythonでWebスクレイピング:Selenium動作環境設定

はじめに

今回はPythonスクレイピングをする際に使用するSeleniumのインストール方法を説明します。

この記事で前提としている環境は以下です。

CentOS 7.6(1810)
Python 3.6.8
Google Chrome 77.0.3865.90

まず、PythonでWebページをスクレイピングをする場合には、requestsパッケージを用いて対象のURLにアクセスしてページの内容を取得する方法があります。
しかし、スクレイピング対象のページがjavascript等を使用しており、これが一通り動作した後の状態をスクレイピングしたい場合にはseleniumが必要となってきます。
seleniumは自動で実際のWebブラウザを起動させて対象のURLにアクセスするため、ブラウザ上で表示されたページをそのままスクレイピングし、取得することができます。

Seleniumのインストール

すでにPythonがインストールされている場合は、OSにログインし、ターミナルで以下のコマンドを実行するだけでOKです。

pip install selenium

環境によってはPython3.x.xのパッケージはpip3で管理する、という場合もあるので、pipが通らなかったら下のコマンドも試してみてください。

pip3 install selenium


Successfully installed ・・・・ と表示されていれば大丈夫です。
f:id:J-back:20191005000018p:plain:w600



そもそもまだPython設定できてないよ・・・って方は以下の記事を参考にしてみてください。
www.77-lifework.com


ちなみに、CentOSインストールってどうやんの?って方は、以下をご覧ください。
www.77-lifework.com

chromedriverのインストール

ここではスクレイピングの際にGoogle Chromeを使用する想定ですので、
ブラウザを制御するためのプログラムであるchromedriverをインストールする必要があります。

pipコマンドでインストールすることもできるようですが、今回は実行形式になっているプログラムをダウンロードする方法を紹介します。

まず、以下のサイトにアクセスします。
chromedriver.chromium.org


現在CentOS上にインストールされているGoogle Chromeのバージョンに適応するChomeDriverを選択します。

今回の記事では、Google Chrome 77 ですので、これに対応するChromeDriverを選択しましょう。
f:id:J-back:20191005003200p:plain:w600

OSはCentOSなので、Linux用を選択しましょう。クリックするとダウンロードが始まります。
f:id:J-back:20191005003403p:plain:w600


ダウンロードしたchromedriverをCentOSに配置しましょう。
ここではpathが通っている「/bin」に配置しました。
f:id:J-back:20191005005325p:plain:w600


これでchromedriverのインストールはOKです。

最後に

以上でスクレイピングに必要なSeleniumとchromedriverのインストールができました。
これでjavascriptなどを使用した動きのあるページに対してもスクレイピングができるようになりますね。

最後までお読みいただき、ありがとうございました。

CentOS7へのApacheインストール

こんにちは。
今回はLinuxOSの1つであるCentOS 7.6(1810)にApacheをインストールし、動作させるまでの手順を書いていきます。

Apacheとは

正式には「Apache HTTP Server」という、Webサーバの機能を提供するソフトウェアのことです。
単に「Apache」と言うと、「Apache HTTP Server」を指すことが多いですね。

以下がApache HTTP Server Projectのホームページです。
httpd.apache.org


Apacheオープンソースのソフトウェアであり、無料で利用することができます。
また、動作するOSについてもWindowsLinuxMacと多岐にわたり、広い用途で多くの人が使用しています。

インストール手順

今回はCentOSが動作しているマシン上で、パッケージ管理コマンド「yum」を使用して、インターネットからApacheのパッケージをダウンロードします。

そもそもCentOSってどうやってインストールしたらいいの?って方は以下の記事を参考にしてください。
www.77-lifework.com


まずはCentOSsshでログインします。

ssh -l ユーザ名 IPアドレス

ここでは「test」というユーザでログインします。
f:id:J-back:20191002234312p:plain:w600

次に、rootユーザに昇格します。

su -

f:id:J-back:20191002234648p:plain:w600

yumコマンドでインストールします。

yum install httpd


選択肢は「y」を選びます。
f:id:J-back:20191002235025p:plain:w600


「完了しました!」と表示されたらOKです。
f:id:J-back:20191002235057p:plain:w600


以下のコマンドでApacheのバージョンを確認できます。

httpd -v


バージョンが表示されていればインストールできています。
f:id:J-back:20191002235556p:plain:w600

Apacheの起動

次にApacheを起動しましょう。

Apacheは起動後にプロセスに常駐し、アクセスしてきた複数のクライアントに対してWebサービスを提供する機能を持つプログラムです。
このような振る舞いをするプログラムのことをLinuxではデーモン(daemon)と呼びます。

CentOS7系では、上記のようなサービスのコントロールを「systemctl」コマンドから実行できるようになっていますので、これを使っていきましょう。


まずは以下コマンドで対象のサービスの状態を確認します。

systemctl status サービス名


Apacheのサービス名は「httpd」なので、今回は以下のようになります。

systemctl status httpd

上記コマンドを実行すると、httpd.serviceの起動・停止状態が表示されます。
Active: inactive (dead)と表示されているので、現在は停止状態であることが分かります。
f:id:J-back:20191003000315p:plain:w600


では以下コマンドで起動しましょう。

systemctl start httpd

上記コマンド実行後、再びstatusを表示すると、以下のように
Active: active (running)
と表示されており、Apacheが起動している状態となりました。
f:id:J-back:20191003000653p:plain:w600


この状態でPCのWebブラウザから
「http://ApacheをインストールしたサーバのIPアドレス」
にアクセスすると、以下のようにApacheの初期画面が表示されます。
f:id:J-back:20191003001600p:plain:w600



初期画面が表示されない場合は、CentOSファイアウォールでアクセスがブロックされている可能性が高いです。
テスト用や閉じられたネットワーク上で使うのであればCentOSファイアウォールは無効化しておいても問題ありません。

ファイアウォールのサービス名は「firewalld」なので、以下コマンドで状態を確認しましょう。

systemctl status firewalld


Active: active (running)となっていたら、以下コマンドで停止しましょう。

systemctl stop firewalld


この状態だとOS再起動時などにファイアウォールも再度立ち上がってしまうので、完全に停止しておきたい場合は以下コマンドも実行しておきましょう。

systemctl disable firewalld

Apache自動起動の設定

「systemctl + enable + サービス名」を実行しておくことで、OS起動時に指定したサービスを自動起動することができます。

ここではApacheについて、以下のコマンドで自動起動する設定にしておきましょう。

systemctl enable httpd

最後に

以上でCentOSApacheをインストールし、動作させる手順の説明は終わりです。
最後までお読みいただき、ありがとうございました。

Pythonの開発環境を設定する(Cent OS 7)

こんにちは。

今回はLinuxのディストリービューションの1つであるCentOS上で、Pythonが動作する開発環境を設定する手順を説明していきます。
CentOSのバージョンは7.6(1810)で、インストールするのはPython3です。

なお、CentOS7.6にはデフォルトでPython2.7がインストールされています。
Python3をインストールした後にはPython2とPython3が共存する状態になるので、この2つは使い分けることができます。

CentOSへログイン

まずはPythonをインストールするマシンにログインしましょう。
もちろん、直接対象のマシンを手元に置いて作業をしてもいいですし、別のPCからリモートでログインしてもOKです。
今回は後者の方法でやっていきます。
普段使用しているPCがMacLinuxの場合には、ターミナルを起動して、以下のコマンドでCentOSにログインします。

ssh -l ユーザ名 IPアドレス

上記はCentOS上のユーザ名とCentOSがインストールされているPCのIPアドレスです。
例えばユーザ名が「test」、IPアドレスが「192.168.1.78」である場合は

ssh -l test 192.168.1.78

となります。このコマンドを実行すると、以下のようにパスワードを求められます。
f:id:J-back:20190928163753p:plain:w600

指定したユーザのパスワードを入力し、Enterを押すと、以下のようにログインできました。
f:id:J-back:20190928164033p:plain:w600


普段使っているPCがWindowsの場合は 「tera term」などのソフトを使用すればOKですね。簡単にリモートログインができます。
使い方を紹介しているページも多いので、調べてみてください。
google:teraterm

Pythonのインストール

さて、CentOSのマシンにログインできたところで、実際にPythonをインストールしていきましょう。
まずは以下のコマンドを実行して、rootユーザを使用しましょう。

su -

Pythonのインストールには、パッケージ管理のための「yum」コマンドを使用します。

使い方としては

yum install パッケージ名

を実行すると、指定したパッケージとそれに必要な他パッケージを合わせてインストールしてくれます。
自分で1つずつ足りないパッケージを探してインストールしていくのは非常に面倒なので、yumを使うととっても楽です。

yumによってパッケージをインストールする際に探しにいく先をリポジトリと呼んでいます。
標準でyumが見に行くリポジトリには今回インストールしたいPythonのパッケージが無いため、
IUS Community Projectが提供しているリポジトリを参照先として追加しておきます。

以下のコマンドを実行しましょう。

yum install https://centos7.iuscommunity.org/ius-release.rpm


f:id:J-back:20190928174738p:plain:w600
途中に出てくる選択肢は、すべて「y」を選択しましょう。
f:id:J-back:20190928174803p:plain:w600
f:id:J-back:20190928174819p:plain:w600

以下のように「完了しました!」と出たらOKです。
f:id:J-back:20190928174836p:plain:w600

次にPythonをインストールしましょう。
まずは以下コマンドで参照先リポジトリPythonのパッケージが存在することを確認します。
ここではPython3.6を探してみましょう。

yum search python36

該当のパッケージが検索できていますね。
f:id:J-back:20190928175347p:plain:w600

以下コマンドを実行してインストールします。

yum install python36


選択肢は「y」を選択。
f:id:J-back:20190928175543p:plain:w600

「完了しました!」と出たらインストール完了です。お疲れ様でした。
f:id:J-back:20190928175619p:plain:w600

Python3.6を使いたいときは、以下コマンドを実行すればOKです。
ちなみに「ctrl+D」で抜けられます。

python3

f:id:J-back:20190928180301p:plain:w600

以下を入力してみると、ちゃんと動作していますね。

print ("Hello World!")

f:id:J-back:20190928180452p:plain:w600

Python2.7を使用したい場合は、

python2

と入力すればOKです。
f:id:J-back:20190928180713p:plain:w600


最後に

これでCentOS 7上にPythonの開発環境を用意することができましたね。

最後まで読んでいただき、ありがとうございました。