【Python】Seleniumを使ってジョブカン入力チェック自動化
はじめに
この記事は Webスクレイピング Advent Calendar 2017の24日目です。
最近、何故か業務効率化のシステム自動化に興味津々です。
なので、業務中に困ったことをシステム化しようと思います!
最近、困っていること
ジョブカンの勤怠入力忘れ
が激しいことです(汗)
勤怠入力漏れは人事に迷惑をかけてしまうので、入力チェック自動化プログラムを作成していきます!
作成したプログラムはこちら
※注1)ジョブカンは勤怠管理を行う上で非常に便利なサービスです。
※注2)入力漏れを行うのは僕がボケているだけです。
作成手順
ジョブカンAPIを調べてみたら、APIは存しなかったので、Seleniumを用いて、自動化していきます!
Seleniumとは
Googleが開発したWebアプリケーションテスト用 フレームワークです。
(Pythonの他にはruby、Javaなど様々な言語に対応してます!)
処理フロー(概要)
今回の流れは以下の4つの手順にわけてプログラムを作成しました。
といっても、通常の人が使うブラウザ操作をプログラムに置き換えただけなんで処理フローは把握し易いと思います!
1.setup
selenium setupを行います!
今回はヘッドレスブラウザ(ブラウザを立ち上げず、メモリ上でブラウザ操作)を利用しました!
2.page取得
TOPページにアクセス!
3.ログイン
通常のログインのようにID、パスワードを入力します。
Seleniumのmethod find_element~
でCSS属性を特定して、send_keys
でフォームに値を入力すると、
ログイン後のページに遷移します!
ちなみにスクリーンショットを取るのは save_screenshot
で出来ます。
ログインページ
ログイン後のページ
4.勤怠データ取得
htmlパースは ライブラリ beautiful soup
を使いました!
取得した値を標準出力!
最後に
slackやLambda
連携させたらもっと効率化出来るな〜と思いました。
本日は以上です!
【Ruby】形態素解析、ビジュアリゼーション、スクレイピング
この記事は ジーズアカデミー Advent Calendar 2017 の2日目です。
はじめに
ウェブスクレイピングは結構好きで、主にrubyを使ってスクレイピングしているんですが、 blogでは python(記事リンク) しか書いたことがない。
なので、今回は
ruby でスクレイピングして形態素解析してビジュアリゼーションしてみます!
対象
せっかくなんで、今回はジーズアカデミーのサイトをスクレイピングしてみます。
画像
抽出項目
分量が多いほうが良いいので、トップページ下にある
記事全てを取得します!
実行準備
利用ライブラリ
主なライブラリは以下の通りです!
- db: activerecord nokogiri
- スクレイピング: open-uri nokogiri
- 形態素、ビジュアル: mecab-ipadic-neologd natto magic_cloud
を利用します!
手順
手順は以下の通りとなります。
- open-uri を用いて、トップページを取得し、記事リンク取得
- 取得したリンクをopen-uriでページ取得、nokogiriを用いて記事ページを取得し、ActiveRecordでDBに保存
- 形態素解析を用いて英単語(magic_cloud との関係か?日本語の相性がうまくいかなかった汗)をビジュアル化
実行!
スクレイピング
取れた!
形態素〜ビジュアル化
だらだら、色々とやってたのですが、今回はビジュアルだけにしておきます。
ソースコード
ココのレポジトリにおきました!
終わりに
スクレイピングはpythonが現状優勢ではありますが、慣れているのでrubyは書きやすい! 何より、スクレイピング特有の複雑な条件式やエラーハンドリングに対応しやすいのが良いな〜と改めて感じました!
本日は以上です!
シェルスクリプトその2 制御構文(if文,for文)
はじめに
前回に引き、今回は制御構文をまとめていきます。
if文
他のプログラムと違うところはif文の後ろにつける 条件式
ではなく、コマンド式
ってことです。
最初何行っているのかよくわから買ったのですが、以下の例だとわかりやすいです。
#!/bin/sh # file名:test1.sh # []でくくるとbashのコマンドとして評価 スペース注意 if [ true ]; then echo 'true' end
# test1.sh実行 $ sh test1.sh $ true
以下のサンプルコードですと、通常の条件式なら、false
では出力されないです。
が、シェルスクリプトだと、あくまでもbash のコマンドとして認識され、出力されます。
#!/bin/sh # file名:test2.sh # これでも通る if [ false ]; then echo 'false' fi
# test2.sh実行 $ sh test2.sh $ false
#!/bin/sh # file名:test3.sh if [ "$1" = "true" ]; then echo 'true' else echo 'false' fi
# test3.sh実行 $ sh test3.sh $ false $ sh test3.sh true $ true
for文
for文はあまりハマりどころがなかったので軽くまとめておきます。
for 変数名 in リスト do # 処理記述 done
#!/bin/sh # ./test/*.txtを削除するプログラム for fname in $(find ./test/* -name '*.txt') do rm -rf $fname done
シェルスクリプト入門 その1 入力、出力、変数
はじめに
動機
シェルスクリプトを最近(ようやく?)、自分で書くようになってきました。 スクリプト言語と違うところ及び自分の頭の整理のために書いていきます。
シェルクスクリプトとは
シェルスクリプトとはunixコマンドを一つのファイルにまとめて実行するプログラムです。
利用シーン
などなど、使えると色々と便利なのは間違いありません!
入力、出力
とりあえず hello world
#!/bin/sh echo "hello world" # hello world
と書いて、実行すると、hello world
と出力されます!
$ sh hello.sh $ hello world
重要なポイントは以下の点です。
- 文頭に
#!/bin/sh
と記述。 - シェルスクリプトは
unixコマンドが使える
- 今回は
echo
を使用
- 今回は
- コメントは
#
と記述した後に記述
標準入力、出力
- read で値を標準入力
- echoで値を出力します。
#!/bin/sh read input echo "input=$input"
$ sh read.sh $ hello $ input=hello
といった形で標準入力、出力が行えます!
変数
重要なポイントは以下の通りです。
- 変数に値を与える際、
variable=hoge
といったようにスペースをつけない - 宣言した変数をアクセスする際は 先頭に
$
をつける。 readonly
を用いると変数を上書きされない。readonly
を解除するにはunset
を用いる。
#!/bin/sh variable=hoge #スペースを入れない echo $varible #変数にアクセスする際は$をつける
$ sh variable01.sh $ hoge
また、readonly
と宣言すると、変数の上書きがされません。
#!/bin/sh variable="変数" echo "$variable" readonly variable variable="変更"
$ sh variable02.sh $ 変数 $ variable02.sh: line 5: variable: readonly variable
特別な変数
個人的に使用頻度が高いと思われるものに絞ります。
- $0 [スクリプト名]
- $1 ~ $9 [引数をアクセス 数字は引数の順番を示す]
- $$ [実行したプログラムのプロセスID]
#!/bin/sh echo $0 #special_varable.sh echo $1 #1つ目の引数を出力 echo $$ #プロセスIDを出力
【Go言語】スライス
最近、Go言語を勉強しているので、メモがてら書いておきます。
スライスの特徴
容量を増やせば可変長型配列のように使えるようです。 GoはArrayだと要素数は最初に宣言した以上には増やせません。
使い方コード例
package main import "fmt" func main() { s := []int{2, 3, 5, 7, 11, 13} var s1[]int var s2[]int var s3[]int s1 = s[1:4] fmt.Println(s1) // [3 5 7] s2 = s[:2] fmt.Println(s2) // [2 3] s3 = s[1:] fmt.Println(s3) // [3 5 7 11 13] fmt.Println(cap(s)) // 配列の容量 fmt.Println(len(s)) // 配列の長さ }
make append
package main import "fmt" func main() { slices := make([]int, 3) fmt.Println(slices) // [0 0 0] var slices_append []int slices_append = append(slices, 1) // 追加 fmt.Println(slices_append) // [0 0 0 1] fmt.Println(len(slices_append)) // 要素数 4 fmt.Println(slices_append[2]) //要素にアクセス 0 }
参考
【ruby】キーワード引数と通常の引数組み合わせ
キーワード引数と通常の引数組み合わせ
エラー例
def test_method1(params = {}, hoge: true) return params, hoge end
# こける $ irb> test_method1({test: 'test', test2: 'test2'}) $ ArgumentError: unknown keywords: test, test2
エラーとならない
def test_method2(params, hoge: true) return params, hoge end
すると、
# こけない $ irb(main)> test_method2({test: 'test', test2: 'test2'}) $ => [{:test=>"test", :test2=>"test2"}, true]
エラーとならない2
もう一つ
def test_method3(hoge: true, **params) # 引数の順序としてキーワード引数が先となる return params, hoge end
すると、
# これもこけない $ irb(main)> test_method3({test: 'test', test2: 'test2'}) $ => [{:test=>"test", :test2=>"test2"}, true]