スクレイピングとは
クローラーとスクレイピングは似たようなことをするので混同されてしまいますが、大きく違いがあります。
クローラーとは自動的にWebページの情報を収集して回るプログラムのことをいいます。そしてスクレイピングは、やはり自動的にWebページの情報を収集して回りますが、それに留まらずに収集した情報を解析して必要な情報だけを収集することをいいます。
スクレイピングする際に守らなければならない事は、収集するWebサイトの規約を守ることやサーバーの負荷を考慮して適切なアクセス回数にすることなど気を配る必要があります。また、著作権の問題も出てきますので収集したものを無条件に公表することは避けなければなりません。
seleniumを使用してブラウザの操作
今回使用するライブラリはseleniumを使用します。これはブラウザを操作するためのライブラリです。
seleniumだけではブラウザを操作することはできません。操作するためのブラウザのドライバを導入しておく必要があります。
また、画像を処理するためには別途、画像処理ライブラリPillowを導入する必要があります。これはリサイズや回転、トリミングなどを行うことができるものです。
Pythonでスクレイピングするためには通常seleniumを導入しておきます。
ライブラリのインストール
seleniumをインストールするには。pip3を使います。
pip3 install selenium
次にPillowのインストールを行います。こちらもpip3で導入します。
pip3 install pillow
seleniumとPillowの導入が終わるとJupyter Notebookでブラウザを操作します。
まずはseleniumのインポートを行います。
from selenium import webdriver
次にPillowのインポートを行います。
from PIL import Image
次に、FirefoxやChromeをPythonで呼び出します。
Firefoxの呼び出し
Pythonで呼び出すには、gekodriverが導入する必要があります。Macの場合は、ターミナルに以下コマンドでインストールします。
brew install geckodriver
もしエラーが出たら、それはHomebrewの書き込み時に書き込み権限がないと言われるエラーの場合があります。その場合「sudo chown -R $(whoami) /usr/local/include /usr/local/lib /usr/local/lib/pkgconfig /usr/local/share/man/man3」などとアドバイスが表示されていますのでそれを実行すると解決すると思います。
これでFirefoxを開くことができます。
jupyter notebookには次の通り記述します。
browser = webdriver.Firefox()
Chromeの呼び出し
同様にChromeのドライバも導入しておきます。ターミナル以下を実行します。
brew install chromedriver
Chromeの起動は以下をjupyter notebookに入力します。
browser = webdriver.Chrome()
アドレスを指定してブラウザを開く場合は次のように指定します。
browser.get('https://itstudio.co')
ブラウザを閉じる時は次のようにします。
browser.quit()
h1要素のテキストを取得する
それではIT工房のTOPページのh1要素からそのテキストを取得してみます。
もう一度、新規でJupyter Notebookを開きます。
seleniumのインポートからJupyter Notebookに記述していきます。今回は画像の取得はありませんので、Pillowのインポートは省きます。
from selenium import webdriver
続いて、ChromeブラウザをPythonから開きます。
browser = webdriver.Chrome()
PythonからIT工房のアドレスを呼び出します。
browser.get('https://itstudio.co')
IT工房TOPページのh1の情報を取得します。これはJavaScriptのDOM操作によく似ています。要素の取得方法にはidを指定する以外にも様々な方法があります。これらの方法は別途説明します。
elem_h1 = browser.find_element_by_id('logo')
取得したh1要素のテキストをJupyter Notebookに表示させます。
elem_h1.text
もっとも簡単なスクレイピングの例で通常のページから特定の要素内容を取得する例でした。