今回はPythonで簡単な業務を自動化するRPAを自作しましたので、内容を紹介していきます。

簡易的なプログラムですが、定型業務の自動化という点で、RPAをイメージするのに役立つかもしれません。

早速見ていきましょう。

内容紹介

今回は、Googleにて指定されたキーワードの上位100サイトの情報(タイトル、URL)を取得する簡易的なツールを作成しました。

これにより、SEO対策のキーワード選定時、競合サイトを大まかに把握できることでしょう。

こんなことができるんだな程度で見て頂ければと思います。

取得できるサイトの数は自分で設定することができますので、取得する数を調整したい場合は後ほど説明する箇所を編集してください。

処理内容は次のようになります。

1.コマンドライン引数よりキーワードを取得
2.chromedriverを使用して、指定された数のサイトのタイトルとurlを取得
3.結果ファイルを作成

実際の動作は以下の動画をご覧ください。

使用にあたって

本ツールを使用するにあたって、前提条件は以下になります。

・Pythonの実行環境が構築済みであること
・本ツールで使用しているライブラリ関数がインストール済みであること
・お使いのchromeのバージョンに合わせたchromedriverがインストール済みであること

※本コラムはあくまで自作ツール紹介であるため、上記の環境構築の手順は省略しますが、以下のサイトを参照しました。

・Pythonのインストール
pythonインストール手順<windows向け> – IT入門書籍 スッキリシリーズ

・外部ライブラリのインストール
Pythonライブラリのインストール - pipの使い方

以下、ソースコードになります。

17行目にはchromedriverのファイルパスを入力してください。

また、取得するサイト数や結果ファイルの形式は18,19行目をそれぞれ編集してください。

import sys
from selenium import webdriver
from time import sleep
import datetime
import os
import pandas as pd
from pandas import Series,DataFrame

'''
環境に合わせて以下定数を編集して下さい

PATH_DRIVER:chromedriverが保存されているファイルパス
NUM_ACQ:欲しいデータ数
FILE_FMT:出力ファイル形式(「.csv」または「.txt」)
'''

PATH_DRIVER = ('')
NUM_ACQ = 100
FILE_FMT = ('.csv')

#初期設定
key_find = ''
cnt = 1
ranks = []
titles = []
urls = []
flg_end = False

#コマンドライン引数判定、キーワード無の場合は処理中断
if len(sys.argv) <= 1:
    print("####\nEnter the keyword that you want to know seo rank.Please try again.\n####")
    sys.exit()

#検索ワード生成、キーワードが複数の場合、キーワード間にスペース
for word in sys.argv:
    if cnt == 2:
        key_find += word
    elif cnt >= 3:
        key_find += " " + word

    cnt += 1

#出力ファイルパス生成
this_dt = datetime.datetime.now()
this_dt = this_dt.strftime('%Y%m%d_%H%M%S')
tg_path = os.path.dirname(__file__) + "\\" + this_dt + FILE_FMT

#ブラウザ起動
driver = webdriver.Chrome(PATH_DRIVER)
driver.get('https://www.google.co.jp')

sleep(1.5)

#キーワード入力
search_bar = driver.find_element_by_xpath('//input[@class="gLFyf gsfi"]')
search_bar.send_keys(key_find)
search_bar.submit()

sleep(1)

print("\n\n####\nSTART COLLECTING DATA\n###\n\n")
print("-----------------------------")

#カウンターリセット
cnt = 1

#指定された数を満たすまでループ
while True:

    #検索結果ページ内のループ
    for elm_h3 in driver.find_elements_by_xpath('//a/h3'):
        elm_a = elm_h3.find_element_by_xpath('..')
        
        #取得した各データをリストへ格納
        ranks.append(str(cnt) + "位")
        titles.append(elm_h3.text)
        urls.append(elm_a.get_attribute('href'))

        print(cnt)
        print(elm_h3.text)
        print(elm_a.get_attribute('href'))
        print("-----------------------------")

        sleep(0.25)
        
        #カウンター更新
        cnt += 1

        #カウンター値判定
        if cnt == NUM_ACQ + 1:
            flg_end = True
            break
        else:
            flg_end = False

    #終了フラグ判定
    if flg_end == True:
        driver.quit()
        break
    else:
        print("\n###\nGO TO THE NEXT PAGE\n###\n")
        print("-----------------------------")
        nxt_elm = driver.find_element_by_id('pnnext')
        nxt_elm.click()

        sleep(1.5)

#各リストをシリーズ化
ranks = Series(ranks)
titles = Series(titles)
urls = Series(urls)

#各シリーズをデータフレーム化、カラム名設定
df = pd.concat([ranks,titles,urls],axis=1)
df.columns = ['Rank','Title','Url']

#ファイルへ書き込み
df.to_csv(tg_path,index=False,encoding='utf-8-sig',sep=",")

print('\n####\nFINISHED!!\n####\n')

動作確認済み環境

・Windows: 10.0.19041.1052
・Python:3.9.0
・chromedriver:91.0.4472.101

使用方法

コマンドプロンプトにて、作成したpyファイルが格納されているフォルダに移動して、以下コマンドを実行して下さい。

python xxxx.py yyyy zzzz

xxxx.pyにはプログラムのファイル名、yyyy,zzzzには検索したいキーワードを入力してください。キーワード数に指定はありませんが、キーワードの入力がない場合、処理を中断します。

処理終了後、pyファイルと同じフォルダに結果ファイルが出力されます。

コードの大まかな説明

今回作成したツールのコードを大まかに説明していきます。

1.コマンドライン引数よりキーワードを取得

まずは、コマンドライン引数より、キーワードを取得します。

キーワードが入力されない場合は、エラーメッセージをコマンドプロンプト上に出力して、処理を終了するようにしています。

2.chromedriverを使用して、各サイトのタイトルとurlを取得

chromedriverを使用して、検索結果で表示されたタイトルとurlを取得していきます。
また、スクレイピングをするにあたってはseleniumを使用しました。

キーワード取得後、googleへアクセスし、指定されたキーワードを検索します。

検索結果ページのHTMLコードにて、タイトルが定義されているh3タグの上にurlを指定しているaタグがあるという規則性があったため、それを利用してfor文でループを回し、タイトルとURLを取得しています。

ランク、タイトル、URLの情報をあらかじめ用意していたリストへ格納していき、ページ内での情報取得が終わったら次の検索結果ページに遷移します。

ひとつのサイト情報を取得するたびにカウンターを更新、カウンターが指定された値(デフォルトでは100)を満たす場合はフラグを立てて、break文で処理を抜け出す様にしています。

また、リアルタイムでモニターしたいため、情報を取得するたびにコマンドプロンプトに内容を出力しています。

3.結果ファイルを作成

次に、取得した各情報のリストをシリーズ化、各々シリーズをデータフレーム化して、カラム名を設定していきます。

最後にデータフレーム化されたものを、csvまたはtxtファイルでこのツールファイルと同じフォルダへ出力します。

さいごに

今回はPythonを使って簡単な作業をRPA化してみました。

今後は、Ezrobotで作成したロボットも含めて紹介していきたいと思います。