プログラミング備忘録

プログラミングでやったことを書いていきます。Python,機械学習など

Mac PythonでSeleniumを動かしてみる

はじめに

題名の通りMac上でpythonを使ってSeleniumを動かしてみます

参考ページ

qiita.com

環境

MacOS Mojave
Python 3.5

必要なもの

selenium
chrome driver

Seleniumのインストール

pipでSeleniumのインストールができます.

pip install selenium

chrome driverのインストール

brewが入っていればbrewでインストールできるそうです.

brew install chromedriver

しかし,以下のようなエラーがでる.

Error: No available formula with the name "chromedriver" 
It was migrated from homebrew/core to homebrew/cask.
You can access it again by running:
  brew tap homebrew/cask
And then you can install it by running:
  brew cask install chromedriver

コマンドが指示されたのでそのまま動かすと

brew cask install chromedriver

無事インストール完了.
これで必要なものは揃いました.

実際に動かしてみる

とりあえず,参考ページのプログラムをそのまま動かしてみる.

# coding:utf-8
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from time import sleep

# ブラウザを開く。
driver = webdriver.Chrome()
# Googleの検索TOP画面を開く。
driver.get("https://www.google.co.jp/")
# 検索語として「selenium」と入力し、Enterキーを押す。
driver.find_element_by_id("lst-ib").send_keys("selenium")
driver.find_element_by_id("lst-ib").send_keys(Keys.ENTER)
# タイトルに「Selenium - Web Browser Automation」と一致するリンクをクリックする。
driver.find_element_by_link_text("Selenium - Web Browser Automation").click()
# 5秒間待機してみる。
sleep(5)
# ブラウザを終了する。
driver.close()

ブラウザの起動はするものの,検索ができていない.
そこで,実際に検索画面にいって,要素を調べてみる.
デベロッパーツールを使うと,ページの様々な要素が確認できます.
検索するところを確認すると以下のようになっている.
f:id:tkm-kyudo:20181220024624p:plain

今回はCSSセレクタを使用し,指定してみる.
検索部分のCSSセレクタは".gLFyf"となっていることがわかる.
改良したプログラムを以下に示す.

# coding:utf-8
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from time import sleep

# ブラウザを開く。
driver = webdriver.Chrome()
# Googleの検索TOP画面を開く。
driver.get("https://www.google.co.jp/")
sleep(3)
# 検索語として「selenium」と入力し、Enterキーを押す。
element = driver.find_element_by_css_selector(".gLFyf")
#検索語を入力
element.send_keys("CSSセレクタとは?")
#検索ボタンをエンター
element.send_keys(Keys.ENTER)

sleep(5)
# ブラウザを終了する。
driver.close()

実行してみると・・・
f:id:tkm-kyudo:20181220024917p:plain

無事検索が行われている.

おわりに

今回はMac上でPythonを使ってSeleniumを動かしてみた.
CSSセレクタをうまく指定すれば比較的簡単に操作できることがわかった.
無事Seleniumを動かせたので,スクレイピングにも使ってみようと思う.

Wikipediaのあるカテゴリーに属する記事のタイトルを取得する方法

はじめに

Wikipediaのdumpデータを用いて,あるカテゴリに含まれる記事のタイトルを取得します.

環境

CentOS7
Python3.6

事前準備

まず,word2vec-wikification-pyをインストールします.pipでできます.
Wikificationをしてみよう ~Wikipediaを利用した情報抽出 & 曖昧性解消まで ~ - Qiita

pip install word2vec-wikification-py

Mysqlwikiのdumpデータの用意は他を参照してください.
(他の人が用意してくれたのを使ったのでわかりません)

記事のタイトルを出力する

以下のプログラムを動かすことであるカテゴリに属する記事のタイトルを全て出力します.

from word2vec_wikification_py.initialize_mysql_connector import initialize_pymysql_connector
import pymysql.cursors

mysql_username = 'username'
mysql_hostname = 'hostname'
mysql_password = 'password'
mysql_db_name = 'db_name'


serch_words = ['政府']


print("serch_words:" + str(serch_words))
for word in serch_words:
    try:
        mysql_connector = initialize_pymysql_connector(hostname=mysql_hostname,
                                               user_name=mysql_username,
                                               password=mysql_password,
                                               dbname=mysql_db_name)
        with mysql_connector.cursor() as cursor:
            sql = "SELECT cl_to AS parent, page_title AS child FROM page JOIN categorylinks ON categorylinks.cl_from=page.page_id WHERE categorylinks.cl_type != 'subcat' AND categorylinks.cl_to ='" + word + "'"
            cursor.execute(sql)
            results = cursor.fetchall()
    finally:
        mysql_connector.close()

for page_title in results:
    print(page_title[1].decode('utf-8'))

以下の部分は自分で用意したsqlに応じて変えてください

mysql_username = 'username'
mysql_hostname = 'hostname'
mysql_password = 'password'
mysql_db_name = 'db_name'

今回は政府というカテゴリに含まれる記事を出力します.
以下が結果です.
f:id:tkm-kyudo:20181113140042p:plain

取得した結果が右のターミナルに出力されています.
wikiのページと見比べると大丈夫そうですね.
使用するdumpデータによって結果は多少変わると思います.

まとめ

wikipediaのdumpデータを使用することで,wikipediaのあるカテゴリに属する記事のタイトルを取得できました.
Mysqlに関して丸投げしたので,自分でもやってみようと思います.

ライブコーディング環境を導入してみた(TidalCycles)

はじめに

ゼミでライブコーディングの話が出てたので,とりあえずやってみよう精神で導入して見ました.

環境

MacOS Sierra
Python 3.6
homebrew

tidal-bootstrapの導入

とりあえず公式サイトに行ってみる.
https://tidalcycles.org/getting_started.html#running

公式サイトのMac OS,Tidal-bootstrap - automated install on a macのところにある
"You can download tidal-bootstrap here." をクリック.
移動したら,Download .zipをクリックしてzipファイルをダウンロードする.
ここで,homebrewが必要らしいので,入っていない場合は導入してください.

zipファイルを解凍すると次のようになっていると思うので,tidal-bootstrap.commandを起動.
f:id:tkm-kyudo:20180706131517p:plain

ここで一つ目のエラー.どうやらpython2系で動いている(時代遅れ)スクリプトなので,

#!/usr/bin/env python

となっているところを

#!/usr/bin/env python2.7

に変更する.

もう一度tidal-bootstrap.commandを起動する.以下のように表示されれば無事完了.

[Process completed]

SuperDirtのインストール

先ほど解凍したzipファイルの中にある,install-superdirt-quark.scdをダブルクリックすると,
SuperColliderが起動して以下のように表示されます。

// Place your cursor on the line below and press Shift-Enter
include("SuperDirt")

二行目をクリックしてカーソルを移動させ,Shift + Enterを押すとSuperDirtがインストールされる.
結構時間がかかるので気長に待ちましょう.コンソールに

  • > SuperDirt

と表示されれば完了なので,SuperColliderを再起動する.

SuperDirtを起動する

SuperColliderで新規ファイルを開いて、以下のコマンドを入力し,Shift + Enterを押す。

SuperDirt.start

コンソールのところに以下の表示が出ていれば無事完了.

SuperDirt: listening to Tidal on port 57120

TidalCycles Atom pluginのインストール

Atomがインストールされているはずなので,Atomを起動する.
起動したら,上部のタグからPackages->Setting View->Install Packages/Themesをクリック.
tidalと検索するとtidalcyclesが出てくるのでインストールする.
f:id:tkm-kyudo:20180706134120p:plain

やってみる

pluginのインストールが終わったら,Atomで新しいファイルを開き,sample.tidalとして保存する.

d1 $sound "bd cp"

と入力し,command+Enterを押すと,うまく行っていれば音がなる.

しかし,音がならない.

エラー処理

エラーが起きたので,ログを見ると,ghciがないとあったので
brewにてghcをインストールする.

brew install ghc

再度トライ

ghcのインストールが無事終わったので,SuperDirtを起動し直す.
先ほどのsample.tidalファイルを開き,同様にcommand+Enterを押す.
しかし,うまくいかず,Could not find module.sound.tidalというエラーが発生.

再度エラー処理

色々調べて見るとどうも,tidalの導入がうまく行っていないみたいなので
manual installでやってみる.
ターミナルで以下のコマンドを入力.

cabal install tidal

これでtidalがインストールされたので,
同様に,SuperDirtを起動し直し,Atomでcommand+Enterを押すと……

無事音がなった!

やってみて

導入するにあたって,日本語の記事が少ない上に,自動化だと上手くいかなかった.
エラーを調べるも,数が少ないので手探り感がとても強かった.

時間はかかったが,無事導入できたので,ライブコーディングで遊んでみようと思う.
ライブコーディング導入に躓いている人の役に立てば幸いです.