LoginSignup
10
4

More than 3 years have passed since last update.

Docker + Django + Beautifulsoup の環境構築&実行

Last updated at Posted at 2019-12-07

きっかけ

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で作りたいので、このまま進めていこうと思います。

10
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
4