ブラウザを自動運転してデータ取得

pythonでchromeを操作してWEBを自動巡回

吉川の前職は、通販会社の社内SEです。
通販会社という事は、当然ですが、いろいろなデータをWEBから取ってくる必要があります。
売上データや、商品のデータ、画像など、毎日取得してくるデータは多岐にわたります。

しかし、それを取得する動作は、人間がパソコンを操作して行うわけです。
もちろん、人間が目で見て判断し、要るか要らないかの取捨選択が必要なものもありますが、毎回同じ操作で取得してくるデータも決して少なくはありません。
同じ操作をして、同じようなデータをダウンロードして処理する。働き方改革が叫ばれるなか、無駄だとは思いませんか?

そこで、人間の操作のうち、毎日同じものを手順化してプログラムに自動実行させる手法を導入しました。
Webからブラウザを介してデータを拾ってくるこの手法は「スクレイピング」と言われ、同じような事はVB.NETや、VBAでも可能ですが、今回はpythonでご紹介します。

Pythonの開発環境

pythonはプログラム言語です。

AI、人工知能を組むのに有名なソフトですが、実はMicrosoftが長年、言語として放置されているOfficeのVBAに代わって、pythonを取り入れるという噂があったことと、理解しやすく、機能が多いとのお話を聞き、勉強してみました。

興味があって、幾つか書籍や講座はみたものの、実際のAI方面にはまだ進んでおらず、吉川の認識では、Pythonは非常に優秀な各種自動化言語というところです。

私の場合は、Pythonの開発は、pycharm で行っています。
こちらが画面ですが、テスト用のHelloWorldを表示するコードを上に書き、実行すると、下にその表示が出ています。

また、Pythonは、anacondaのインストールにより、実行環境を得ています。
これは本来は、人工知能の講座の受講環境なのですが、インストールしたところで止まってしまい、別の書籍で自動化が便利そうだったので、そちらに移行したためです。
将来的には、人工知能の講座を再開したいところです。

seleniumについて

seleniumは、本来は作成したWEBアプリのテスト用に作成された、ブラウザを制御するフレームワークです。

WEBアプリは、WEB上にプログラムがあり、ユーザーが何かを入力すると結果がでます。
しかし、ユーザーが絶対に正しいデータを入れてくれるとは限りません。
ブラウザも Windows10標準のEdgeを使ってくるのか、それともFirefoxや、Google Chromeなのか、それも判りません。

わざと数字の入力欄に文字を入れてみたり、文字の入力枠にHTMLタグや、SQLを入れてみたり、 途中でボタンを押してみたりと、正常動作を保証するためには、大量の入力テストが、それも複数のブラウザで必要です。

それを人間がやるのは大変なので、ブラウザをプログラムで制御して、テスト手順を再現して、正常に動くかどうかのテストを行うツールとして、seleniumは誕生しました。

Firefoxや、Google Chrome、Edgeなどの対応ブラウザも豊富で、自動化も簡単です。

このため、テストではなく、所定手順のブラウザ操作を再現してくれるツールとしても使用されています。

利点としては、データを取りに行くサイトの中には、ブラウザを判定しているものがあり、pythonの内部処理で、不正なブラウザとして弾かれてしまう事がありますが、それを回避できます。

相手も、疲れを知らないプログラムに内部のデータを次々請求されては、サーバーに負荷でしょうから、本来人間が操作するブラウザを、人間が操作するくらいの処理頻度で操作して、自動化すれば、相手のサーバーの負担にもならないので、良いのではないでしょうか?

seleniumのインストール

それでは、Python環境にseleniumをインストールします。

Pythonの場合、こうしたツールの導入は、pipを介して行う事が多いです。

pip install selenium

ただ、私の場合は、Windows10 の anacondaを使用しているため、少々異なります。

スタートメニューからAnaconda Promptを、管理者として実行します。

(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>

conda install selenium にて、seleniumをインストールします。
また、ブラウザを動かすためのドライバが必要なので、これもインストールします。
今回は、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

自動運転のテストコード

seleniumや、ドライバーがインストールできたら、pycharmにコードを書きます。

#!/usr/bin/env python
# -*- coding: utf8 -*-

import time
from selenium import webdriver
driver = webdriver.Chrome()

def main():
    driver.get("https://www.yahoo.co.jp/")
    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秒経つとブラウザが閉じます。

これだけではつまらないので、mainの部分を次のように変更します。

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_id('srchbtn').click()
    time.sleep(5)

これにより、ブラウザが開いて3秒後、エレメントでnameが”p”という項目を探し、「吉川万能IT研究所」を入力し、次に、エレメントのidが ‘srchbtn’を探してクリックせよ

という一連の流れがプログラムに記述されました。

このように、自動で実行されます。

ちなみに、 エレメントでnameが”p”や、エレメントのidが ‘srchbtn’は、Google Chrome でそのページを開き、F12を押すと調べる事ができます。

Yahooの画面でF12を押すと、右にページの分析画面が現れます。

ここでは図のように、Yahooの検索ワード入力枠を触ってみると、それがhtmのどこかという事を教えてくれます。

htmlでは、nameやidでタグの識別がされている事が多いので、その項目にこの文字列を入力しろ とか、ボタンをクリックしろ などを組み込むと、概ね人間が行う操作を再現できます。

どうしても人間の感性で取捨選択の必要がある場合は別ですが、毎日同じページに行き、同じ操作をして、データのダウンロードボタンを押すのであれば、このように操作を自動化してしまう事も可能です。

実際のボタン操作などのプログラムは、その環境に合わせます。
前職の会社のを掲載してしまうと、どのモールでどんな操作をしているか露見させてしまうので、一般的なヤフーのページを操作するものを例としました。

もし、WEBを操作している内容が毎日同じであるなら、例えば出勤の数時間前に時間起動するようパソコンを設定し、スケジューラーでpythonのスクリプトを稼働させれば、朝出勤したら必要なWEB作業が完了している という事も可能です。

御社のお役にたてると思いますが、いかがでしょうか?

seleniumで取得出来ないページと、欠点

さて、ここまでは利点でしたが、seleniumには欠点もあります。

まず、自動巡回出来ないWEBページが存在します。

AdobeのFLASHを使用したページは、seleniumでは取得できません。
ページがHTMLではなく、FLASHで書かれているため、seleniumの「HTMLのここを操作して~」が通用しないためです。

ただ、 動画やゲームも作成が可能な事で、一時はかなり広まったFLASHは、既に各ブラウザのサポートが打ち切られています。
今後、FLASH対応のサイトが増える事は無いので、新しいサイトを巡回する場合には気にしなくても大丈夫ですが、古いサイトの巡回では注意が必要です。

もう一つの欠点は、パソコンが操作できない事です。

seleniumが動作中は、ブラウザが取得したHTMLを解析して、スクリプトに組まれた処理を実行しているため、人間が例えばEXCELなどを動かしてしまうと、動作が不安定になります。

seleniumで自動運転中は、人あらゆるは操作してはいけません。

この事例ですが、通販会社の社内SE時代、一度動き出すと、16時間以上動きっぱなしの、ジャンルランキング解析スクリプトを組んだ事があります。

理由は、ネットモールがブラウザを判定しているため、pythonの内部ブラウザが使えず、seleniumで、このときはFirefoxを操作して、ネットモールの数千に及ぶランキングページを巡回し、次々とジャンルを渡りながら、ただひたすらに順位、商品名、価格、サイト情報を回収していくというものです。

人間が操作しているのに近いため、時間がかかり、一度動作開始すると、誰も何も操作しないのに、16時間以上ページが切り替わり続けるという、なかなかシュールなものでした。

このため、自動操作が数分で終わるものならともかく、大量の自動処理が必要な場合は、python+seleniumの動作専用機があった方が良いでしょう。

最後に、その会社の社風をよく調べて導入を図る必要があります。

理解の無い管理職は、忙しそうに操作をしていない人間を「サボっている」と判断する場合があります。

現に私もそれで衝突しました。
午前中くらいはかかるはずなのに、出社した時には終わっているなんて「ズルい」という謎理論を管理職から聞いた時は、目眩がしたものです。

効率化を図るときは、特に管理職の動向にはご注意ください。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です