こんにちは。阿形です。
Pythonを使ってWebスクレイピングをする方法について書いてみようと思います。
PythonによるWebスクレイピングには大きく分けて2つやり方があり、それぞれ以下のような特徴があります。
それぞれの長所、短所がちょうど裏返しの関係ですね。
ここではまず、これらいずれも実行できる環境の整備から書いていきます。
それぞれで最小限の環境としたほうがいいかもしれませんが、経験上、やっている途中で別の方法にスイッチしたくなったり、使い分けたい場合などがあるので、両方に対応できるようにしておいたほうが後々楽という考えからです。
説明で使用する環境について簡単にまとめておきます。
今回はGCP上にUbuntu18.04のインスタンスを立てます。
このやり方は使用するクラウドサービス等により異なるので割愛します。
それぞれのドキュメントを参照して設定してください。
Ubuntu18.04のインスタンスが準備できたら必要な設定を行います。
まずはOSのアップデートを行っておきます。
$ sudo apt update
$ sudo apt upgrade
GCPの場合、初期状態のタイムゾーンがUTCになっているので、調整しておきます。
$ sudo timedatectl set-timezone Asia/Tokyo
GUI環境やWebブラウザをインストールします。
ブラウザをヘッドレスモードで動かすことで、GUI環境がなくてもWebスクレイピングを行うことは可能ですが、GUI環境があったほうが実際の動作を目で確認できるので便利です。
また、私の経験上ですが、一部ページではヘッドレスモードでうまく動かないことがあるようなので、GUIで動かしたほうが確実です。
以下のコマンドを実行して、GUI環境としてxfce、Webブラウザとしてchromium、日本語ページを扱うためのフォントとしてnotoフォントをインストールします。
$ sudo apt install xfce4 xfce4-goodies vnc4server chromium-browser fonts-noto
今回クラウド上にインスタンスを立てているので、リモート作業用にVNCを設定します。(ローカルで設定している方は本項目のVNCの設定は不要です。次のPython環境の整備に進んでください。)
インストールしたVNC Serverを一度起動してみます。
起動するとパスワードの設定を促されるので設定します。
また起動の際に起動したユーザーのホームディレクトリに設定ファイルが自動生成されます。
$ vncserver
You will require a password to access your desktops.
Password:Verify:xauth: file /home/agata/.Xauthority does not exist
New 'scraping-test:1 (agata)' desktop is scraping-test:1
Creating default startup script /home/agata/.vnc/xstartupStarting applications specified in /home/agata/.vnc/xstartupLog file is /home/agata/.vnc/scraping-test:1.log
起動したvncserverを一旦終了します。コマンドに-killオプションで起動したディスプレイ番号を指定すると終了できます。起動時に何も指定していなければ以下のコマンドのとおりです。
$ vncserver -kill :1
Killing Xvnc4 process ID 14991
vncserverが終了したらホームディレクトリに生成された.vnc/xstartupを編集して、デスクトップ環境としてxfceが起動するように設定します。
以下の例のように、x-window-managerをコメントにし、末尾にexec startxfce4を追加します。
#!/bin/sh
# Uncomment the following two lines for normal desktop:
# unset SESSION_MANAGER
# exec /etc/X11/xinit/xinitrc
[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
xsetroot -solid grey
vncconfig -iconic &
#x-terminal-emulator -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &
#x-window-manager &
exec startxfce4
デフォルトのままだと解像度が低く、使い勝手が悪いので、/etc/vnc.confの設定を修正し画面を大きくします。
$geometry = "1920x1280";
$depth = "24"
以上でVNCの設定は終了です。
動作確認のため、改めてvncserverを起動します。
$ vncserver
GCPの場合、コンソールからVPCネットワーク>ファイアウォールルール画面、またはコマンドラインからファイアウォールルールの設定を行い、TCP ポート番号5901を許可するように設定します。
設定時に外部からすべて許可にするのもセキュリティ的にどうかと思いますので、ローカルのIPからのみ許可するなど、適宜工夫するようにしましょう。
pipでライブラリをインストールするので、まずはPython3用のpipをインストールします。
$ sudo apt install python3-pip
必要なパッケージをpipでインストール します。
最初に書いた2つの方法両方に対応するため、以下のコマンドでパッケージをインストールします。
これらパッケージはそれぞれ以下のような機能を持っています。
$ pip3 install requests selenium chromedriver-binary bs4
インストールができたら、Chromiumが実際にPythonから起動できるか試してみましょう。
Chromiumのウィンドウが開くので、GUIを使用します。ローカルの方はGUI環境でログイン、VNCを設定した方は適当な端末からVNCでインスタンスに接続します。
ターミナルを開いてPythonの対話モードで以下のように入力してみましょう。
$ python3
Python 3.6.7 (default, Oct 22 2018, 11:32:17)
[GCC 8.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> from selenium import webdriver
>>> from selenium.webdriver.chrome.options import Options
>>> import chromedriver_binary
>>> options = Options()
>>> options.binary_location = '/usr/bin/chromium-browser'
>>> driver = webdriver.Chrome(options=options)
問題なければ、Chromiumのウィンドウが開くと思います。
以上で環境設定は完了です。
次回は実際のスクレイピングのやり方について書いていこうと思います。