リモート開発メインのソフトウェア開発企業のエンジニアブログです

GUIありのWebスクレイピングを定期実行する

GUIありのWebスクレイピングというのは、バックグラウンドではなく実際にGUIでブラウザが立ち上がって、まるでゴーストが勝手にボタンを押しているかのように自動でWeb画面が遷移していくという手法のことを指します。

オンプレミスLinuxサーバーであれば環境の構築はそこまで大変ではないかもしれませんが、AWS EC2のようなクラウド上のLinuxで同じことをやろうとすると少し手間がかかりますので手順を残しておきたいと思います。

環境

以下のような構成でEC2を立ち上げて、EC2上でWebスクレイピングを行います。Workspacesは仕事上の都合で開発環境として使っていますが、実はこれがEC2のGUIアプリを起動する際の肝となりますので後ほど説明します。

自分のMac book pro -> Amazon Workspaces -> EC2

  • Ubuntu Server 18.04 LTS(EC2のOS)
  • Python 3.6

EC2インスタンスの作成

最新のUbuntu Server 18のAMIからインスタンスを作成します。ストレージは20GBあればとりあえずは足ります。

EC2にSSH

Mac book proのWorkspacesアプリで開発環境にログイン後、ターミナルを開いて上記EC2インスタンスに接続します。以降、このSSHしたUbuntu Serverに必要なパッケージ等をインストールします。

ssh -A ubuntu@10.125.XX.XX

Python3のインストール

存在しない場合はインストールします。

sudo apt install python3    # インストール済みなら不要
python3 -V

pipのインストール

存在しない場合はインストールします。

sudo apt-get install libpython3.6-stdlib
sudo apt-get install python3-distutils
curl -kL https://bootstrap.pypa.io/get-pip.py | sudo python3 

パッケージのインストール

スクレイピングに必要なパッケージをインストールします。スクレイピング構成に応じて必要なパッケージは変わると思いますので、不足しているパッケージがある場合は各自で追加する必要があります。

sudo pip install boto3
sudo pip install beautifulSoup4
sudo pip install selenium

xrdpのインストール

Ubuntu ServerにGUIでログインできるようにするため、リモートデスクトップを可能にするxrdpをインストールします。

sudo apt-get install libnss3-dev
sudo apt install libgconf2-4
sudo apt-get install -y libappindicator1 fonts-liberation libasound2 libnspr4 libnss3 libxss1 lsb-release xdg-utils
sudo apt-get update
sudo apt-get install lxde-core
sudo apt-get install xrdp

ログインの設定

リモートデスクトップするためにパスワードとx-session-managerの設定をします。

sudo passwd ubuntu
sudo update-alternatives --config x-session-manager
# 4 /usr/bin/startlxde 50 を選択

dockerのIPアドレスを変更

今の時点でこの設定をする必要はないですが、スクレイピングを動かしてIPアドレスがかぶった場合は変更する必要がありますので、一応載せておきます。

sudo systemctl stop docker
sudo ip link set dev docker0 down
sudo brctl delbr docker0
sudo vi /etc/docker/daemon.json
sudo systemctl start docker

daemon.jsonは以下ようになっているので、IPを被らないものに変更します。

{
    "bip": "172.18.0.1/24"
}

Pythonのコードをデプロイ

sample01.pyの中身は以下の記事が参考になります。今回やろうとしていることは以下の記事でスクレイピングできなかったサイトを定期実行するということになります。

/home/ubuntu/
        ├ start_scraping.sh
        ├ start_scraping_total.sh
        └ sample-project/
            ├ sample01/
                ├ sample01.py
                └ bin/
                    └ chromedriver

start_scraping.shの中身はこんな感じです。sample01.pyを実行するだけのスクリプトです。

#!/bin/sh
echo "start"

cd sample-scraping

cd sample01
date
selected_stage=pro scraping_mode=normal user_password=???????? python3 sample01.py 
date

echo "end"

freerdpのインストール、実行

Workspacesにリモートデスクトップのクライアントとして機能するfreerdpをインストールします。インストール後接続を行い、GUI画面が表示され、以下のようにWindowが3層構造になります。

sudo yum install freerdp
xfreerdp -u ubuntu -p ???????? 10.125.XXX.XXX

GUIありのchromeをインストール

firefoxをインストール後に以下をfirefoxでダウンロードするか、wgetコマンドで直接ダウンロードしても良いです。

  • chrome Version 75.0.3770.100 (Official Build) (64-bit)
  • chromedriver 2.37.544315
sudo apt-get install firefox

chrome、chromedriverをインストールします。chromedriverは上記のデプロイ先のbinディレクトリに配置します。

sudo dpkg -i ~/Downloads/google-chrome-stable_current_amd64.deb
unzip chromedriver_linux64.zip 

cronに起動スクリプトを登録

Ubuntu Serverにはデスクトップ環境(GUI)に関連するパッケージをインストールしていないため、Workspacesのディスプレイ番号を使ってcronからGUIアプリ(chrome)を起動します。

freerdpでリモートデスクトップした状態で以下のコマンドを実行して、ディスプレイIDを取得します。Workspacesのディスプレイ番号は10.0のようです。

xdpyinfo |grep display

start_scraping.shがディスプレイ番号10.0で起動するようにcrontabコマンドで登録します。

crontab -e

登録内容は以下のような感じです。

0   15 *   *   *     DISPLAY=:10 /home/ubuntu/start_scraping.sh 1> /home/ubuntu/start_scraping.log 2> /home/ubuntu/start_scraping.log
0   9  1,2 *   *     DISPLAY=:10 /home/ubuntu/start_scrapin_totalg.sh 1> /home/ubuntu/start_scraping_total.log 2> /home/ubuntu/start_scraping_total.log

Ubuntu Serverにデスクトップ環境(GUI)関連のパッケージをインストールすることでも実現可能だとは思いますが、今回はWorkspacesを使用することで少し簡素化して実装しました。

まとめ

AWS LambdaでWebスクレイピングできなかったサイトの自動化を無事達成することができました。AWS LambdaもしくはEC2を用いたこの手法で大体のスクレイピングは自動化できると思いますので、ぜひ試してみてください。

← 前の投稿

社内勉強会が活発になってきた

次の投稿 →

Rails 6からActiveRecordのAssociationはscopingの影響を受けなくなっている件と対処法

コメントを残す