てけとーぶろぐ。

ソフトウェアの開発と、お絵かきと、雑記と。

ポケモンGOフレンド。

数ヶ月前のこと。

ポケモンGOのフレンドが
同僚のおっちゃん1人しかいなかったので
なんとなくフレンド募集掲示板に書き込まれていた
フレンドコード何件かにフレンド申請を送ってみた。

程なくして数人から承認が。
めでたくフレンドが増えたと思ったのもつかの間
何回かプレゼント交換が済むと次々と縁切りされてしまった。

そんな中1人残った方が。

1ヶ月間くらいか。

その方は、島根県松江の方らしく
毎日松江のお寺なんかの心休まる風景(ポケストップ画像)が
送られてくる。

僕はというと
気を抜くと家の前の公園で満たされてしまうプレゼントの中から
マシな風景(それでも通勤経路の風景なのだが)を
見繕って送る日々。

そんな日が続いた。

そしてある日、いつものようにプレゼントを開けてみると
そこにはいつもと違う風景が。

「松江空港」

え、空港? …旅行? どこへ…?

こっちに来る? いや、あるはずない、妄想も大概に…

顔も名前も知らない
毎日ポケストップ画像をやり取りするだけの関係。

そして翌日送られてきたのは

「ディズニーリゾート」

なんかこう、わくわく感が伝わってくる。
ポケストップ画像だけでこの表現力。

やるじゃんか…!

…って、そういうゲームじゃねえからこれ!

Chromebook で chromebrew を試す。

最近 Visual Studio Code を使っていて、Chromebook版もあるということを知り試してみた。

Visual Studio Code for Chromebooks and Raspberry Pi

見てみると crouton extension を使うもののよう。起動に少し手間がかかる。
インストールして画面が出た時は感動したが
いざ使えてみると他のツールも使いたくなり
結局フルスペックのPCじゃないとだめじゃないかという結論に…。

いやいや、ChromebookChromebook としていいところがあって
それにあと少しだけ、ローカルで、ちょっとしたテキストを打ったり、ちょっとしたプログラムを組んだり、そういったことができればいいんだと気づく。

そんなところに chromebrew というものを見つけた。
Homebrew のような Chrome OS 用のパッケージマネージャー。

GitHub - skycocker/chromebrew: Package manager for Chrome OS

開発者モードで使えるシェル上で、chroutonを使わずに、Linuxでお馴染みの各種ソフトをインストールしたり、使ったりできるようになる。
インストールは簡単。

  1. Chromebookデベロッパーモードにする
  2. Chrome 上で ctrl+alt+t でcroshシェルのタブを開き
  3. shell と打ってエンターキーでデベロッパーシェルを開く
  4. 以下のコマンドを打ってエンターキーでインストール実行
curl -Ls git.io/vddgY | bash

wgetを使ったインストールは最新の Chrome OS にはwgetコマンドがなく使えず

Windowsな人に優しいキーバインドのターミナルベースのテキストエディター「micro」や「Pytyon3」「openssh」なんかをインストールした。

デベロッパーシェル上で以下を実行すればそれぞれインストールできる。

crew install micro
crew install python3
crew install openssh

なかなかいいじゃないか。

Selenium+Python+PhantomJSでWebサイトのスクレイピング

先回の続き。

操作対象のWebブラウザーChromeからPhantomJSに変える。

PhantomJSはGUIを持たない、いわば透明なブラウザー
これにしてやると、動作中に画面を占領されないし
コマンドラインから起動できてサーバー上でのバッチ実行などにも使えるようになる。

PhantomJSインストール

http://phantomjs.org/download.html からダウンロードしてパスを通しておく。

操作用Pythonスクリプトの作成

先回とほぼ同じ。
webdriverの作成の部分だけ変わる。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import codecs
import time

from selenium import webdriver
from selenium.common.exceptions import TimeoutException

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

WAIT_SECOND = 30

USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36"

if __name__ == '__main__':

    driver = webdriver.PhantomJS(
        service_args=['--ignore-ssl-errors=true', '--ssl-protocol=TLSv1'], 
        desired_capabilities={'phantomjs.page.settings.userAgent': USER_AGENT})
    driver.set_window_size(1280, 1024)

    driver.get('https://google.co.jp/')

    # 検索キーワードとエンターキーを入力
    t=driver.find_element_by_id('lst-ib')
    t.send_keys(u'てけとーぶろぐ\n')

    # 要素の表示待ち
    WebDriverWait(driver, WAIT_SECOND).until(
        EC.visibility_of_element_located((By.CLASS_NAME, '_Rm')))

    # リンクをクリック
    b=driver.find_element_by_xpath('//*[@id="rso"]/div/div/div[1]/div/div/h3/a')
    b.click()

    # 要素の表示待ち
    WebDriverWait(driver, WAIT_SECOND).until(
        EC.visibility_of_element_located((By.CLASS_NAME, 'entry-title-link')))

    # スクリーンショットの保存
    driver.save_screenshot("ss.png")

    # ソースの書き出し
    file_name = 'test.html'
    with codecs.open(file_name, 'a', 'utf_8') as f:
        f.write(driver.page_source)

    driver.close()

ポイント

service_args

CentOSにおいてサイトによってはこの設定をしないと表示できなかったので指定する。

userAgent

今回はChromeと同じユーザーエージェントを設定している。
サイトによってはこの設定をしないとChromeでの表示結果と変わってしまうので指定する。

スクリーンショット

以下のコードでスクリーンショットを画像ファイルとして保存できる。

driver.save_screenshot("ss.png")

見えないブラウザーなので状況把握に便利。

Selenium+PythonでChromeの自動操作

Webアプリのテストのときや、Web上のデータ収集のときなど
Webブラウザーを自作プログラムから操作できると便利なことがある。

というわけでSelenium+PythonChromeを自動操作してみる。

今回は Windows, Python 2.7 という組み合わせで行ったけど
Python 3.x でも同様だと思う。

Pythonのインストール

https://www.python.org/の「Download」から
python-2.7.13.msi」をダウンロードしてインストールする。

PythonSeleniumのインストール

「C:\Python27」「C:\Python27\Scripts」にパスを通した状態で
コマンドプロンプトから以下を実行する。

pip install selenium

Chrome用ドライバーのインストール

https://sites.google.com/a/chromium.org/chromedriver/downloads
の「Latest Release: ChromeDriver 2.29」のリンクから
「chromedriver_win32.zip」をダウンロード、展開して
中の「chromedriver.exe」を適当な場所に置く。

操作用Pythonスクリプトの作成

例えば「main.py」として以下のように作成する。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import codecs

from selenium import webdriver
from selenium.common.exceptions import TimeoutException

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

WAIT_SECOND = 30

if __name__ == '__main__':

    driver = webdriver.Chrome()  
    driver.maximize_window()    
    driver.get('https://google.co.jp')
    
    # 検索キーワードとエンターキーを入力
    t=driver.find_element_by_id('lst-ib')
    t.send_keys(u'てけとーぶろぐ\n')

    # 要素の表示待ち
    WebDriverWait(driver, WAIT_SECOND).until(
        EC.visibility_of_element_located((By.CLASS_NAME, '_Rm')))

    # リンクをクリック
    b=driver.find_element_by_xpath('//*[@id="rso"]/div/div/div[1]/div/div/h3/a')
    b.click()

    # 要素の表示待ち
    WebDriverWait(driver, WAIT_SECOND).until(
        EC.visibility_of_element_located((By.CLASS_NAME, 'entry-title-link')))

    # ソースの書き出し
    file_name = 'test.html'
    with codecs.open(file_name, 'a', 'utf_8') as f:
        f.write(driver.page_source)

    driver.close()

操作用Pythonスクリプトの実行

「chromedriver.exe」にパスを通した状態で
作成した操作用Pythonスクリプトを実行する。

python main.py

ポイント

要素情報の確認方法

スクリプトでWebサイト上の要素を指定するのに
要素のXPathなどが必要だがこの確認には
Webブラウザーの機能を使うのが楽。
ChromeだとF12キーでデベロッパーツールを表示して
Shift+Ctrl+C を押してから要素をマウスクリック。
HTML上でハイライトされた行を右クリックして
Copy → Copy XPath とか。

確実なロード待ち方法

読み込み待ちには上記の例のように表示を待つのが確実。
サイトによっては要素を非表示状態でロードした後
動的に表示状態に切り替えたりするので。

その他の要素指定方法

要素の指定の仕方はXPath以外にも幾つかある。
ドキュメントをどうぞ。
http://selenium-python.readthedocs.io/locating-elements.html

AndroidDrawableResizer

Androidアプリ作成の際に、画像を使う場合
各解像度用の画像を用意するのが望ましいのだけど
手でつくっていると面倒なのでツールを作った。

GitHub - kurima-yoshida/AndroidDrawableResizer

settings.json に設定を書き込んで
変換元のファイルを引数として渡して実行すると
指定のフォルダー内に変換後のファイルが生成される。

拡大縮小の他に、非透明色部分を指定の色で塗りつぶす機能も付けている。

例えばMaterial icons - Material Designでダウンロードしたアイコンを好きな色にできる。

Windows用の実行ファイルは以下。

drisezer100.zip

一時的にパスを通したコマンドプロンプトを起動するバッチ

コマンドプロンプトから実行するソフトには
パスを通しておいた方が使いやすいものが多いけど

いちいち環境変数pathに追記していたらpathの値がえらい長くなるわ
ソフトが不要になってもpathから取り除き忘れるわ。

それを避けたい場合はコマンドで一時的にpathに追記すればいいけど
何度も使う場合はいちいちやってられない。

そんなときには「一時的にパスを通したコマンドプロンプトを起動するバッチ」を用意しておくと便利。

例えば「C:\Python27」にパスを通した状態でコマンドプロンプトを起動するバッチファイルなら以下のような感じ。

cd /d %~dp0
set path=%path%;C:\Python27
cls
%windir%\system32\cmd.exe /k

1行目はおまけでバッチファイルのあるディレクトリーをカレントディレクトリーにしている。
4行目でコマンドプロンプトを起動、そのまま表示しておく。

参照:
batファイルで、そのファイル自身のパスを取得する - 砂漠の音楽

ScreenOCR(2)

ScreenOCR で紹介した「ScreenOCR」のソースコード、公開しておきます。

GitHub - kurima-yoshida/ScreenOCR

TesseractというオープンソースOCRがあるらしい。これを組み込めばオフラインで動くものが作れるのだろうなぁ。

tesseract-ocr · GitHub