第10章 ScrapyとRaspberry Pi
ここでは、Raspberry Piのセットアップ、Scrapyのインストール、MariDBのインストール、IPアドレスの固定、SSHとVNCでの接続、VS CODEのインストールの作業をはじめに行います。そして、実際に、Scrapyで作ったクローラーをRaspberry Piで定期的に実行する方法をまとめておきます。
Raspberry Pi、Python3、Scrapyのバージョンは下記の通りです。
[email protected]:~ $ cat /etc/issue
Raspbian GNU/Linux 10
[email protected]:~ $ python3 -V
Python 3.7.3
[email protected]:~ $ scrapy -V
Scrapy 1.5.1 - no active project
お金さえあれば、AWSの製品とか、GCP製品で環境構築して常時稼働させて、クローラーを実行すればいいんだろうけど、そんなお金ないので、家に転がっていたRaspberry Piを使います。
ここで書く必要も無いかもしれませんが、まとめておきます。まずは購入したRaspberry Piにフォーマット済みのSDカードとRaspberry Pi Imagerを使って、Raspbianをインストールしていきます。RaspbianはLinuxのディストリビューションであるDebianをベースにしているOSなので、似たような操作感で操作ができます。
SDカードをRaspberry Piに差し込み、電源を起動すると、Raspberry Piが起動します。設定ウィザードが表示されるので、順に従って設定します。
- 1.Set Countryでは、「日本」を設定しておきます。
- 2.Change Passwordでは、パスワードは初期設定のままだと「pi / raspberry」になっているので、よしなに修正します。
- 3.Set Up Screenが表示されるので、スクリーンの端に黒い線が表示されているのであればチェックボックスにチェックをいれます。
- 4.Select WiFi NetWorkでは、WiFiのネットワークを設定します。
- 5.Update Softwareでは、アップデートしておきます。
- 6.再起動します。
再起動後、「Raspberry Piマーク > 設定 > Raspberry Piの設定」と進み、

「インターフェース」のSSH、VNCを有効にします。これでSSHとVNCでアクセスができます。

Interface
ここからはScrapyとMySQLをインストールしていきます。Raspberry PiにはPython3がすでにインストールされているので、Scrapyをインストールします。あわせてPyMySQLをインストールしておきます。
[email protected]:~ $ sudo apt-get update
[email protected]:~ $ sudo apt-get upgrade
[email protected]:~ $ sudo apt-get install python-scrapy
~~~~~~
略
~~~~~~
[email protected]:~ $ pip3 install PyMySQL
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting PyMySQL
Using cached https://files.pythonhosted.org/packages/ed/39/15045ae46f2a123019aa968dfcba0396c161c20f855f11dea6796bcaae95/PyMySQL-0.9.3-py2.py3-none-any.whl
Installing collected packages: PyMySQL
Successfully installed PyMySQL-0.9.3
次はMySQLです。正確にはMariaDBですが、MariaDBはMySQLから派生したもので、非常に互換性も高く、細かい部分を除けばMySQLと同じような操作感で使用できます。
$ sudo apt-get install mariadb-server
$ sudo mysql_secure_installation
~~~~~
設定内容は省略
~~~~~
とりあえずテスト用のDB
test_db
とテスト用のユーザーuser01
を作成します。$ sudo mysql -u root -p
password : ******
MariaDB [(none)]> CREATE DATABASE test_db;
MariaDB [(none)]> CREATE USER 'user01'@'localhost' IDENTIFIED BY 'user01';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON test_db.* TO 'user01'@'localhost';
MariaDB [(none)]> FLUSH PRIVILEGES;
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test_db |
+--------------------+
4 rows in set (0.001 sec)
MariaDB [(none)]> USE mysql;
MariaDB [mysql]> SELECT USER, HOST FROM mysql.user;
+--------+-----------+
| USER | HOST |
+--------+-----------+
| root | localhost |
| user01 | localhost |
+--------+-----------+
2 rows in set (0.001 sec)
cronの設定を行います。下記コンフィグファイルを開き、cronがコメントアウトされているので、
#
を削除してcronを使えるようにします。[email protected]:~ $ sudo apt-get install vim
[email protected]:~ $ sudo vim /etc/rsyslog.conf
###############
#### RULES ####
###############
#
# First some standard log files. Log by facility.
#
auth,authpriv.* /var/log/auth.log
*.*;auth,authpriv.none -/var/log/syslog
cron.* /var/log/cron.log
daemon.* -/var/log/daemon.log
kern.* -/var/log/kern.log
lpr.* -/var/log/lpr.log
mail.* -/var/log/mail.log
user.* -/var/log/user.log
テキストエディタとしてVS CODEを入れておきます。
[email protected]:~ $ sudo -s
[email protected]:/home/pi# . <( wget -O - https://code.headmelted.com/installers/apt.sh )
[email protected]:~# su pi
下記のコマンドでVS CODEを起動できます。
[email protected]:~ $ code-oss

試しにデスクトップに
hello.py
を作成して実行してみます。[email protected]:~ $ python3 ~/Desktop/hello.py
Hello Python From VS CODE
最後にSSHでログインできるか確認しておきます。まずは、下記の
ip addr
コマンドでipアドレスを調べ、ipアドレスが定期的に変動しないようにを固定します。[email protected]:~ $ ip addr | grep 192
inet ***.***.*.**/24 brd ***.***.*.** scope global dynamic noprefixroute wlan0
ip_address
の部分は固定した番号に変更してください。[email protected]:~ sudo vim /etc/dhcpcd.conf
# 下記を末尾に追加します。
interface wlan0
static ip_address=192.168.*.**/24
static routers=192.168.1.1
static domain_name_servers=192.168.1.1
再起動して、ipアドレスを確認します。固定した番号が表示されるはずです。
[email protected]:~ $ ip addr | grep 192
inet ***.***.*.**/** brd ***.***.*.*** scope global noprefixroute wlan0
この作業のあとにブラウザからインターネットにアクセスできないようになっている場合は下記のコマンドで修正します。
$ sudo dhclient wlan0
SSHでターミナルからログインします。
$ ssh [email protected]***.***.*.**
[email protected]***.***.*.**'s password:
Linux raspberrypi 4.19.118-v7l+ #1311 SMP Mon Apr 27 14:26:42 BST 2020 armv7l
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Mon Jun 8 16:55:34 2020 from ***.***.*.**
[email protected]:~ $ cat /etc/issue
Raspbian GNU/Linux 10
問題なくSSHでもアクセスできるようになっています。もう1つ試しておきます。それは
scp
コマンドです。このコマンドはローカルのデータをSSH経由でサーバーに転送するコマンドです。Raspberry Pi側でScrapyのクローラーを作っても良いのですが、少し重たいので、手元のPCで作ったものをディレク トリごと、Raspberry Piに転送してクローラーを起動させることにします。もちろん、Git経由でも他の方法でも、転送できれば何でも良いです。-r
のオプションをつけるとディレクトリをコピーすることができます。ここでは、crawl.py
を格納しているscrapy_scp
というディレクトリを丸ごと Raspberry Piのデスクトップに転送します。➜ scp -r ~/Desktop/scrapy_scp [email protected]***.***.*.**:~/Desktop/
[email protected]***.***.*.**'s password:
crawl.py 100% 0 0.0KB/s 00:00
Raspberry Pi側で確認しておきます。デスクトップに
scrapy_scp
というディレクトリが作られ、crawl.py
も保存されています。反対にRaspberry Piのデータをもらう場合は下記のように書きます。ここでは、Raspberry PiのDesktopにある
excute.log
というデータをローカルのデスクトップに転送する例です。$ scp [email protected]***.***.*.**:~/Desktop/execute.log ~/Desktop/
これ以降は環境にあわせて、Raspberry Piを設定してください。GUIからCUIに変更するには、「Raspberry Piマーク > 設定 > Raspberry Piの設定」と進み、「システム」からブートをCLIにしてから再起動します。

再起動後はCLIになります。戻すためには下記の通り設定します。
$ sudo raspi-config
3 Boot Options
→ B1 Desktop / CLI
→→ B4 Desktop Autologin Desktop GUI, automatically logged in as 'pi' user
5 Interfacing Options
→ P3 VNC ⇒ Enable
7 Advanced Options
→ A5 Resolution
→→ モニタの解像度の設定
データベースにテストでインサートできるかを確認しておく。まずはデータベースにログインし、下記の通り、テスト用のテーブルを先程作成した
test_db