見出し画像

1年くらい前に作ったPython スクリプトを使って WebScraping をしたら動かなかった。この記事は、動くようになるまでの備忘録。

タイトル画像はパイソンではないが、適当な蛇の画像を貼り付けた。

Pythonを使ってネットからデータを取り込もうとした。久しぶりに。1年ぶりくらいじゃないかと思う。
環境が新しくなってから初めての WebScraping らしく、スクリプトは動かなかった。

どうも、環境から整えないとダメっぽい。

まず、肝心要かんじんかなめの Selenium が入っていなかった。
そこで Selenium を入れようとした。

pip install selenium

pip がないと言う。ああ、pip もないのか。

pip 入った。サンキュー Qiita の人!
selenium を入れる。

pip install selenium

入らない?

あれ?入ってた?

PyCharm 環境で、インストールしたら動いた、のかな?
何がよかったのかわからないが、使えるようになった。

しかし今度は、Mac が ChromeDriver を疑っている。

システム環境設定>セキュリティとプライバシー>一般

ダウンロードしたアプリケーションの実行許可:

このまま許可 をクリック

スクリプトを実行したら、開いても良いか聞いてきたので、許可。

実行。
何かエラーが出ている。

table = driver.find_element_by_id('id の名称')

これがダメらしい。
前はこれでできていたのに、なんでダメになった?

driver には、find_element_by_id というアトリビュートはないと言われた。

ネットでヒントを得て、

driver.find_element('ID', 'idを示す文字列')

に変更。。

自分が書いたスクリプトには、find_elements_by_tag_name というのもあったので、こちらも修正。

.find_elements('TAG_NAME', 'tag を示す文字列')

とした。

このやり方も違うのか。

じゃあ次は、これだ。

driver.find_element(By.ID, 'idを示す文字列')

という形を試す。

driver.find_element(By.ID, …..)

引数として By.ID を使う場合は、By が必要だ。By をインポートする。

次の行を追加。

from selenium.webdriver.common.by import By

やった。
無事にネット上のデータを csv ファイルに落とすことができた。

自分にはプログラミングの素養がないのだろう。悲しい。

Python の話は以上。

LibreOffice Calc に取り込む

さて、次は、LibreOffice にデータを取り込む。ゲットしたデータをグラフにするためだ。
LibreOffice Calc Basic で csv を取り込む。

やったことがあるはずだが、すっかり忘れている。
少しの試行錯誤の後、LibreOffice Calc を使って csv ファイルを開いて、開いた書類のシートを大元のマクロシートにコピーする方向で進めることにした。

しかしまだまだ問題があった。

ワークシートから表データを読み込んだり、ワークシートに表データを書き込んだりするのには、配列を使うと処理が速いということなので、今回も配列を使おうとした。がしかし、、、、、

ちょっとここで予備知識的なものを書いておく。
LibreOffice Calc の場合、ワークシートとやりとりできる配列は、行の1次元配列に列データの1次元配列が収められた形、つまり入子になっているのである。2次元配列ではないのである。1行1行が列データの集合としての配列であり、それが各行のデータとして、配列に収納されているのである。そして、配列とワークシート上のレンジとで、形を合わせないとうまくコピーできないのである。

さて、何を言っているわからないところで、

命令は
・配列=レンジ.getDataArray
・レンジ.setDataArray(配列)
という形だ。

しかし、思ったようにならず、あれこれ悩んだ末に、1行読み込んでは配列に追加していた。が、読み込むたびに先に読み込んだデータが勝手に書き換えらてしまうという不可解な現象に悩まされることとなった。

しばらくして、記憶が蘇ってきた。うっすらと。

配列が参照渡しになるのが原因だった。

解決策は、前に自分が note に書いていたのだった。

そもそも、setDataArray でもハマっていたのだった。
セットする配列のデータは全て文字列でなければならないのだった。それを忘れて、時刻と数字でやろうとしていた。

なぜそんな制約があるのだろうか。理解に苦しむ。

文字列しか使えないから、結局、どこかで変換しなければならない。

ワークシートに貼り付けてからデータの形式を変えなければならないようでは、配列を使う意味がない。
ということで、配列からデータを1個1個セルに書き込むことにした。

グラフを作る場合は、時刻のデータは厳密に時刻の形式でなければならないし、数値についても文字列を勝手に数値と見做してくれるようなことは、なさそうだった。
だから、形式をきちんとする必要があった。あれこれやった後によくみたら、前に作ったマクロがあって、それを実行したらうまく行った。

あれをやったらエラー、これをやってもエラー。なんで、すんなり行かないのだろうか。

t.koba


この記事が気に入ったらサポートをしてみませんか?