
RPAは無料で出来るって知っていましたか?(RPA-Python)
2021-06-14
RPAとはrobotic process automationの略で、要するに機械によってプロセスを自動化する手法です。
人間がキーボードやマウスを操作して行うことを、機械に代わりにやってもらうわけですね。同じような操作を何回もしないといかにような場合に使うととても効果的です。
市販のRPAソフトもありますが、プログラミングができるなら自分でやったほうが圧倒的にコスパが良いです。なにせ無料ですから!
というわけで、今回はRPA-Pythonを利用した自動化方法について紹介していきます。
RPA-Pythonとは?
Pythonで使えるRPAのパッケージです。以上!笑
Githubにサンプルコードもあるので、気になる方はチェックしてみてください。
Python package for doing RPA. Contribute to tebelorg/RPA-Pyth
##RPA-Pythonのインストール
まずは必要なパッケージをインストールします。以下のコマンドを叩くだけでインストールできるのでお手軽です。
pip install rpa
早速、RPAを作成していきましょう。
OpenJDKがない場合の注意点
ちなみにOpenJDKがない場合、以下のような表示が出ます。

画像を使って、RPAを行いたい方は、ここに書かれているようにAmazon Corettoからダウンロードしてください。

右側にある"Amazon Corretto 17をダウンロードする"から自分のOSに合ったものをダウンロードすることができます。
MacOSのアクセス権限の設定の注意点
また、MacOSの場合、RPAはパソコンに変更を行うため、「システム環境設定→セキュリティとプライバシー→アクセシビリティ」にて開発環境のアプリケーションを登録する必要があります。

RPA-Pythonの基本的な使い方
RPAを作成するために、今回は2つの要素を実装します。
- 機械にパソコンを操作してもらう
- 機械に画面上の要素を探してもらう
"機械にパソコンを操作してもらう"とは、あなたがマウスやキーボードなどを操作する動きを、コードで再現することができます。
”機械に画面上の要素を探してもらう"とは、あなたが自分の眼を使って画面を見るように、画面上に表示されている特定の画像を探したりすることができます。Webページならタグを指定して探してもらうこともできます。
この2つを組み合わせてやりたいことを実行できるようにしていくわけですね。
YahooJapanのヘッドラインを自動で取得
マーケティングを勉強していると、ヘッドラインの大切さは理解していると思います。YahooJapanのヘッドラインはよくできていて、結構勉強になりますよね。なぜそのヘッドラインをクリックしたのかを考察していくと面白いことがわかったりします。
そんなヘッドラインをRPAによって自動で取得してもらいましょう。
# yahoo_headlines.py
import rpa as r
r.init(visual_automation = True)
r.url('https://www.yahoo.co.jp')
まずはパッケージのインポートと初期化を行います。シンプルですね。
画像を利用してRPAを行いたい場合は、visual_automationをTrueに設定します。
さらにr.url()でurlを指定すれば、アクセスしたいページに移動することができます。
YahooJapanのヘッドラインの座標を取得
まずはYahooJapanにアクセスして、ソースを読んでみます。めちゃくちゃごちゃごちゃしていて、タグからはどこを取得したらよいのかよくわかりません。
<h1 class="_3cl937Zpn1ce8mDKd5kp7u">
<span class="fQMqQTGJTbIMxjQwZA2zk _3tGRl6x9iIWRiFTkKl3kcR">ノーベル化学賞 根岸英一氏死去</span>
</h1>
Webスクレイピングをするのはなんだか難しそうですね。でもRPAならそんなに苦労しなくてすみます。
まずページの構成がどんなふうになっているか見てみましょう。
- ニュース、経済などのタブがあり、それぞれにヘッドラインがある
- 下に「もっと見る」がある
- 「国際」タブの右あたりに画像が1枚ある
というわけで…
タブの下から「もっと見る」までの間と、「ニュース」タブから「国際」タブの間にある文字列を取得したい、ということがわかりました。
# yahoo_headlines.py
r.hover('yahoo_news.png')
x1,y1 = r.mouse_x(), r.mouse_y()
r.hover('yahoo_international.png')
x2 = r.mouse_x()
r.hover('yahoo_more.png')
y2 = r.mouse_y()
print(x1,y1,x2,y2)
ここでは3つの座標を取得しています。
- 「ニュース」タブの座標を取得して、左上の座標にします。
- 「国際」タブの座標を取得して、右側のxの座標にします。
- 「もっと見る」の座標を取得して、下側のyの座標にします。
ここでyahoo_news.pngはYahooJapanで[ニュース]と書かれている部分をスクリーンショットで画像を撮ったものになります。同じように他の画像もスクリーンショットを取っておきます。



これで欲しい部分の座標を手に入れることができました。
YahooJapanのヘッドラインの画像を取得する
次は、この座標内の部分の画像を取得します。実際に欲しいのは、ヘッドラインの一覧ですからね。
これにはr.snap()関数を利用します。ここに座標を指定すると、その中を画像として取得することができます。
ちなみにr.read()関数を使うと、座標部分をOCRにかけて、文字列を取得してくれるのですが、日本語対応の仕方がわかりませんでした( ̄▽ ̄;)
なので、今回はr.snap()を使います。取得した座標は、画像の中央あたりの座標になるので、位置を少し調整しています。この辺りは、実際に撮れた画像をみながら調整します。
r.snap(x1-24, y1+20, x2, y2-25, 'results.png')

こんな感じの画像が取得できるようになりました。
PythonでOCRを使う準備をする
RPA-PythonのOCRがうまくいかなかったからといって、OCRができないわけではありません。別のOCRパッケージを使えば良いのです。
今回はTesseractOCRを利用します。
Tesseract documentation. Contribute to tesseract-ocr/tessdoc
TesseractOCRはオープンソースのOCRエンジンということで、気軽に使うことができます。HomebrewでインストールできるのでMacOSでも利用しやすいです。以下のコマンドでインストールできます。
brew install tesseract
ただし、これも基本設定は英語になっているので、このままだと日本語が読めません。
上記GitHubにリンクがあるTraineddata Filesから、特定の言語のファイルを持ってくることで、日本語対応することができます。
精度の良さそうなtessdata_bestを使ってみます。
この中から、jpn.traineddataをダウンロードします。縦書き用のjpn_vert.traineddataというのもありますが、今回は横書きしかないので使いません。
このファイルを以下のフォルダに入れます(MacOSの場合)。途中の4.1.1はtesseractのバージョンなので、環境によって変わります。
/usr/local/Cellar/tesseract/4.1.1/share/tessdata/
Finderから[移動→フォルダに移動]で/usr/local/Cellar/tesseractと入れるのが早いと思います。
ここに先ほどダウンロードしたjpn.traineddataを入れておきます。

最後に、PythonでOCRを使うために、PyOCRというパッケージをインストールします。
pip install pyocr
これでようやく準備が完了です!
YahooJapanのヘッドラインの画像を文字列に変更する
では早速PyOCRを使っていきます。
PyOCRのページにあるUsageのコードをほぼそのまま使うことができます。
from PIL import Image
import sys
import pyocr
import pyocr.builders
tools = pyocr.get_available_tools()
if len(tools) == 0:
print("No OCR tool found")
sys.exit(1)
tool = tools[0]
print("Will use tool '%s'" % (tool.get_name()))
lang='jpn'
txt = tool.image_to_string(
Image.open('results.png'),
lang=lang,
builder=pyocr.builders.TextBuilder()
)
txt = txt.split('\n')
txt = txt[1:]
for t in txt:
for remove_chr in [' ','*','・']:
if remove_chr in t:
t=t.replace(remove_chr,"")
if len(t) != 0:
print(t)
pyocr.get_available_tools()で先ほどインストールした、tesseractを取得してくれます。他にOCRツールを入れていなければこのまま動きます。
langはサンプルではtool.get_available_languages()で取得していましたが、今回はjpnがあることがわかっているので直接書きました。(lang='jpn')
続いてtool.image_to_string()で画像から文字情報を取得しています。
最後に取得した文字情報を少し綺麗にしてコンソールに表示しています。
結果は以下のようになりました。
- G7宣言東京五輪開催「支持」のの1314
- 群馬など3県「まん延防止」解除G由のの220
- G7宣言にインフラ支援や台湾331
- 市場爆発習氏が原因究明指示還のの385
- 多様性配慮の制服式典NG波紋1681
- 朝倉未来引退も含めて考える0且りの592
- 遠藤保仁が通算700試合J史上初110
- AKB公演に鈴木亜美息たえだえ1152
NEWのアイコンと吹き出しのアイコンが悪さをしているのがわかります…。とはいえ、それ以外は結構高い精度で読み込んでくれています。
他のタブのヘッドラインも取得する
他のタブのヘッドラインを取得するには、ここまでやったことを繰り返し行えばいいだけです。
具体的には、RPAで各タブの画像を保存しておいて、その画像の場所をクリックします。すると、そのタブのヘッドラインが表示されるので、ヘッドラインが表示される範囲を画像で取得。最後にOCRで文字列に変換します。
ついでに、取得した文字列をファイルに保存するようにしておきます。
Yahooのヘッドラインを取得する全コード
同じ名前の画像を用意すれば、動くようになります。画面上で勝手に操作されるのをみてるのはなんだか楽しくなりますね!
import rpa as r
from PIL import Image
import sys
import pyocr
import pyocr.builders
# get headline coordinates
r.init(visual_automation = True)
r.url('https://www.yahoo.co.jp')
r.hover('yahoo_news.png')
x1,y1 = r.mouse_x(), r.mouse_y()
r.hover('yahoo_international.png')
x2 = r.mouse_x()
r.hover('yahoo_more.png')
y2 = r.mouse_y()
# set ocr
tools = pyocr.get_available_tools()
if len(tools) == 0:
print("No OCR tool found")
sys.exit(1)
tool = tools[0]
lang='jpn'
headline_file = open("headlines.txt","a+")
# get headlines
for tab_image in ['yahoo_news.png','yahoo_econ.png','yahoo_enter.png','yahoo_sport.png','yahoo_dom.png','yahoo_international.png','yahoo_it.png','yahoo_region.png']:
r.click(tab_image)
r.snap(x1-24, y1+20, x2, y2-25, 'results.png')
txt = tool.image_to_string(
Image.open('results.png'),
lang=lang,
builder=pyocr.builders.TextBuilder()
)
txt = txt.split('\n')
txt = txt[1:]
for t in txt:
for remove_chr in [' ','*','・']:
if remove_chr in t:
t=t.replace(remove_chr,"")
if len(t) != 0:
print(t)
headline_file.write(t+"\n")
r.close()
headline_file.close()
まとめ
Pythonを使えばRPAも簡単に作ることができます。今回は、MacOS上で操作していきましたが、もちろんWindowsでも実施可能です。
何回も行わないといけない地味な作業をRPAにできると、とても気分が良くなります(笑)
とはいえ、まだ課題もあります。やっぱりOCRの精度がときどき微妙なところがありますね。でも今回は長くなってきたのでここまでとします!
この記事はnoteにも投稿しています