【Python】Python 3.6 & Selenium WebDriver & headless でスクレイピング【Part.1】

Python 3.6Selenium WebDriver(Selenium)headless でスクレイピングをしてみます。

※人により「Selenium」と呼んだり「Selenium WebDriver」と呼んだり「WebDriver」と呼んだりします。本ページでは「Selenium」もしくは「Selenium WebDriver」と呼びます。

 

以前、「【Python3.6】BeautifulSoupのインストール&実行手順」を解説しました。

 

今回は BeautifulSoup を使わずに Selenium WebDriver & headless を使って Web サイトをスクレイピングしてみます。

 

 

【Python】Python 3.6 & Selenium WebDriver & headless でスクレイピング【Part.1】

 

【Python】Python 3.6 & Selenium WebDriver & headless でスクレイピング【Part.2】

 

【Python】Python 3.6 & Selenium WebDriver & headless でスクレイピング【Part.3】

 

【Python】Python 3.6 & Selenium WebDriver & PhantomJS でスクレイピング(find系操作)【Part.4】

 

【Python】Python 3.6 & Selenium WebDriver & PhantomJS でスクレイピング(URLを引数で受け取る)【Part.5】

 

 

 

 

仮想環境でスクレイピング環境を構築する

CentOS 上でスクレイピングをするプログラムを作成します。

Python は 3.6 を使いたいのですが、CentOS の場合は yum で Python 2.7.5 を利用しているため、OS のデフォルト Python を 3.6 にアップグレードすると yum コマンドでエラーになります。

そのため、OS のデフォルト環境はヘタにいじらずに、仮想環境上で Python 3.6 & Selenium & headless でのスクレイピングプログラムを作ります。

 

 

Python 仮想環境作成手順

以前、Django で Web アプリを作成した際に仮想環境を作成しました。

 

【さくらVPS】【Python】Django で Web アプリを作る(Webアプリ構築編)【Part.5】

 

今回も、上記記事で作成した仮想環境を利用します。

 

仮想環境に切り替えます。(仮想環境の有効化)

[test@SAKURA_VPS pyenv]$ source pyenv/bin/activate
(pyenv) [test@SAKURA_VPS pyenv]$ ← 仮想環境になりました。

 

仮想環境を終了します。

(pyenv) [test@SAKURA_VPS pyenv]$ deactivate
[test@SAKURA_VPS pyenv]$

 

 

Selenium WebDriverとは?

Selenium WebDriver(単に Selenium と呼ばれます)は Web サイトのテストのために開発された Web スクレイピングツールです。

 

Selenium WebDriver

http://www.seleniumhq.org/

 

特徴はブラウザに表示される通りの Web サイトの情報を取得できるところです。

Selenium は、ブラウザが Web サイトをロードし、Web サイトのデータを取得したり、画面のスナップショットを取得したり、フォームに「アカウント」と「パスワード」を入力してログインしたりと、人間ができる操作はほぼ可能なツールです。

 

Selenium には独自のブラウザがなくて、Firefox や Google Chrome と統合して利用します。

IEもありますがうまく動きませんでした。

 

Selenium を使用すると、コンソール上で Selenium がブラウザを操作をするところが実際に見えますが、その代り処理が遅くなります。

通常は PhantomJS や最近では Headless でブラウザを表示させずにプログラム内だけで(メモリ上で)処理を完結させます。

その結果、高速で Web スクレイピングが可能になります。

 

 

Selenium で JavaScript を実行する

Selenium と Headless を組み合わせることで、画面に表示させずにプログラム上だけで高速に「JavaScript」「クッキー」その他どんなページでも扱える強力な Web スクレイピングが実行できます。

 

Selenium はもともと「Selenium 1」として JavaScript ベースで開発されていたので、JavaScript を扱うことは得意です。

Linuxに詳しい方なら「curl」コマンドや「wget」コマンドを利用して Web サイトから情報を取得することもあるかもしれませんが、さすがに JavaScript で作成された Web サイトの情報を正確に取得することはできません。

 

 

Selenium は多数の言語をサポートしている

Selenium は多数の言語をサポートしています。

など様々な言語で Selenium を利用することができます。

 

 

Selenium WebDriver のインストール

実際に Python 3.6 環境に最新の Selenium WebDriver をインストールしてみます。

Selenium WebDriver のライブラリは以下のページよりダウンロードできます。

 

http://www.seleniumhq.org/download/

 

 

 

Selenium のライブラリ一式を見ると下図のように常に更新されているようなので大変うれしいです。

便利なツールほど更新されずに放置状態(逆に言うと完成度が高くてアップデートする必要もないということかもしれませんが・・・)にされていることが多いイメージなので、このアップグレードの頻度の多さはしっかりとサポートされているとみていいです。

 

Python 用 Selenium WebDriver のインストール

わざわざ http://www.seleniumhq.org/download/ にアクセスをしてダウンロードをしなくても pip コマンドで Selenium WebDriver をインストールすることが可能です。

(pyenv) [test@SAKURA_VPS ~]$ pip3.6 install selenium
Collecting selenium
  Downloading selenium-3.7.0-py2.py3-none-any.whl (935kB)
    100% |????????????????????????????????| 942kB 1.0MB/s
Installing collected packages: selenium
Successfully installed selenium-3.7.0 ← 最新の Selenium WebDriver がインストールされています。
(pyenv) [test@SAKURA_VPS ~]$

 

 

PhantomJSのインストール

CentOSの場合は「npm」コマンドでインストールできます。

以下、PhantomJS をインストールしましたが、一見すると失敗している?

分かりづらいログです。

[root@SAKURA_VPS nichan]# npm -g install phantomjs
npm WARN deprecated phantomjs@2.1.7: Package renamed to phantomjs-prebuilt. Please update 'phantomjs' package references to 'phantomjs-prebuilt'
npm WARN deprecated node-uuid@1.4.8: Use uuid module instead
npm WARN deprecated tough-cookie@2.2.2: ReDoS vulnerability parsing Set-Cookie https://nodesecurity.io/advisories/130
/usr/bin/phantomjs -> /usr/lib/node_modules/phantomjs/bin/phantomjs

> phantomjs@2.1.7 install /usr/lib/node_modules/phantomjs
> node install.js

Considering PhantomJS found at /usr/bin/phantomjs
Looks like an `npm install -g`
Error checking path, continuing { Error: Cannot find module '/usr/lib/node_modules/phantomjs/lib/location'
    at Function.Module._resolveFilename (module.js:469:15)
    at Function.Module._load (module.js:417:25)
    at Module.require (module.js:497:17)
    at require (internal/module.js:20:19)
    at getLocationInLibModuleIfMatching (/usr/lib/node_modules/phantomjs/install.js:332:19)
    at Promise._successFn (/usr/lib/node_modules/phantomjs/install.js:389:28)
    at nextTickCallback (/usr/lib/node_modules/phantomjs/node_modules/kew/kew.js:47:28)
    at _combinedTickCallback (internal/process/next_tick.js:73:7)
    at process._tickCallback (internal/process/next_tick.js:104:9) code: 'MODULE_NOT_FOUND' }
Downloading https://github.com/Medium/phantomjs/releases/download/v2.1.1//phantomjs-2.1.1-linux-x86_64.tar.bz2
Saving to /usr/lib/node_modules/phantomjs/phantomjs/phantomjs-2.1.1-linux-x86_64.tar.bz2
Receiving...
  [======================================--] 94%
Received 22866K total.
Extracting tar contents (via spawned process)
Removing /usr/lib/node_modules/phantomjs/lib/phantom
Copying extracted folder /usr/lib/node_modules/phantomjs/phantomjs/phantomjs-2.1.1-linux-x86_64.tar.bz2-extract-1511189541076/phantomjs-2.1.1-linux-x86_64 -> /usr/lib/node_modules/phantomjs/lib/phantom
Writing location.js file
Done. Phantomjs binary available at /usr/lib/node_modules/phantomjs/lib/phantom/bin/phantomjs
/usr/lib
mqw phantomjs@2.1.7
  tqw extract-zip@1.5.0
  x tqw concat-stream@1.5.0
  x x tqq inherits@2.0.3
  x x tqw readable-stream@2.0.6
  x x x tqq core-util-is@1.0.2
  x x x tqq isarray@1.0.0
  x x x tqq process-nextick-args@1.0.7
  x x x tqq string_decoder@0.10.31
  x x x mqq util-deprecate@1.0.2
  x x mqq typedarray@0.0.6
  x tqq debug@0.7.4
  x tqw mkdirp@0.5.0
  x x mqq minimist@0.0.8
  x mqw yauzl@2.4.1
  x   mqw fd-slicer@1.0.1
  x     mqq pend@1.2.0
  tqw fs-extra@0.26.7
  x tqq graceful-fs@4.1.11
  x tqq jsonfile@2.4.0
  x tqq klaw@1.3.1
  x tqq path-is-absolute@1.0.1
  x mqw rimraf@2.6.2
  x   mqw glob@7.1.2
  x     tqq fs.realpath@1.0.0
  x     tqw inflight@1.0.6
  x     x mqq wrappy@1.0.2
  x     tqw minimatch@3.0.4
  x     x mqw brace-expansion@1.1.8
  x     x   tqq balanced-match@1.0.0
  x     x   mqq concat-map@0.0.1
  x     mqq once@1.4.0
  tqw hasha@2.2.0
  x tqq is-stream@1.1.0
  x mqw pinkie-promise@2.0.1
  x   mqq pinkie@2.0.4
  tqq kew@0.7.0
  tqq progress@1.1.8
  tqw request@2.67.0
  x tqq aws-sign2@0.6.0
  x tqq bl@1.0.3
  x tqq caseless@0.11.0
  x tqw combined-stream@1.0.5
  x x mqq delayed-stream@1.0.0
  x tqq extend@3.0.1
  x tqq forever-agent@0.6.1
  x tqw form-data@1.0.1
  x x mqw async@2.6.0
  x x   mqq lodash@4.17.4
  x tqw har-validator@2.0.6
  x x tqw chalk@1.1.3
  x x x tqq ansi-styles@2.2.1
  x x x tqq escape-string-regexp@1.0.5
  x x x tqw has-ansi@2.0.0
  x x x x mqq ansi-regex@2.1.1
  x x x tqq strip-ansi@3.0.1
  x x x mqq supports-color@2.0.0
  x x tqq commander@2.11.0
  x x mqw is-my-json-valid@2.16.1
  x x   tqq generate-function@2.0.0
  x x   tqw generate-object-property@1.2.0
  x x   x mqq is-property@1.0.2
  x x   tqq jsonpointer@4.0.1
  x x   mqq xtend@4.0.1
  x tqw hawk@3.1.3
  x x tqq boom@2.10.1
  x x tqq cryptiles@2.0.5
  x x tqq hoek@2.16.3
  x x mqq sntp@1.0.9
  x tqw http-signature@1.1.1
  x x tqq assert-plus@0.2.0
  x x tqw jsprim@1.4.1
  x x x tqq assert-plus@1.0.0
  x x x tqq extsprintf@1.3.0
  x x x tqq json-schema@0.2.3
  x x x mqw verror@1.10.0
  x x x   mqq assert-plus@1.0.0
  x x mqw sshpk@1.13.1
  x x   tqq asn1@0.2.3
  x x   tqq assert-plus@1.0.0
  x x   tqq bcrypt-pbkdf@1.0.1
  x x   tqw dashdash@1.14.1
  x x   x mqq assert-plus@1.0.0
  x x   tqq ecc-jsbn@0.1.1
  x x   tqw getpass@0.1.7
  x x   x mqq assert-plus@1.0.0
  x x   tqq jsbn@0.1.1
  x x   mqq tweetnacl@0.14.5
  x tqq is-typedarray@1.0.0
  x tqq isstream@0.1.2
  x tqq json-stringify-safe@5.0.1
  x tqw mime-types@2.1.17
  x x mqq mime-db@1.30.0
  x tqq node-uuid@1.4.8
  x tqq oauth-sign@0.8.2
  x tqq qs@5.2.1
  x tqq stringstream@0.0.5
  x tqq tough-cookie@2.2.2
  x mqq tunnel-agent@0.4.3
  tqw request-progress@2.0.1
  x mqq throttleit@1.0.0
  mqw which@1.2.14
    mqq isexe@2.0.0

[root@SAKURA_VPS nichan]#

 

Selenium WebDriver サンプルプログラム

以下の Web サイトにアクセスをして情報を取得します。

 

http://pythonscraping.com/pages/javascript/ajaxDemo.html

 

このサイトの特徴は、最初の2秒間は下図のメッセージが表示されます。 

【Python】Python 3.6 & Selenium WebDriver & headless でスクレイピング

 

しかし、2秒後には Ajax により下図のサイトに切り替わります。

【Python】Python 3.6 & Selenium WebDriver & headless でスクレイピング

 

この2秒後に変わったページが本当に Web スクレイピングで取得したい情報です。

この2秒後の情報を Selenium WebDriver を利用すると取得することができます。

(pyenv) [test@SAKURA_VPS scraping]$ vi test_selenium.py

from selenium import webdriver
import time

driver = webdriver.PhantomJS(executable_path='/bin/phantomjs')
driver.get("http://pythonscraping.com/pages/javascript/ajaxDemo.html")
time.sleep(3)
print(driver.find_element_by_id("content").text)

driver.close() 

 

プログラム「test_selenium.py」を実行してみます。

(pyenv) [test@SAKURA_VPS scraping]$ python test_selenium.py
Here is some important text you want to retrieve!
A button to click!
(pyenv) [test@SAKURA_VPS scraping]$

 

見事、目的にデータを取得することができました。

 

 

シリーズ一覧

【Python】Python 3.6 & Selenium WebDriver & headless でスクレイピング【Part.1】

 

【Python】Python 3.6 & Selenium WebDriver & headless でスクレイピング【Part.2】

 

【Python】Python 3.6 & Selenium WebDriver & headless でスクレイピング【Part.3】

 

【Python】Python 3.6 & Selenium WebDriver & PhantomJS でスクレイピング(find系操作)【Part.4】

 

【Python】Python 3.6 & Selenium WebDriver & PhantomJS でスクレイピング(URLを引数で受け取る)【Part.5】

 

 

 

 

 

 

Posted by 100%レンタルサーバーを使いこなすサイト管理人