【ふくだ学習録】アプリ制作part6【33日目】

# ふくだ学習録とは？
ふくだが学習したことの備忘録。
目に見える形で残すことによってやる気を出す個人的な作戦です。
他人に見せるように書いているわけではないので、すごく読みにくいです。

### 読了した本
[データベースエンジニア養成読本 [DBを自由自在に活用するための知識とノウハウ満載!]](https://www.amazon.co.jp/dp/4774158062/ref=cm_sw_r_tw_dp_U_x_FPphEbQFPPQRM )
[ゼロから作るDeepLearning](https://www.amazon.co.jp/dp/4873117585/ref=cm_sw_r_tw_dp_U_x_y3UiEbF3P6EG7)
[PHPフレームワーク CakePHP 3入門](https://www.amazon.co.jp/dp/4798048577/ref=cm_sw_r_tw_dp_U_x_.YIjEbS1K4JY2)
[SQLアンチパターン](https://www.amazon.co.jp/dp/4873115892/ref=cm_sw_r_tw_dp_U_x_XlokEbJQK2N7P )
[Docker入門](https://www.amazon.co.jp/dp/480071091X/ref=cm_sw_r_tw_dp_U_x_xVlmEbN8ZTHZK)


### 今読んでいる本

なし

# アプリ制作

### テーブル設計
終了。
userに紐付くテーブル設計は、アプリ有料化（というか無料ユーザーと有料ユーザーの機能差の作成）をしていく時でいいかなと思ったので、一旦放置。

### スクレイピングサーバーの作成
今回はscrapyを選択。scrapyを選択した理由は、下記。

- pythonほぼ触ったことないから触ってみたい。
- tensflowの時にpython触るだろうから、先に触れておきたい。
- BeautifulSoupはライブラリで、scrapyはフレームワークなので、scrapyに慣れておいたほうが、今後スクレイピングする際に応用ききそう。（語彙力の無さ）

ざっくりしたscrapy概要は下記。
[10分で理解する Scrapy](https://qiita.com/Chanmoro/items/f4df85eb73b18d902739)

### scrapyをdocker上で構築

まずはpython3の公式イメージを使用したりして。dockerfile書いていく。
参考にしたのは下記記事。

[Python, scrapy でお祭りスクレイピング](https://qiita.com/takecore@github/items/35905779504016085801)

実際に用意するファイルは下記の2つ。Dockerfileとpip_requirements.txt。

```txt:pip_requirements.txt
# Production
# =============================================================================
scrapy==1.8.0


# Development
# =============================================================================
flake8==3.3.0 # Pythonの文法チェックツール
flake8-mypy==17.3.3 
mypy==0.511 #pythonの型チェックツール
```

```dockerfile:Dockerfile
# Linuxはalpineを使用する。理由は軽いから、
FROM python:3.6-alpine

RUN apk add --update --no-cache \　# apkはAPK(アルパインのパッケージ管理ソフト)のコマンド
    build-base \　
    python-dev \
    zlib-dev \
    libxml2-dev \
    libxslt-dev \
    openssl-dev \
    libffi-dev

# ADDコマンドでpip_requirements.txtファイルをコンテナにADD
ADD pip_requirements.txt /tmp/pip_requirements.txt 
# ライブラリをインストール
RUN pip install -r /tmp/pip_requirements.txt

# appディレクトリ配下へ移動
ADD ./app /usr/src/app
WORKDIR /usr/src/app
```
※`python-dev`〜`libffi-dev`まではalpine使用している関係で、ライブラリが足りてなくて足している（っぽい）
下記記事ではUbuntuで構築しているパターンだが、Ubuntuでも数個ライブラリが足りていないっぽい。（alpineならもっと足りてなくてもまぁ違和感はない。）
[【Python】スクレイピング用フレームワークScrapyの練習環境をDockerで構築する【Docker】](https://naruport.com/blog/2019/9/30/python-build-scrapy-env-by-docker/)
 
[Alpine Linux で Docker イメージを劇的に小さくする](https://qiita.com/asakaguchi/items/484ba262965ef3823f61)


### docker-composeで起動したコンテナを起動状態のままにする方法。
今回scrapyアプリケーションを作成するために、コンテナに入り`scrapy startproject scraping .`といったコマンドを入力する必要がありました。

参考にした記事（[Python, scrapy でお祭りスクレイピング](https://qiita.com/takecore@github/items/35905779504016085801)）では`docker run`でコンテナを起動状態にして、`docker exec`してコマンド入力していたが、docker-composeでやると、コンテナが止まってしまい、コマンド入力できなかった。

他にも解決方法はあったかもしれないが、今回はdocker-compose.ymlに下記のオプションを記載することで、コンテナの起動状態保ち、`docker exec`できるようにした。（このパターンたどり着くまでに結構時間食ってしまった。。）

```yml:docker-compose.yml
version: '2'
services:
  scrapy:
    tty: true # このオプションが必要
```

### scrapy設定
このサイトと、[公式ドキュメント](https://scrapy-ja.readthedocs.io/ja/latest/index.html)を参考にして実装していっている。

[10分で理解する Scrapy](https://qiita.com/Chanmoro/items/f4df85eb73b18d902739)

# 今日の一言
参考にしていたサイトのスクレイピングはできたが、実際にスクレイピングしたいサイトの情報が取得できなかった。

現時点では推測だが、
①設定が間違っている（自分の記載間違い）
②そもそもサイト側でスクレイピング（クローリング）を拒否する対策をしている。（具体的な手法は分からないが）
上記のどちらかで取得できていない。

①の設定間違い（単純なtypo）の可能性もあるけど、なんとなく②な気がしているので、明日はスクレイピング対策などについてちょっと調べてみる。（ここが突破できなければ、アプリ構想がおじゃんなので乗り越えたい。）