きっかけ
Dockerを使った開発が基本になってきているが、Dockerを使った開発環境の構築をしたことがなかった。
→ Docker
Pythonからプログラミングを始めたが、Pythonを使って何かを作ったことがなかったので、何か作ってみたかった。
→ Django
スクレイピングを使ったサービスを作ってみたい&Pythonでスクレイピングがしたい。
→ Beautifulsoup
Docker
まずはDockerfileとdocker-compose.ymlを作成。
Dockerfile
FROM python:3.6
RUN mkdir /app
WORKDIR /app
ADD requirements.txt /app
RUN pip install -r requirements.txt
ADD ./backend /app
docker-compose.yml
version: '2'
services:
db:
image: postgres
web:
build: .
command: python manage.py runserver 0.0.0.0:8000
volumes:
- ./backend:/app
ports:
- "8000:8000"
depends_on:
- db
ここではデータベースにPostgreSQLを使用する。
requirements.txt
Django
psycopg2
beautifulsoup4
requirements.txtを使ってDjango、Beautifulsoupをインストールする。
コンテナの起動
① Dockerイメージをビルドする。
docker-compose build
② Djangoの慣習に則ってconfigという名前でルートのプロジェクトを作成する。
docker-compose run --rm web django-admin startproject config .
③ コンテナを起動する準備が整ったので、下記のコマンドを実行する。
docker-compose up
http://localhost:8000/ にアクセスするとDjangoの初期画面が表示される。
Django
Djangoでは「myapp」というアプリケーションを作成し、viewからBeautifulsoupを使う。
アプリケーションの作成
docker-compose run --rm web python manage.py startapp myapp
これを実行すると、myappアプリケーションのディレクトリが作成される。
URLの設定
先ほど作成したmyapp/urls.pyにアプリケーションのurlを定義し、それをconfig/urls.pyから呼び出せるように設定する。
myapp/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
]
config/urls.py
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path('myapp/', include('myapp.urls')),
path('admin/', admin.site.urls)
]
これで http://localhost:8000/myapp/ にアクセスすると「views」の「index」が呼ばれるが、まだ何も定義していないため「index」を作成する。
Viewの作成
myapp/views.py
from django.shortcuts import render
def index(request):
return render(request, 'myapp/index.html')
これで先ほどのURLにアクセスするとこのメソッドが呼ばれるようになったけど、まだ「index.html」がないため作成する。
Templateの作成
Djangoでテンプレートを作成するときは、アプリケーション以下に「templates」ディレクトリを作り、その中に個々のテンプレートを作成していく。
myapp/templates/myapp/index.html
<h1>Hello Django</h1>
これでやっと「Hello Django」と書かれた画面が表示される。
Beautifulsoup
Beautifulsoupを使うとHTMLやXMLから特定のデータを抽出することができる。
ViewからBeautifulsoupを使用する
myapp/views.py
from django.shortcuts import render
from bs4 import BeautifulSoup
import urllib.request
def index(request):
# 対象サイトのURL
url = "http://www.nikkei.com/"
# スクレイピング
response = urllib.request.urlopen(url)
html = response.read()
soup = BeautifulSoup(html)
# 全てのaタグを抽出
links = soup.find_all('a')
# テンプレートに渡すデータを格納
context = {
'links': links,
}
return render(request, 'myapp/index.html', context)
myapp/templates/myapp/index.html
{{ links }}
これで対象サイトから全てのaタグを抽出し、画面に表示することができているはず。
終わりに
とりあえずDockerでDjangoの開発環境を構築し、Beautifulsoupを使うことができた。
まだPostgreSQLは使っていないし、DjangoはAPIとして使いたいし、フロント側はReactで作りたいので、このまま進めていこうと思います。