ブラウザを自動運転してデータ取得
目次
pythonでchromeを操作してWEBを自動巡回
吉川の前職は、通販会社の社内SEです。
通販会社という事は、当然ですが、いろいろなデータをWEBから取ってくる必要があります。
売上データや、商品のデータ、画像など、毎日取得してくるデータは多岐にわたります。
しかし、それを取得する動作は、人間がパソコンを操作して行うわけです。
もちろん、人間が目で見て判断し、要るか要らないかの取捨選択が必要なものもありますが、毎回同じ操作で取得してくるデータも決して少なくはありません。
同じ操作をして、同じようなデータをダウンロードして処理する。働き方改革が叫ばれるなか、無駄だとは思いませんか?
そこで、人間の操作のうち、毎日同じものを手順化してプログラムに自動実行させる手法を導入しました。
Webからブラウザを介してデータを拾ってくるこの手法は「スクレイピング」と言われ、同じような事はVB.NETや、VBAでも可能ですが、今回はpythonでご紹介します。
Pythonの開発環境
pythonはプログラム言語です。
AI、人工知能を組むのに有名なソフトですが、実はMicrosoftが長年、言語として放置されているOfficeのVBAに代わって、pythonを取り入れるという噂があったことと、理解しやすく、機能が多いとのお話を聞き、勉強してみました。
興味があって、幾つか書籍や講座はみたものの、実際のAI方面にはまだ進んでおらず、吉川の認識では、Pythonは非常に優秀な各種自動化言語というところです。
Windows10にPythonをインストール
まずはPythonをインストールします。
Pythonを配布しているWebサイトに行き、Downloadタブからファイルを取得します。
ボタンにカーソルを合わせると、ファイル名がでます。
これは、OSやブラウザから判定しているようで、LinuxのX Windowのブラウザでは、Linux用の名前がでました。
今回はWindows10なので、そのまま進行します。ダウンロードしたファイルを実行すればOKです。
Install Nowをクリックします。
インストールが成功しました。
WindowsメニューにPythonができており、コマンドラインからPythonを実行する事ができます。
統合開発環境pycharmのインストール
私の場合は、Pythonの開発は、pycharm で行っています。
まずはこれをインストールします。
PyCharmのサイトに行き、インストーラーをダウンロードします。
Communityを選択すると、ファイルがダウンロードされます。
ダウンロードされたファイルを実行すると、インストールが開始されます。
基本的にインストールはNEXTで進むだけで、特に何か指定はしていません。
seleniumについて
seleniumは、本来は作成したWEBアプリのテスト用に作成された、ブラウザを制御するフレームワークです。
WEBアプリは、WEB上にプログラムがあり、ユーザーが何かを入力すると結果がでます。
しかし、ユーザーが絶対に正しいデータを入れてくれるとは限りません。
ブラウザも Windows10標準のEdgeを使ってくるのか、それともFirefoxや、Google Chromeなのか、それも判りません。
わざと数字の入力欄に文字を入れてみたり、文字の入力枠にHTMLタグや、SQLを入れてみたり、 途中でボタンを押してみたりと、正常動作を保証するためには、大量の入力テストが、それも複数のブラウザで必要です。
それを人間がやるのは大変なので、ブラウザをプログラムで制御して、テスト手順を再現して、正常に動くかどうかのテストを行うツールとして、seleniumは誕生しました。
Firefoxや、Google Chrome、Edgeなどの対応ブラウザも豊富で、自動化も簡単です。
このため、テストではなく、所定手順のブラウザ操作を再現してくれるツールとしても使用されています。
利点としては、データを取りに行くサイトの中には、ブラウザを判定しているものがあり、pythonの内部処理で、不正なブラウザとして弾かれてしまう事がありますが、それを回避できます。
相手も、疲れを知らないプログラムに内部のデータを次々請求されては、サーバーに負荷でしょうから、本来人間が操作するブラウザを、人間が操作するくらいの処理頻度で操作して、自動化すれば、相手のサーバーの負担にもならないので、良いのではないでしょうか?
seleniumのインストール
それでは、Python環境にseleniumをインストールします。
Pythonの場合、こうしたツールの導入は、pipを介して行う事が多いです。
pip を使用する場合は、まず環境変数を確認します。
インストールにより、Python.exe や pip.exeがある場所にPathを通します。
今回の場合は、C:\Users\kazuhiro\AppData\Local\Programs\Python\Python39でしたので、そちらに通しました。
PATHを通し、再起動したら、コマンドプロンプトからpipでインストールします。
> pip install selenium
> pip install chromedriver-binary
これで、seleniumと、Google Chromeのドライバをインストールできました。
自動運転のテストコード
seleniumや、ドライバーがインストールできたら、pycharmにコードを書きます。
まず、PyCharmのメニューのFileから、New Projectを選択して、新規プロジェクトを作成します
Project名として、selenium01を与えました。Createボタンで作成します。
main.pyが自動作成されました。ここに記載していきますが、その前にPyCharmに selenium とchromedriver_binaryを読み込みます。
FileからSettingを選び、設定画面を呼び出します。
作成したProject名にあるPython interpreterをクリックし、画面の+ボタンを押します。
検索窓にseleniumと打ち込むと、候補が出ますので、seleniumを選択し、Install PackageをクリックしてInstallします。
同様に、chromedriver_binaryをInstall Packageでインストールします。
selenium と chromedriver_binary をプロジェクトに読み込んだら、main.py を変更します。
#!/usr/bin/env python
# -*- coding: utf8 -*-
import time
from selenium import webdriver
import chromedriver_binary
driver = webdriver.Chrome()
def main():
driver.get("https://www.yahoo.co.jp/")90.
time.sleep(10)
driver.close()
if __name__ == '__main__':
main()
※別の書き方
import time
from selenium import webdriver
driver = webdriver.Chrome()
driver.get
driver.get("https://www.yahoo.co.jp/")
time.sleep(10)
実際には、下のようにただ羅列で書いても動きますが、あちこちをサンプルにしているうち、このようにdef mainに記述を書いて呼び出すようにしています。
このコードを実行すると、Google Chromeが自動で立ち上がり、自動的にYahooに移動して、10秒経つとブラウザが閉じます。
これだけではつまらないので、プログラムを一部書き換えます。
#!/usr/bin/env python
# -*- coding: utf8 -*-
import time
from selenium import webdriver
import chromedriver_binary
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome()
def main():
driver.get("https://www.yahoo.co.jp/")
time.sleep(3)
driver.find_element_by_name('p').send_keys('吉川万能IT研究所')
time.sleep(2)
driver.find_element_by_name('p').send_keys(Keys.RETURN)
time.sleep(5)
if __name__ == '__main__':
main()
これにより、ブラウザが開いて3秒後、エレメントでnameが”p”という項目を探し、「吉川万能IT研究所」を入力し、2秒後にエンターキーを入力する。
という一連の流れがプログラムに記述されました。
このように、自動で実行されます。
ちなみに、 エレメントでnameが”p”などは、Google Chrome でそのページを開き、F12を押すと調べる事ができます。
Yahooの画面でF12を押すと、右にページの分析画面が現れます。
ここでは図のように、Yahooの検索ワード入力枠を触ってみると、それがhtmのどこかという事を教えてくれます。
htmlでは、nameやidでタグの識別がされている事が多いので、その項目にこの文字列を入力しろ とか、ボタンをクリックしろ などを組み込むと、概ね人間が行う操作を再現できます。
どうしても人間の感性で取捨選択の必要がある場合は別ですが、毎日同じページに行き、同じ操作をして、データのダウンロードボタンを押すのであれば、このように操作を自動化してしまう事も可能です。
実際のボタン操作などのプログラムは、その環境に合わせます。
前職の会社のを掲載してしまうと、どのモールでどんな操作をしているか露見させてしまうので、一般的なヤフーのページを操作するものを例としました。
もし、WEBを操作している内容が毎日同じであるなら、例えば出勤の数時間前に時間起動するようパソコンを設定し、スケジューラーでpythonのスクリプトを稼働させれば、朝出勤したら必要なWEB作業が完了している という事も可能です。
エラーが出る場合
ここではGoogle Chromeを使用していますが、Chromeのバージョンと、chromedriver_binaryが合っていないとブラウザが起動しない事があります。
設定からChromeについてを選ぶと、現在のChromeのバージョンが判ります。
この場合90.0.4430.212になります。
chromedriverのページで、合致するバージョンを調べます。
先頭のナンバーは合致している必要があるので、この場合は
である必要があります。
pip install chromedriver-binary==90.0.4430.24.0
この場合、とバージョンを指定すると、現在のChromeに合致したchromedriverをインストールできます。
PyCharmで読み込む場合も、右下でバージョンが指定できます。
seleniumで取得出来ないページと、欠点
さて、ここまでは利点でしたが、seleniumには欠点もあります。
まず、自動巡回出来ないWEBページが存在します。
AdobeのFLASHを使用したページは、seleniumでは取得できません。
ページがHTMLではなく、FLASHで書かれているため、seleniumの「HTMLのここを操作して~」が通用しないためです。
ただ、 動画やゲームも作成が可能な事で、一時はかなり広まったFLASHは、既に各ブラウザのサポートが打ち切られています。
今後、FLASH対応のサイトが増える事は無いので、新しいサイトを巡回する場合には気にしなくても大丈夫ですが、古いサイトの巡回では注意が必要です。
もう一つの欠点は、パソコンが操作できない事です。
seleniumが動作中は、ブラウザが取得したHTMLを解析して、スクリプトに組まれた処理を実行しているため、人間が例えばEXCELなどを動かしてしまうと、動作が不安定になります。
seleniumで自動運転中は、人あらゆるは操作してはいけません。
この事例ですが、通販会社の社内SE時代、一度動き出すと、16時間以上動きっぱなしの、ジャンルランキング解析スクリプトを組んだ事があります。
理由は、ネットモールがブラウザを判定しているため、pythonの内部ブラウザが使えず、seleniumで、このときはFirefoxを操作して、ネットモールの数千に及ぶランキングページを巡回し、次々とジャンルを渡りながら、ただひたすらに順位、商品名、価格、サイト情報を回収していくというものです。
人間が操作しているのに近いため、時間がかかり、一度動作開始すると、誰も何も操作しないのに、16時間以上ページが切り替わり続けるという、なかなかシュールなものでした。
このため、自動操作が数分で終わるものならともかく、大量の自動処理が必要な場合は、python+seleniumの動作専用機があった方が良いでしょう。
最後に、その会社の社風をよく調べて導入を図る必要があります。
理解の無い管理職は、忙しそうに操作をしていない人間を「サボっている」と判断する場合があります。
現に私もそれで衝突しました。
午前中くらいはかかるはずなのに、出社した時には終わっているなんて「ズルい」という謎理論を管理職から聞いた時は、目眩がしたものです。
効率化を図るときは、特に管理職の動向にはご注意ください。
Anacondaで行う場合。
ところで、Pythonは「パイソン」と呼び、意味としては大蛇を指します。
特定の蛇の種類ではなく、大きな蛇という意味ですね。
一方、実在する大蛇としては、ニシキヘビやアナコンダ(Anaconda)がいます。
Python開発の関係者が蛇好きだったかは知りませんが、Pythonのインストール方法に「Anaconda」を使用するものがあります。
Anacondaは、様々な学術計算や、データ処理機能など、様々な便利機能を追加した、Pythonのディストリビューションです。
実は、Python を勉強しようとし始めた頃、Python とAnacondaを混同して両方をインストールし、環境変数を混ぜてしまい、大変な目にあったことがあります。
Windows10にAnacondaをインストール
まずはAnacondaをインストールします。
Anacondaを配布しているWebサイトに行き、ProductsからIndividual Editionを選択します。
ページを下にスクロールすると、ファイルをダウンロードするリンクが設置されています。
Anacondaの場合は、ボタンに判断などが組み込まれていないので、自分で判断します。
Windows10なので、64-Bit Graphical Installerを選択します。
ダウンロードしたファイルを実行すると、インストールできます。
基本的にデフォルトの通りでOKです
ここだけはAll Userにします。
インストールが完了すると、AnacondaのインストーラーでそのままPyCharmのインストールが可能ですが、professionalのみのようなので、そのままNEXTで飛ばします。
完了すると、メニューからAnacondaのコマンドプロンプトを表示できるようになり、そこでpythonを実行する事ができるようになります。
統合開発環境pycharmのインストール
Pythonの時と同様、PyCharmのインストールを行います。
seleniumのインストール
まずpythonの時と同様、環境変数を追加します。
インストーラーでデフォルト表示されていた場所が実行ファイルの場所なので、C:\ProgramData\Anaconda3
C:\ProgramData\Anaconda3\Scripts
に通しました。
PATHを通し、再起動したら、コマンドプロンプトからseleniumをインストールします。
Python の場合は、pipでインストールしますが、Anacondaの場合はcondaです。それ以外に違う点はありません。
(base) c:\Anaconda3>conda install selenium
Solving environment: done
## Package Plan ##
environment location: C:\Anaconda3
added / updated specs:
- selenium
The following packages will be downloaded:
package | build
---------------------------|-----------------
selenium-3.141.0 | py37he774522_0 865 KB
conda-4.6.2 | py37_0 1.7 MB
------------------------------------------------------------
Total: 2.5 MB
The following NEW packages will be INSTALLED:
selenium: 3.141.0-py37he774522_0
The following packages will be UPDATED:
conda: 4.5.12-py37_0 --> 4.6.2-py37_0
Proceed ([y]/n)? y
Downloading and Extracting Packages
selenium-3.141.0 | 865 KB | ############################################################################ | 100%
conda-4.6.2 | 1.7 MB | ############################################################################ | 100%
Preparing transaction: done
Verifying transaction: done
Executing transaction: done
(base) c:\Anaconda3>
また、ブラウザを動かすためのドライバが必要なので、これもインストールします。
今回は、google Chromeでスクレイピングします。
(base) c:\Anaconda3>conda install chromedriver-binary
Collecting package metadata: done
Solving environment: done
## Package Plan ##
environment location: C:\Anaconda3
added / updated specs:
- chromedriver-binary
The following packages will be downloaded:
package | build
---------------------------|-----------------
chromedriver-binary-2.38 | 0 3.0 MB
------------------------------------------------------------
Total: 3.0 MB
The following NEW packages will be INSTALLED:
chromedriver-bina~ pkgs/main/win-64::chromedriver-binary-2.38-0
Proceed ([y]/n)? y
Downloading and Extracting Packages
chromedriver-binary- | 3.0 MB | ############################################################################ | 100%
Preparing transaction: done
Verifying transaction: done
Executing transaction: done
PyCharmにプロジェクトの作成
あとは、Python のときと同じく、PyCharmにプロジェクトを作成します。
変更点としては、New environment usingをcondaにします。
環境変数は通っているはずなので、インストールした先が表示されているはずです。
その他、PyCharmに selenium とchromedriver_binaryを読み込みます。
コードを記述すれば、Chromeで自動巡回するプログラムをAnacondaで実行する事ができます。
動作しない場合
Anacondaは最新のものを取ってきていますが、seleniuとchromedriverがうまくcondaで入らない事があります。
ディストリビューションの違いにより、最新のAnacondaへの対応が出来ていない場合があるようです。
そうした場合、一つ、もしくは二つ、古いバージョンのAnacondaをダウンロードしてインストールすると、うまくいくようです。